package ch.retorte.intervalmusiccompositor.audiofile;
import static com.google.common.collect.Lists.newArrayList;
import java.io.File;
import java.util.Collection;
import java.util.List;
import ch.retorte.intervalmusiccompositor.messagebus.DebugMessage;
import ch.retorte.intervalmusiccompositor.spi.bpm.BPMCalculator;
import ch.retorte.intervalmusiccompositor.spi.bpm.BPMReaderWriter;
import ch.retorte.intervalmusiccompositor.spi.decoder.AudioFileDecoder;
import ch.retorte.intervalmusiccompositor.spi.messagebus.MessageProducer;
import ch.retorte.intervalmusiccompositor.util.SoundHelper;
/**
* @author nw
*/
public class AudioFileFactory {
private final Collection<AudioFileDecoder> decoders;
private final Collection<BPMReaderWriter> bpmReaderWriters;
private SoundHelper soundHelper;
private BPMCalculator bpmCalculator;
private MessageProducer messageProducer;
public AudioFileFactory(SoundHelper soundHelper, Collection<AudioFileDecoder> decoders, Collection<BPMReaderWriter> bpmReaderWriters, BPMCalculator bpmCalculator,
MessageProducer messageProducer) {
this.soundHelper = soundHelper;
this.decoders = decoders;
this.bpmReaderWriters = bpmReaderWriters;
this.bpmCalculator = bpmCalculator;
this.messageProducer = messageProducer;
}
public AudioFile createAudioFileFrom(File file) {
List<AudioFileDecoder> audioFileDecoders = findMatchingDecodersFor(file);
BPMReaderWriter bpmReaderWriter = findMatchingBPMReaderWriterFor(file);
if (!audioFileDecoders.isEmpty()) {
addDebugMessage("Selected " + audioFileDecoders.get(0).getClass().getSimpleName() + " for decoding " + file);
}
else {
addDebugMessage("No AudioFileDecoder found for decoding " + file);
}
return new AudioFile(file.getAbsolutePath(), soundHelper, audioFileDecoders, bpmReaderWriter, bpmCalculator, messageProducer);
}
public boolean hasDecoderFor(File file) {
List<AudioFileDecoder> matchingDecoders = findMatchingDecodersFor(file);
return !matchingDecoders.isEmpty();
}
private List<AudioFileDecoder> findMatchingDecodersFor(File file) {
List<AudioFileDecoder> result = newArrayList();
for (AudioFileDecoder decoder : decoders) {
if (decoder.isAbleToDecode(file)) {
result.add(decoder);
}
}
return result;
}
private BPMReaderWriter findMatchingBPMReaderWriterFor(File file) {
for (BPMReaderWriter readerWriter : bpmReaderWriters) {
if (readerWriter.isAbleToReadWriteBPM(file)) {
return readerWriter;
}
}
return null;
}
private void addDebugMessage(String message) {
messageProducer.send(new DebugMessage(this, message));
}
public Collection<AudioFileDecoder> getDecoders() {
return decoders;
}
}