/*
 *	TAudioConfig.java
 *
 *	This file is part of Tritonus: http://www.tritonus.org/
 */

/*
 *  Copyright (c) 1999 - 2004 by Matthias Pfisterer
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU Library General Public License as published
 *   by the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU Library General Public License for more details.
 *
 *   You should have received a copy of the GNU Library General Public
 *   License along with this program; if not, write to the Free Software
 *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */

package org.tritonus.core;

import java.util.Set;
import java.util.Iterator;

import javax.sound.sampled.Mixer;

import javax.sound.sampled.spi.AudioFileWriter;
import javax.sound.sampled.spi.AudioFileReader;
import javax.sound.sampled.spi.FormatConversionProvider;
import javax.sound.sampled.spi.MixerProvider;

import org.tritonus.share.TDebug;
import org.tritonus.share.ArraySet;
import org.tritonus.core.TInit.ProviderRegistrationAction;


/** TODO:
 */
public class TAudioConfig
{
	private static Set<AudioFileWriter>		sm_audioFileWriters = null;
	private static Set<AudioFileReader>		sm_audioFileReaders = null;
	private static Set<FormatConversionProvider>	sm_formatConversionProviders = null;
	private static Set<MixerProvider>		sm_mixerProviders = null;

	private static Mixer.Info	sm_defaultMixerInfo;



	/** Constructor to prevent instantiation.
	 */
	private TAudioConfig()
	{
	}


	private static void registerAudioFileReaders()
	{
		ProviderRegistrationAction	action = null;
		action = new ProviderRegistrationAction()
			{
				public void register(Object obj)
					throws Exception
					{
						AudioFileReader	provider = (AudioFileReader) obj;
						TAudioConfig.addAudioFileReader(provider);
					}
			};
		TInit.registerClasses(AudioFileReader.class, action);
	}



	private static void registerAudioFileWriters()
	{
		ProviderRegistrationAction	action = null;
		action = new ProviderRegistrationAction()
			{
				public void register(Object obj)
					throws Exception
					{
						AudioFileWriter	provider = (AudioFileWriter) obj;
						TAudioConfig.addAudioFileWriter(provider);
					}
			};
		TInit.registerClasses(AudioFileWriter.class, action);
	}



	private static void registerFormatConversionProviders()
	{
		ProviderRegistrationAction	action = null;
		action = new ProviderRegistrationAction()
			{
				public void register(Object obj)
					throws Exception
					{
						FormatConversionProvider	provider = (FormatConversionProvider) obj;
						TAudioConfig.addFormatConversionProvider(provider);
					}
			};
		TInit.registerClasses(FormatConversionProvider.class, action);
	}



	private static void registerMixerProviders()
	{
		ProviderRegistrationAction	action = null;
		action = new ProviderRegistrationAction()
			{
				public void register(Object obj)
					throws Exception
					{
						MixerProvider	provider = (MixerProvider) obj;
						TAudioConfig.addMixerProvider(provider);
					}
			};
		TInit.registerClasses(MixerProvider.class, action);
	}


	////////////////////////////////////////////////////////////////


	public static synchronized void addAudioFileReader(AudioFileReader provider)
	{
		getAudioFileReadersImpl().add(provider);
	}



	public static synchronized void removeAudioFileReader(AudioFileReader provider)
	{
		getAudioFileReadersImpl().remove(provider);
	}



	public static synchronized Iterator<AudioFileReader> getAudioFileReaders()
	{
		return getAudioFileReadersImpl().iterator();
	}



	private static synchronized Set<AudioFileReader> getAudioFileReadersImpl()
	{
		if (sm_audioFileReaders == null)
		{
			sm_audioFileReaders = new ArraySet<AudioFileReader>();
			registerAudioFileReaders();
		}
		return sm_audioFileReaders;
	}



	public static synchronized void addAudioFileWriter(AudioFileWriter provider)
	{
		getAudioFileWritersImpl().add(provider);
	}



	public static synchronized void removeAudioFileWriter(AudioFileWriter provider)
	{
		getAudioFileWritersImpl().remove(provider);
	}



	public static synchronized Iterator<AudioFileWriter> getAudioFileWriters()
	{
		return getAudioFileWritersImpl().iterator();
	}



	private static synchronized Set<AudioFileWriter> getAudioFileWritersImpl()
	{
		if (sm_audioFileWriters == null)
		{
			sm_audioFileWriters = new ArraySet<AudioFileWriter>();
			registerAudioFileWriters();
		}
		return sm_audioFileWriters;
	}



	public static synchronized void addFormatConversionProvider(FormatConversionProvider provider)
	{
		getFormatConversionProvidersImpl().add(provider);
	}



	public static synchronized void removeFormatConversionProvider(FormatConversionProvider provider)
	{
		getFormatConversionProvidersImpl().remove(provider);
	}



	public static synchronized Iterator<FormatConversionProvider> getFormatConversionProviders()
	{
		return getFormatConversionProvidersImpl().iterator();
	}



	private static synchronized Set<FormatConversionProvider> getFormatConversionProvidersImpl()
	{
		if (sm_formatConversionProviders == null)
		{
			sm_formatConversionProviders = new ArraySet<FormatConversionProvider>();
			registerFormatConversionProviders();
		}
		return sm_formatConversionProviders;
	}



	public static synchronized void addMixerProvider(MixerProvider provider)
	{
		getMixerProvidersImpl().add(provider);
	}



	public static synchronized void removeMixerProvider(MixerProvider provider)
	{
		getMixerProvidersImpl().remove(provider);
	}



	public static synchronized Iterator<MixerProvider> getMixerProviders()
	{
		return getMixerProvidersImpl().iterator();
	}


	private static synchronized Set<MixerProvider> getMixerProvidersImpl()
	{
		if (sm_mixerProviders == null)
		{
			sm_mixerProviders = new ArraySet<MixerProvider>();
			registerMixerProviders();
		}
		return sm_mixerProviders;
	}



	// TODO: a way to set the default mixer
	public static Mixer.Info getDefaultMixerInfo()
	{
		return sm_defaultMixerInfo;
	}

}



/*** TAudioConfig.java ***/
