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.tritonus.sampled.convert.PCM2PCMConversionProvider;
import org.tritonus.sampled.file.WaveAudioFileReader;
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 WaveAudioFileDecoder implements AudioFileDecoder {
private final WaveFileProperties waveFile = new WaveFileProperties();
private final AudioStandardizer audioStandardizer;
public WaveAudioFileDecoder(AudioStandardizer normalizer) {
this.audioStandardizer = normalizer;
}
@Override
public AudioInputStream decode(File inputFile) throws UnsupportedAudioFileException, IOException {
AudioInputStream ais;
AudioInputStream result;
ais = new WaveAudioFileReader().getAudioInputStream(inputFile);
AudioFormat decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, ais.getFormat().getSampleRate(), 16, ais.getFormat().getChannels(), ais
.getFormat().getChannels() * 2, ais.getFormat().getSampleRate(), false);
result = new PCM2PCMConversionProvider().getAudioInputStream(decodedFormat, ais);
return audioStandardizer.standardize(result);
}
@Override
public boolean isAbleToDecode(File file) {
return waveFile.isOfThisType(file);
}
@Override
public Collection<String> getExtensions() {
return newArrayList(waveFile.getFileExtensions());
}
}