r496 - in trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application: device device/audio flightController
Author: fdesbois Date: 2012-08-30 15:27:48 +0200 (Thu, 30 Aug 2012) New Revision: 496 Url: http://forge.codelutin.com/repositories/revision/sammoa/496 Log: refs #1197 : integration of SammoaAudioRecorder (not working on file change) Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManager.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManagerProvider.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerOnBoard.java Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManager.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManager.java 2012-08-30 13:27:33 UTC (rev 495) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManager.java 2012-08-30 13:27:48 UTC (rev 496) @@ -45,7 +45,9 @@ */ void start(); - /** Stop the device session */ + /** + * Stop the device session + */ void stop(); /** @@ -55,16 +57,24 @@ */ void close() throws DeviceTechnicalException; - /** @return the DeviceState */ + /** + * @return the DeviceState + */ DeviceState getState(); - /** @param listener DeviceStateListener to add */ + /** + * @param listener DeviceStateListener to add + */ void addDeviceStateListener(DeviceStateListener listener); - /** @param listener DeviceStateListener to remove */ + /** + * @param listener DeviceStateListener to remove + */ void removeDeviceStateListener(DeviceStateListener listener); - /** @return all the listeners */ + /** + * @return all the listeners + */ Set<DeviceStateListener> getDeviceStateListeners(); } Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManagerProvider.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManagerProvider.java 2012-08-30 13:27:33 UTC (rev 495) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManagerProvider.java 2012-08-30 13:27:48 UTC (rev 496) @@ -31,7 +31,7 @@ import fr.ulr.sammoa.application.device.audio.AudioReader; import fr.ulr.sammoa.application.device.audio.AudioReaderMock; import fr.ulr.sammoa.application.device.audio.AudioRecorder; -import fr.ulr.sammoa.application.device.audio.AudioRecorderDefault; +import fr.ulr.sammoa.application.device.audio.SammoaAudioRecorder; import fr.ulr.sammoa.application.device.gps.GpsConfig; import fr.ulr.sammoa.application.device.gps.GpsHandler; import fr.ulr.sammoa.application.device.gps.GpsLocationListener; @@ -145,7 +145,8 @@ @Override public AudioRecorder get() { - return new AudioRecorderDefault(); +// return new AudioRecorderDefault(); + return new SammoaAudioRecorder(44100, 16); } }); return result; Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java 2012-08-30 13:27:33 UTC (rev 495) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java 2012-08-30 13:27:48 UTC (rev 496) @@ -25,14 +25,14 @@ package fr.ulr.sammoa.application.device.audio; import com.google.common.base.Preconditions; +import com.google.common.collect.Sets; import fr.ulr.sammoa.application.device.DeviceState; import fr.ulr.sammoa.application.device.DeviceStateEvent; import fr.ulr.sammoa.application.device.DeviceStateListener; import fr.ulr.sammoa.application.device.DeviceTechnicalException; -import java.io.File; -import java.util.Set; -import java.util.Timer; -import java.util.TimerTask; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; @@ -40,8 +40,11 @@ import javax.sound.sampled.DataLine; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.TargetDataLine; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import java.io.File; +import java.io.IOException; +import java.util.Set; +import java.util.Timer; +import java.util.TimerTask; /** * Created: 16/05/12 @@ -50,11 +53,11 @@ */ public class SammoaAudioRecorder implements AudioRecorder { - private static final Logger log = LoggerFactory.getLogger(SammoaAudioRecorder.class); + private static final Logger logger = LoggerFactory.getLogger(SammoaAudioRecorder.class); protected AudioFormat audioFormat; - protected AudioFileFormat.Type outputType = AudioFileFormat.Type.WAVE; + protected AudioFileFormat.Type outputType; protected DeviceState state; @@ -62,13 +65,12 @@ protected AudioRecorderThread currentRecorder; - public SammoaAudioRecorder( - float sampleRate, // 8000,11025,16000,22050,44100 - int sampleSizeInBits // 8,16 - ) { + public SammoaAudioRecorder(float sampleRate, // 8000,11025,16000,22050,44100 + int sampleSizeInBits) { // 8,16 + int channels = 1; // 1,2 - boolean signed = true; //true,false - boolean bigEndian = false; //true,false + boolean signed = true; // true,false + boolean bigEndian = false; // true,false audioFormat = new AudioFormat( sampleRate, @@ -76,17 +78,14 @@ channels, signed, bigEndian); + + outputType = AudioFileFormat.Type.WAVE; + listeners = Sets.newHashSet(); } @Override public DeviceState getState() { - DeviceState result; - if (currentRecorder == null) { - result = DeviceState.READY; - } else { - result = DeviceState.RUNNING; - } - return result; + return state; } public void setState(DeviceState state, DeviceTechnicalException error) { @@ -123,28 +122,36 @@ @Override public void open() throws DeviceTechnicalException { - // rien a faire + setState(DeviceState.READY, null); } @Override public void start() { - // rien a faire + // nothing to do } @Override public void record(File outputFile, long delaySeconds) { - Preconditions.checkArgument(outputFile != null); + Preconditions.checkNotNull(outputFile); try { // stop last started if necessary stop(); // start new recorder thread currentRecorder = new AudioRecorderThread( - audioFormat, outputType, outputFile, delaySeconds); + audioFormat, outputType, outputFile, delaySeconds, this); currentRecorder.start(); - } catch (Exception eee) { - eee.printStackTrace(); - log.error("Can't record audio", eee); + + setState(DeviceState.RUNNING, null); + + } catch (LineUnavailableException ex) { + fireError("Error recording " + outputFile.getName(), ex); + } catch (IllegalArgumentException ex) { + fireError("Error recording " + outputFile.getName(), ex); + } catch (IllegalStateException ex) { + fireError("Error recording " + outputFile.getName(), ex); + } catch (SecurityException ex) { + fireError("Error recording " + outputFile.getName(), ex); } } @@ -158,6 +165,7 @@ if (currentRecorder != null) { currentRecorder.stopRecord(); currentRecorder = null; + setState(DeviceState.READY, null); } } @@ -166,26 +174,40 @@ stop(); } - static protected class AudioRecorderThread extends Thread{ + protected void fireError(String message, Throwable cause) { + if (logger.isErrorEnabled()) { + logger.error(message, cause); + } + DeviceTechnicalException error = new DeviceTechnicalException( + this, message, cause); + setState(DeviceState.ERROR, error); + } + + protected static class AudioRecorderThread extends Thread { + protected TargetDataLine targetDataLine; protected AudioFileFormat.Type fileType; - protected File filename; + protected File file; protected long delayToClose; protected AudioInputStream stream; + protected SammoaAudioRecorder audioRecorder; - public AudioRecorderThread( - AudioFormat audioFormat, AudioFileFormat.Type fileType, - File filename, long delayToClose) throws LineUnavailableException { + public AudioRecorderThread(AudioFormat audioFormat, + AudioFileFormat.Type fileType, + File file, + long delayToClose, + SammoaAudioRecorder audioRecorder) + throws LineUnavailableException { + this.fileType = fileType; - this.filename = filename; + this.file = file; this.delayToClose = delayToClose; + this.audioRecorder = audioRecorder; - DataLine.Info dataLineInfo = new DataLine.Info( TargetDataLine.class, audioFormat); - targetDataLine = (TargetDataLine) - AudioSystem.getLine(dataLineInfo); + targetDataLine = (TargetDataLine) AudioSystem.getLine(dataLineInfo); AudioFormat.Encoding targetEncoding = AudioFormat.Encoding.ULAW; targetDataLine.open(audioFormat); @@ -200,29 +222,36 @@ * le parametre delayToClose passer lors de la construction du thread */ public void stopRecord() { - System.out.println("Arret demande ..."); + if (logger.isDebugEnabled()) { + logger.debug("Ask for stop record... close in {} seconds", + delayToClose); + } Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { targetDataLine.stop(); targetDataLine.close(); - System.out.println("... arret reel"); + if (logger.isDebugEnabled()) { + logger.debug("Closing record: {}", file); + } + } }, delayToClose * 1000); } @Override public void run(){ - try{ - System.out.println("Write audio to: " + filename); - log.debug("Write audio to: " + filename); - AudioSystem.write(stream, fileType, filename); - }catch (Exception eee) { - eee.printStackTrace(); - log.error("Can't record audio", eee); + if (logger.isDebugEnabled()) { + logger.debug("Write audio to: {}", file); } + try { + AudioSystem.write(stream, fileType, file); + + } catch (IOException ex) { + audioRecorder.fireError("Error recording " + file.getName(), ex); + } } } } Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerOnBoard.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerOnBoard.java 2012-08-30 13:27:33 UTC (rev 495) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerOnBoard.java 2012-08-30 13:27:48 UTC (rev 496) @@ -88,7 +88,7 @@ if (state == FlightState.ON_EFFORT || currentRoute.getRouteType() == RouteType.CIRCLE_BACK) { - saveAudio(0); + saveAudio(3); } } } @@ -141,7 +141,6 @@ if (RouteType.LEG == newRoute.getRouteType() || RouteType.CIRCLE_BACK == newRoute.getRouteType()) { - // Stop previous recording after 3 seconds saveAudio(3); } else {
participants (1)
-
fdesbois@users.forge.codelutin.com