From c231fd0fe7814a025aeb05796542048a51d0236b Mon Sep 17 00:00:00 2001 From: Charles Chen Date: Thu, 16 Jul 2009 11:28:09 -0700 Subject: [PATCH] Fixing a race condition that causes synthesis to not be aborted even if stop is called. --- .../TtsService/src/android/tts/TtsService.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/TtsService/src/android/tts/TtsService.java b/packages/TtsService/src/android/tts/TtsService.java index 7c4996e6b2f96..b3b580c55e4ae 100755 --- a/packages/TtsService/src/android/tts/TtsService.java +++ b/packages/TtsService/src/android/tts/TtsService.java @@ -130,6 +130,8 @@ public class TtsService extends Service implements OnCompletionListener { private HashMap mUtterances; private MediaPlayer mPlayer; private SpeechItem mCurrentSpeechItem; + private HashMap mKillList; // Used to ensure that in-flight synth calls + // are killed when stop is used. private TtsService mSelf; private ContentResolver mResolver; @@ -158,6 +160,7 @@ public class TtsService extends Service implements OnCompletionListener { mSpeechQueue = new ArrayList(); mPlayer = null; mCurrentSpeechItem = null; + mKillList = new HashMap(); setDefaultSettings(); } @@ -396,6 +399,7 @@ public class TtsService extends Service implements OnCompletionListener { if ((mCurrentSpeechItem != null) && mCurrentSpeechItem.mCallingApp.equals(callingApp)) { result = nativeSynth.stop(); + mKillList.put(mCurrentSpeechItem, true); if (mPlayer != null) { try { mPlayer.stop(); @@ -445,6 +449,7 @@ public class TtsService extends Service implements OnCompletionListener { ((mCurrentSpeechItem.mType != SpeechItem.TEXT_TO_FILE) || mCurrentSpeechItem.mCallingApp.equals(callingApp))) { result = nativeSynth.stop(); + mKillList.put(mCurrentSpeechItem, true); if (mPlayer != null) { try { mPlayer.stop(); @@ -578,7 +583,10 @@ public class TtsService extends Service implements OnCompletionListener { setLanguage("", language, country, variant); } } - nativeSynth.speak(speechItem.mText, streamType); + // Only do the synthesis if it has not been killed by a subsequent utterance. + if (mKillList.get(speechItem) == null){ + nativeSynth.speak(speechItem.mText, streamType); + } } catch (InterruptedException e) { Log.e("TTS speakInternalOnly", "tryLock interrupted"); e.printStackTrace(); @@ -641,7 +649,10 @@ public class TtsService extends Service implements OnCompletionListener { setLanguage("", language, country, variant); } } - nativeSynth.synthesizeToFile(speechItem.mText, speechItem.mFilename); + // Only do the synthesis if it has not been killed by a subsequent utterance. + if (mKillList.get(speechItem) == null){ + nativeSynth.synthesizeToFile(speechItem.mText, speechItem.mFilename); + } } catch (InterruptedException e) { Log.e("TTS synthToFileInternalOnly", "tryLock interrupted"); e.printStackTrace();