diff options
author | Narayan Kamath <narayan@google.com> | 2012-06-09 17:31:39 +0100 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-08-14 08:36:27 -0700 |
commit | ed4e541a20cc662b8399844684d18ad0060bd1cb (patch) | |
tree | cc428e7bcf28dd10dc2f9fd3264cd5d5342eaef3 | |
parent | a6aef1bbb4382fa5f89d0b7ad2cc46be4c6de1e7 (diff) | |
download | frameworks_base-ed4e541a20cc662b8399844684d18ad0060bd1cb.zip frameworks_base-ed4e541a20cc662b8399844684d18ad0060bd1cb.tar.gz frameworks_base-ed4e541a20cc662b8399844684d18ad0060bd1cb.tar.bz2 |
Fix bug in BlockingAudioTrack.
Will be seen when createStreamingAudioTrack() returns null,
which will happen if the audioflinger / audiomanager are unhealthy.
Also removes some confusing synchronization from this class.
bug:6636401
Change-Id: Iaf68a305665b7bc973898145e9cd1563e2569a2b
-rw-r--r-- | core/java/android/speech/tts/BlockingAudioTrack.java | 42 | ||||
-rw-r--r-- | core/java/android/speech/tts/SynthesisPlaybackQueueItem.java | 6 |
2 files changed, 27 insertions, 21 deletions
diff --git a/core/java/android/speech/tts/BlockingAudioTrack.java b/core/java/android/speech/tts/BlockingAudioTrack.java index fcadad7..47e2129 100644 --- a/core/java/android/speech/tts/BlockingAudioTrack.java +++ b/core/java/android/speech/tts/BlockingAudioTrack.java @@ -67,12 +67,10 @@ class BlockingAudioTrack { private int mAudioBufferSize; private int mBytesWritten = 0; - private AudioTrack mAudioTrack; + // Need to be seen by stop() which can be called from another thread. mAudioTrack will be + // set to null only after waitAndRelease(). + private volatile AudioTrack mAudioTrack; private volatile boolean mStopped; - // Locks the initialization / uninitialization of the audio track. - // This is required because stop() will throw an illegal state exception - // if called before init() or after mAudioTrack.release(). - private final Object mAudioTrackLock = new Object(); BlockingAudioTrack(int streamType, int sampleRate, int audioFormat, int channelCount, @@ -93,19 +91,21 @@ class BlockingAudioTrack { mStopped = false; } - public void init() { + public boolean init() { AudioTrack track = createStreamingAudioTrack(); + mAudioTrack = track; - synchronized (mAudioTrackLock) { - mAudioTrack = track; + if (track == null) { + return false; + } else { + return true; } } public void stop() { - synchronized (mAudioTrackLock) { - if (mAudioTrack != null) { - mAudioTrack.stop(); - } + AudioTrack track = mAudioTrack; + if (track != null) { + track.stop(); } mStopped = true; } @@ -120,6 +120,12 @@ class BlockingAudioTrack { } public void waitAndRelease() { + AudioTrack track = mAudioTrack; + if (track == null) { + if (DBG) Log.d(TAG, "Audio track null [duplicate call to waitAndRelease ?]"); + return; + } + // For "small" audio tracks, we have to stop() them to make them mixable, // else the audio subsystem will wait indefinitely for us to fill the buffer // before rendering the track mixable. @@ -129,11 +135,11 @@ class BlockingAudioTrack { if (mBytesWritten < mAudioBufferSize && !mStopped) { if (DBG) { Log.d(TAG, "Stopping audio track to flush audio, state was : " + - mAudioTrack.getPlayState() + ",stopped= " + mStopped); + track.getPlayState() + ",stopped= " + mStopped); } mIsShortUtterance = true; - mAudioTrack.stop(); + track.stop(); } // Block until the audio track is done only if we haven't stopped yet. @@ -145,11 +151,9 @@ class BlockingAudioTrack { // 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. - if (DBG) Log.d(TAG, "Releasing audio track [" + mAudioTrack.hashCode() + "]"); - synchronized (mAudioTrackLock) { - mAudioTrack.release(); - mAudioTrack = null; - } + if (DBG) Log.d(TAG, "Releasing audio track [" + track.hashCode() + "]"); + track.release(); + mAudioTrack = null; } diff --git a/core/java/android/speech/tts/SynthesisPlaybackQueueItem.java b/core/java/android/speech/tts/SynthesisPlaybackQueueItem.java index d299d70..e853c9e 100644 --- a/core/java/android/speech/tts/SynthesisPlaybackQueueItem.java +++ b/core/java/android/speech/tts/SynthesisPlaybackQueueItem.java @@ -87,7 +87,10 @@ final class SynthesisPlaybackQueueItem extends PlaybackQueueItem { dispatcher.dispatchOnStart(); - mAudioTrack.init(); + if (!mAudioTrack.init()) { + dispatcher.dispatchOnError(); + return; + } try { byte[] buffer = null; @@ -242,4 +245,3 @@ final class SynthesisPlaybackQueueItem extends PlaybackQueueItem { } } } - |