OSDN Git Service

Minor changes to AudioTrack handling
authorNarayan Kamath <narayan@google.com>
Tue, 5 Jul 2011 14:31:07 +0000 (15:31 +0100)
committerNarayan Kamath <narayan@google.com>
Tue, 5 Jul 2011 14:46:53 +0000 (15:46 +0100)
Based on a discussion with the media folks.

Change-Id: I290cec062fcb53fccae1fd92387439448a54e81c

core/java/android/speech/tts/AudioPlaybackHandler.java

index a3686b7..c7603ee 100644 (file)
@@ -74,6 +74,12 @@ class AudioPlaybackHandler {
         removeMessages(token);
 
         if (token.getType() == MessageParams.TYPE_SYNTHESIS) {
+            AudioTrack current = ((SynthesisMessageParams) token).getAudioTrack();
+            if (current != null) {
+                // Stop the current audio track if it's still playing.
+                // The audio track is thread safe in this regard.
+                current.stop();
+            }
             mQueue.add(new ListEntry(SYNTHESIS_DONE, token, HIGH_PRIORITY));
         } else  {
             final MessageParams current = getCurrentParams();
@@ -393,9 +399,10 @@ class AudioPlaybackHandler {
 
         try {
             if (audioTrack != null) {
-                audioTrack.flush();
-                audioTrack.stop();
                 if (DBG) Log.d(TAG, "Releasing audio track [" + audioTrack.hashCode() + "]");
+                // The last call to AudioTrack.write( ) will return only after
+                // all data from the audioTrack has been sent to the mixer, so
+                // it's safe to release at this point.
                 audioTrack.release();
             }
         } finally {