summaryrefslogtreecommitdiffstats
path: root/packages/TtsService/src
diff options
context:
space:
mode:
authorCharles Chen <clchen@google.com>2010-02-05 21:36:07 -0800
committerCharles Chen <clchen@google.com>2010-02-08 14:11:45 -0800
commit44afb7be73047b462e61eb451c14774d3ff7848a (patch)
tree8358ef080978fb4c2f0051f25546eb3fa40b82de /packages/TtsService/src
parent6b31e4d21f809bfb440034364aac8db4aa0cfcea (diff)
downloadframeworks_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/src')
-rwxr-xr-xpackages/TtsService/src/android/tts/TtsService.java14
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);