package ch.retorte.intervalmusiccompositor.encoder;
import ch.retorte.intervalmusiccompositor.spi.progress.ProgressListener;
import net.sourceforge.lame.lowlevel.LameEncoder;
import net.sourceforge.lame.mp3.Lame;
import net.sourceforge.lame.mp3.MPEGMode;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
/**
* @author nw
*/
class LameByteArrayEncoder {
private static final boolean USE_VARIABLE_BITRATE = false;
private static final int GOOD_QUALITY_BITRATE = 256;
private AudioFormat inputFormat;
private ProgressListener progressListener;
LameByteArrayEncoder(AudioFormat inputFormat, ProgressListener progressListener) {
this.inputFormat = inputFormat;
this.progressListener = progressListener;
}
byte[] encodeToMp3(AudioInputStream audioInputStream, long streamLengthInBytes) throws IOException {
LameEncoder encoder = new LameEncoder(inputFormat, GOOD_QUALITY_BITRATE, MPEGMode.STEREO, Lame.QUALITY_HIGHEST, USE_VARIABLE_BITRATE);
ByteArrayOutputStream mp3 = new ByteArrayOutputStream();
byte[] inputBuffer = new byte[encoder.getPCMBufferSize()];
byte[] outputBuffer = new byte[encoder.getPCMBufferSize()];
int bytesRead;
int bytesWritten;
int currentPcmPosition = 0;
while(0 < (bytesRead = audioInputStream.read(inputBuffer))) {
bytesWritten = encoder.encodeBuffer(inputBuffer, 0, bytesRead, outputBuffer);
currentPcmPosition += bytesRead;
updateProgressWith(currentPcmPosition, streamLengthInBytes);
mp3.write(outputBuffer, 0, bytesWritten);
}
encoder.close();
return mp3.toByteArray();
}
private void updateProgressWith(long currentPosition, long total) {
progressListener.onProgressUpdate((int) (100.0 / total * currentPosition));
}
}