package ch.retorte.intervalmusiccompositor.decoder; import java.io.File; import java.io.IOException; import java.util.Collection; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.UnsupportedAudioFileException; import org.kc7bfi.jflac.sound.spi.FlacAudioFileReader; import org.kc7bfi.jflac.sound.spi.FlacFormatConversionProvider; import ch.retorte.intervalmusiccompositor.spi.audio.AudioStandardizer; import ch.retorte.intervalmusiccompositor.spi.decoder.AudioFileDecoder; import static com.google.common.collect.Lists.newArrayList; /** * @author nw */ public class FlacAudioFileDecoder implements AudioFileDecoder { private FlacFileProperties flacFile = new FlacFileProperties(); private final AudioStandardizer audioStandardizer; public FlacAudioFileDecoder(AudioStandardizer audioStandardizer) { this.audioStandardizer = audioStandardizer; } @Override public AudioInputStream decode(File inputFile) throws UnsupportedAudioFileException, IOException { AudioInputStream flacAis; AudioInputStream result; FlacAudioFileReader fafr = new FlacAudioFileReader(); flacAis = fafr.getAudioInputStream(inputFile); AudioFormat decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, flacAis.getFormat().getSampleRate(), 16, flacAis.getFormat().getChannels(), flacAis.getFormat().getChannels() * 2, flacAis.getFormat().getSampleRate(), false); FlacFormatConversionProvider flacReader = new FlacFormatConversionProvider(); result = flacReader.getAudioInputStream(decodedFormat, flacAis); return audioStandardizer.standardize(result); } @Override public boolean isAbleToDecode(File file) { return flacFile.isOfThisType(file); } @Override public Collection<String> getExtensions() { return newArrayList(flacFile.getFileExtensions()); } }