diff options
author | Charles Chen <clchen@google.com> | 2009-07-08 19:02:19 -0700 |
---|---|---|
committer | Charles Chen <clchen@google.com> | 2009-07-09 09:51:33 -0700 |
commit | 0a3d8744feb8ef5714b6c341ebcaa7ce326de908 (patch) | |
tree | 8820dccd396f5ace2628cb8f820c0471b824b98f /packages/TtsService/src/android/tts/TtsService.java | |
parent | 8a715b4b791db4390d12e0ded02280592634a424 (diff) | |
download | frameworks_base-0a3d8744feb8ef5714b6c341ebcaa7ce326de908.zip frameworks_base-0a3d8744feb8ef5714b6c341ebcaa7ce326de908.tar.gz frameworks_base-0a3d8744feb8ef5714b6c341ebcaa7ce326de908.tar.bz2 |
Adding a lock to stop so that stop will stop utterances
that are just starting up.
Diffstat (limited to 'packages/TtsService/src/android/tts/TtsService.java')
-rwxr-xr-x | packages/TtsService/src/android/tts/TtsService.java | 47 |
1 files changed, 36 insertions, 11 deletions
diff --git a/packages/TtsService/src/android/tts/TtsService.java b/packages/TtsService/src/android/tts/TtsService.java index a713edf..5e9664a 100755 --- a/packages/TtsService/src/android/tts/TtsService.java +++ b/packages/TtsService/src/android/tts/TtsService.java @@ -38,6 +38,8 @@ import java.util.Arrays; import java.util.HashMap; import java.util.Locale; import java.util.concurrent.locks.ReentrantLock; +import java.util.concurrent.TimeUnit; + /** * @hide Synthesizes speech from text. This is implemented as a service so that @@ -358,20 +360,38 @@ public class TtsService extends Service implements OnCompletionListener { * Stops all speech output and removes any utterances still in the queue. */ private int stop() { - Log.i("TTS", "Stopping"); - mSpeechQueue.clear(); + int result = TextToSpeech.TTS_ERROR; + boolean speechQueueAvailable = false; + try{ + // If the queue is locked for more than 1 second, + // something has gone very wrong with processSpeechQueue. + speechQueueAvailable = speechQueueLock.tryLock(1000, TimeUnit.MILLISECONDS); + if (speechQueueAvailable) { + Log.i("TTS", "Stopping"); + mSpeechQueue.clear(); - int result = nativeSynth.stop(); - mIsSpeaking = false; - if (mPlayer != null) { - try { - mPlayer.stop(); - } catch (IllegalStateException e) { - // Do nothing, the player is already stopped. + result = nativeSynth.stop(); + mIsSpeaking = false; + if (mPlayer != null) { + try { + mPlayer.stop(); + } catch (IllegalStateException e) { + // Do nothing, the player is already stopped. + } + } + Log.i("TTS", "Stopped"); + } + } catch (InterruptedException e) { + Log.e("TTS stop", "tryLock interrupted"); + e.printStackTrace(); + } finally { + // This check is needed because finally will always run; even if the + // method returns somewhere in the try block. + if (speechQueueAvailable) { + speechQueueLock.unlock(); } + return result; } - Log.i("TTS", "Stopped"); - return result; } public void onCompletion(MediaPlayer arg0) { @@ -443,6 +463,7 @@ public class TtsService extends Service implements OnCompletionListener { } nativeSynth.speak(text); } catch (InterruptedException e) { + Log.e("TTS speakInternalOnly", "tryLock interrupted"); e.printStackTrace(); } finally { // This check is needed because finally will always run; @@ -497,6 +518,7 @@ public class TtsService extends Service implements OnCompletionListener { } nativeSynth.synthesizeToFile(text, filename); } catch (InterruptedException e) { + Log.e("TTS synthToFileInternalOnly", "tryLock interrupted"); e.printStackTrace(); } finally { // This check is needed because finally will always run; @@ -650,6 +672,9 @@ public class TtsService extends Service implements OnCompletionListener { if (mSpeechQueue.size() > 0) { mSpeechQueue.remove(0); } + } catch (InterruptedException e) { + Log.e("TTS processSpeechQueue", "tryLock interrupted"); + e.printStackTrace(); } finally { // This check is needed because finally will always run; even if the // method returns somewhere in the try block. |