diff options
author | Charles Chen <clchen@google.com> | 2010-02-05 21:36:07 -0800 |
---|---|---|
committer | Charles Chen <clchen@google.com> | 2010-02-08 14:11:45 -0800 |
commit | 44afb7be73047b462e61eb451c14774d3ff7848a (patch) | |
tree | 8358ef080978fb4c2f0051f25546eb3fa40b82de /packages/TtsService | |
parent | 6b31e4d21f809bfb440034364aac8db4aa0cfcea (diff) | |
download | frameworks_base-44afb7be73047b462e61eb451c14774d3ff7848a.zip frameworks_base-44afb7be73047b462e61eb451c14774d3ff7848a.tar.gz frameworks_base-44afb7be73047b462e61eb451c14774d3ff7848a.tar.bz2 |
Fixing a race condition in the TextToSpeech service that could be
triggered if many long utterances are started and interrupted in
rapid succession.
Diffstat (limited to 'packages/TtsService')
-rwxr-xr-x | packages/TtsService/src/android/tts/TtsService.java | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/packages/TtsService/src/android/tts/TtsService.java b/packages/TtsService/src/android/tts/TtsService.java index b7eea2e..bca736a 100755 --- a/packages/TtsService/src/android/tts/TtsService.java +++ b/packages/TtsService/src/android/tts/TtsService.java @@ -133,6 +133,7 @@ public class TtsService extends Service implements OnCompletionListener { private HashMap<String, ITtsCallback> mCallbacksMap; private Boolean mIsSpeaking; + private Boolean mSynthBusy; private ArrayList<SpeechItem> mSpeechQueue; private HashMap<String, SoundResource> mEarcons; private HashMap<String, SoundResource> mUtterances; @@ -168,6 +169,7 @@ public class TtsService extends Service implements OnCompletionListener { mSelf = this; mIsSpeaking = false; + mSynthBusy = false; mEarcons = new HashMap<String, SoundResource>(); mUtterances = new HashMap<String, SoundResource>(); @@ -733,10 +735,11 @@ public class TtsService extends Service implements OnCompletionListener { try { synthAvailable = synthesizerLock.tryLock(); if (!synthAvailable) { + mSynthBusy = true; Thread.sleep(100); Thread synth = (new Thread(new SynthThread())); - //synth.setPriority(Thread.MIN_PRIORITY); synth.start(); + mSynthBusy = false; return; } int streamType = DEFAULT_STREAM_TYPE; @@ -821,10 +824,11 @@ public class TtsService extends Service implements OnCompletionListener { try { synthAvailable = synthesizerLock.tryLock(); if (!synthAvailable) { + mSynthBusy = true; Thread.sleep(100); Thread synth = (new Thread(new SynthThread())); - //synth.setPriority(Thread.MIN_PRIORITY); synth.start(); + mSynthBusy = false; return; } String language = ""; @@ -959,6 +963,12 @@ public class TtsService extends Service implements OnCompletionListener { private void processSpeechQueue() { boolean speechQueueAvailable = false; + synchronized (this) { + if (mSynthBusy){ + // There is already a synth thread waiting to run. + return; + } + } try { speechQueueAvailable = speechQueueLock.tryLock(SPEECHQUEUELOCK_TIMEOUT, TimeUnit.MILLISECONDS); |