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.mpeg.sampled.convert.MpegFormatConversionProvider;
import javazoom.spi.mpeg.sampled.file.MpegAudioFileReader;

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

	public AudioInputStream getAudioInputStream(URL url) {
		try {
			MpegAudioFileReader mReader = new MpegAudioFileReader();
			AudioInputStream inputStream = mReader.getAudioInputStream(url);
			return inputStream;
		} catch (UnsupportedAudioFileException exNotMpeg) {
			// do nothing
		} catch (Exception exMpegGeneral) {
			logger.error("getAudioInputStreamFromUrl: Unknown error when attempting to open input audio stream as mpeg: " + url,exMpegGeneral);
		}
		
		return null;
	}

	public AudioInputStream getAudioInputStream(AudioFormat format, AudioInputStream inStream) {
		try {
			MpegFormatConversionProvider mCp = new MpegFormatConversionProvider();
			AudioInputStream convertedStream = mCp.getAudioInputStream(format, inStream);
			return convertedStream;
		} catch (IllegalArgumentException exMpegIAE) { // Vorbis decoder not appropriate - try Mpeg!
			// do nothing
		} catch (Exception exMpeg) {
			logger.error("tryBundledConversionProviders: unknown error when converting non-PCM audio using mp3 converter",exMpeg);
		} 
		return null;
	}
}
