package ch.retorte.intervalmusiccompositor.output;
import static java.io.File.separator;
import java.io.File;
import java.io.FileInputStream;
import java.util.List;
import javax.sound.sampled.AudioInputStream;
import ch.retorte.intervalmusiccompositor.spi.progress.ProgressListener;
import ch.retorte.intervalmusiccompositor.messagebus.DebugMessage;
import ch.retorte.intervalmusiccompositor.messagebus.ErrorMessage;
import ch.retorte.intervalmusiccompositor.spi.encoder.AudioFileEncoder;
import ch.retorte.intervalmusiccompositor.spi.messagebus.MessageProducer;
import ch.retorte.intervalmusiccompositor.spi.progress.ProgressUpdatable;
import ch.retorte.intervalmusiccompositor.util.SoundHelper;
/**
* @author nw
*/
public class OutputGenerator {
private SoundHelper soundHelper;
private List<AudioFileEncoder> encoders;
private MessageProducer messageProducer;
public OutputGenerator(SoundHelper soundHelper, List<AudioFileEncoder> encoders, MessageProducer messageProducer) {
this.soundHelper = soundHelper;
this.encoders = encoders;
this.messageProducer = messageProducer;
}
public void generateOutput(FileInputStream audioFileInputStream, long streamLengthInBytes, String path, String filePrefix, String encoderIdentifier, ProgressListener progressListener) {
AudioFileEncoder encoder = getEncoderFor(encoderIdentifier);
File outputFile = generateOutputFile(encoder, path, filePrefix);
addDebugMessage("Encoding compilation data with: " + encoder.getClass().getSimpleName() + " to: " + outputFile);
try {
checkForProgressIndicationCapabilities(encoder, progressListener);
AudioInputStream audioInputStream = soundHelper.getStreamFromInputStream(audioFileInputStream, streamLengthInBytes);
encoder.encode(audioInputStream, streamLengthInBytes, outputFile);
}
catch (Exception e) {
addDebugMessage(e.getMessage());
addErrorMessage(e.getMessage());
}
}
private void checkForProgressIndicationCapabilities(AudioFileEncoder encoder, ProgressListener progressListener) {
if (encoder instanceof ProgressUpdatable) {
((ProgressUpdatable) encoder).setProgressListener(progressListener);
}
}
public List<AudioFileEncoder> getEncoders() {
return encoders;
}
private AudioFileEncoder getEncoderFor(String encoderIdentifier) {
for (AudioFileEncoder encoder : encoders) {
try {
if (encoder.isAbleToEncode() && encoder.getIdentificator().equals(encoderIdentifier)) {
return encoder;
}
}
catch (Exception e) {
addDebugMessage("Encoder " + encoder + " threw exception on isAbleToEncode():" + e.getMessage());
// Go to the next encoder if this one does not bring it.
}
}
throw new IllegalStateException("No encoder found.");
}
private File generateOutputFile(AudioFileEncoder encoder, String path, String filePrefix) {
String normalizedPath = path;
if (!normalizedPath.endsWith(separator)) {
normalizedPath += separator;
}
return new File(normalizedPath + filePrefix + "." + encoder.getFileExtension());
}
private void addDebugMessage(String message) {
messageProducer.send(new DebugMessage(this, message));
}
private void addErrorMessage(String message) {
messageProducer.send(new ErrorMessage(message));
}
}