package ch.retorte.intervalmusiccompositor.encoder; import ch.retorte.intervalmusiccompositor.spi.encoder.AudioFileEncoder; import ch.retorte.intervalmusiccompositor.spi.progress.ProgressListener; import ch.retorte.intervalmusiccompositor.spi.progress.ProgressUpdatable; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.UnsupportedAudioFileException; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; /** * Encodes an audio input stream to the ogg/vorbis format. */ public class OggAudioFileEncoder implements AudioFileEncoder, ProgressUpdatable { private static final String EXTENSION = "ogg"; private VorbisEncoder encoder; private ProgressListener progressListener; @Override public void encode(AudioInputStream audioInputStream, long streamLengthInBytes, File outputFile) throws UnsupportedAudioFileException, IOException { createEncoderWithSettings(audioInputStream.getFormat()); Files.write(Paths.get(outputFile.getAbsolutePath()), encodeToOgg(audioInputStream, streamLengthInBytes)); } private void createEncoderWithSettings(AudioFormat audioFormat) { encoder = new VorbisEncoder(audioFormat, progressListener); } private byte[] encodeToOgg(AudioInputStream audioInputStream, long streamLengthInBytes) throws IOException { return encoder.encodeToOgg(audioInputStream, streamLengthInBytes); } @Override public boolean isAbleToEncode() { return true; } @Override public String getFileExtension() { return EXTENSION; } @Override public String getIdentificator() { return EXTENSION; } @Override public void setProgressListener(ProgressListener progressListener) { this.progressListener = progressListener; } }