package pl.piotrsukiennik.whowhen.splitter.service;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Component;
import pl.piotrsukiennik.whowhen.backend.api.inner.splitter.SplitterRequest;
import pl.piotrsukiennik.whowhen.backend.api.inner.splitter.SplitterResponse;
import pl.piotrsukiennik.whowhen.backend.api.inner.splitter.SplitterService;
import pl.piotrsukiennik.whowhen.backend.api.inner.util.AudioInfo;
import pl.piotrsukiennik.whowhen.backend.api.inner.util.AudioInfoUtil;
import pl.piotrsukiennik.whowhen.backend.api.outer.IBackendService;
import pl.piotrsukiennik.whowhen.splitter.AudioFileSplitter;
import pl.piotrsukiennik.whowhen.splitter.IndexIntervalsToTimelineMapper;
import javax.annotation.Resource;
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @author Piotr Sukiennik
*/
@Component( "splitterServiceImpl" )
public class SplitterServiceImpl implements SplitterService {
@Resource
private IBackendService backendService;
private Log logger = LogFactory.getLog( SplitterServiceImpl.class );
private ExecutorService executorService = Executors.newFixedThreadPool( 4 );
@Override
public void handle( final SplitterRequest splitterRequest ) {
executorService.submit( new Runnable() {
@Override
public void run() {
try {
IndexIntervalsToTimelineMapper intervalsToTimelineMapper = new IndexIntervalsToTimelineMapper( splitterRequest.getSingleIntervalLength() );
List<Map<String, List<double[]>>> timelines = new ArrayList<Map<String, List<double[]>>>();
Map<String, List<double[]>> wholeTimeline = new LinkedHashMap<String, List<double[]>>();
for ( Map<String, List<int[]>> labeledIntervals : splitterRequest.getLabeledIntervalsKey() ) {
Map<String, List<double[]>> timeline = intervalsToTimelineMapper.mapGroupByLabel( labeledIntervals );
timelines.add( timeline );
wholeTimeline.putAll( timeline );
}
AudioFileSplitter audioFileSplitter = new AudioFileSplitter();
AudioInfo audioInfo = splitterRequest.getAudioInfo();
AudioFormat audioFormat = AudioInfoUtil.convert( audioInfo );
audioFileSplitter.split( audioFormat, audioInfo.getDuration(), audioInfo.getAudioFile(), wholeTimeline, splitterRequest.getOutputDirectory(), AudioFileFormat.Type.WAVE );
SplitterResponse splitterResponse = new SplitterResponse( splitterRequest.getRequestIdentifier(), timelines );
backendService.notify( splitterResponse );
}
catch ( Exception e ) {
if ( logger.isErrorEnabled() ) {
logger.error( ExceptionUtils.getStackTrace( e ) );
}
}
}
} );
}
}