Author: fdesbois Date: 2012-09-26 16:49:05 +0200 (Wed, 26 Sep 2012) New Revision: 599 Url: http://forge.codelutin.com/repositories/revision/sammoa/599 Log: fixes #1512 : issue with audio playing, need to wait for clip start before starting audioPositionTracker Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioReader.java Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioReader.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioReader.java 2012-09-26 13:22:14 UTC (rev 598) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioReader.java 2012-09-26 14:49:05 UTC (rev 599) @@ -38,6 +38,8 @@ import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; import javax.sound.sampled.DataLine; +import javax.sound.sampled.LineEvent; +import javax.sound.sampled.LineListener; import java.io.File; import java.util.Date; import java.util.HashSet; @@ -99,18 +101,16 @@ task = new TimerTask() { @Override public void run() { - if (reader.clip.isActive()) { - // on appele pas setPosition car, sinon on modifie la position dans le clips :( - // alors que c'est lui qu'on surveille et qui fait le changement - long old = reader.audioPosition; - long position = reader.getClip().getMicrosecondPosition()/1000L; - if (old != position) { - reader.audioPosition = position; - reader.firePositionChanged(position); - } - } else { - reader.stop(); - reader.setPosition(0); + Preconditions.checkState(reader.getClip().isActive(), + "Clip is not alive, no position can be fired"); + + // on appele pas setPosition car, sinon on modifie la position dans le clips :( + // alors que c'est lui qu'on surveille et qui fait le changement + long old = reader.audioPosition; + long position = reader.getClip().getMicrosecondPosition()/1000L; + if (old != position) { + reader.audioPosition = position; + reader.firePositionChanged(position); } } }; @@ -175,6 +175,18 @@ try { clip = (Clip) AudioSystem.getLine(info); + clip.addLineListener(new LineListener() { + + @Override + public void update(LineEvent event) { + if (logger.isDebugEnabled()) { + logger.debug("Clip {}", event.getType()); + } + if (LineEvent.Type.START.equals(event.getType())) { + onClipStart(); + } + } + }); clip.open(ain); } finally { // We're done with the input stream. @@ -283,14 +295,23 @@ public void start() { if (clip != null) { clip.start(); - audioPositionTraker.start(); // all time start tracker after clip - logger.debug("Sound playing"); - if (state == DeviceState.READY) { - setState(DeviceState.RUNNING); - } } } + /** + * There is some delay on asynchronous clip.start(). So we must wait for + * clip start event fired to launch audioPositionTraker. + * + * @see LineListener + */ + protected void onClipStart() { + audioPositionTraker.start(); // all time start tracker after clip + logger.debug("Sound playing"); + if (state == DeviceState.READY) { + setState(DeviceState.RUNNING); + } + } + @Override public void stop() { logger.debug("Stop playing");