package ca.carleton.gcrc.atlas.tracks.conversion;

import java.net.URL;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.UnsupportedAudioFileException;

import ca.carleton.gcrc.atlas.logger.Logger;

import javazoom.spi.vorbis.sampled.convert.VorbisFormatConversionProvider;
import javazoom.spi.vorbis.sampled.file.VorbisAudioFileReader;

public class OggVorbisConverter implements InternalConverter {
	private Logger logger = Logger.forClass(this.getClass());
	
	static private OggVorbisConverter converter = new OggVorbisConverter();
	
	static public OggVorbisConverter createInstance() {
		// Singleton
		return converter;
	}
	
	private OggVorbisConverter() {
		
	}

	public AudioInputStream getAudioInputStream(URL url) {
		try {
			VorbisAudioFileReader vReader = new VorbisAudioFileReader();
			AudioInputStream inputStream = vReader.getAudioInputStream(url);
			return(inputStream);
		} catch (UnsupportedAudioFileException exNotOgg) {
			// do nothing
		} catch (Exception exOggGeneral) {
			logger.error("getAudioInputStreamFromUrl: Unknown error when attempting to open input stream as ogg vorbis: " + url,exOggGeneral);
		}
		return null;
	}

	/* (non-Javadoc)
	 * @see ca.carleton.gcrc.atlas.tracks.conversion.InternalConverter#getAudioInputStream(javax.sound.sampled.AudioFormat, javax.sound.sampled.AudioInputStream)
	 */
	public AudioInputStream getAudioInputStream(AudioFormat format, AudioInputStream inStream) {
		try {
			VorbisFormatConversionProvider vCp = new VorbisFormatConversionProvider();
			AudioInputStream convertedStream = vCp.getAudioInputStream(format, inStream);
			return convertedStream;
		} catch (IllegalArgumentException exVorbisIAE) { // Vorbis decoder not appropriate - try Mpeg!
			// do nothing
		} catch (Exception exVorvis) {
			logger.error("tryBundledConversionProviders: unknown error when converting non-PCM audio using ogg vorbis converter.",exVorvis);
		}
		return null;
	}
}
