Merge change 7537 into donut

* changes:
  Fixing a race condition that causes synthesis to not be aborted even if stop is called.
This commit is contained in:
Android (Google) Code Review
2009-07-16 13:28:04 -07:00

View File

@@ -130,6 +130,8 @@ public class TtsService extends Service implements OnCompletionListener {
private HashMap<String, SoundResource> mUtterances; private HashMap<String, SoundResource> mUtterances;
private MediaPlayer mPlayer; private MediaPlayer mPlayer;
private SpeechItem mCurrentSpeechItem; private SpeechItem mCurrentSpeechItem;
private HashMap<SpeechItem, Boolean> mKillList; // Used to ensure that in-flight synth calls
// are killed when stop is used.
private TtsService mSelf; private TtsService mSelf;
private ContentResolver mResolver; private ContentResolver mResolver;
@@ -158,6 +160,7 @@ public class TtsService extends Service implements OnCompletionListener {
mSpeechQueue = new ArrayList<SpeechItem>(); mSpeechQueue = new ArrayList<SpeechItem>();
mPlayer = null; mPlayer = null;
mCurrentSpeechItem = null; mCurrentSpeechItem = null;
mKillList = new HashMap<SpeechItem, Boolean>();
setDefaultSettings(); setDefaultSettings();
} }
@@ -396,6 +399,7 @@ public class TtsService extends Service implements OnCompletionListener {
if ((mCurrentSpeechItem != null) && if ((mCurrentSpeechItem != null) &&
mCurrentSpeechItem.mCallingApp.equals(callingApp)) { mCurrentSpeechItem.mCallingApp.equals(callingApp)) {
result = nativeSynth.stop(); result = nativeSynth.stop();
mKillList.put(mCurrentSpeechItem, true);
if (mPlayer != null) { if (mPlayer != null) {
try { try {
mPlayer.stop(); mPlayer.stop();
@@ -445,6 +449,7 @@ public class TtsService extends Service implements OnCompletionListener {
((mCurrentSpeechItem.mType != SpeechItem.TEXT_TO_FILE) || ((mCurrentSpeechItem.mType != SpeechItem.TEXT_TO_FILE) ||
mCurrentSpeechItem.mCallingApp.equals(callingApp))) { mCurrentSpeechItem.mCallingApp.equals(callingApp))) {
result = nativeSynth.stop(); result = nativeSynth.stop();
mKillList.put(mCurrentSpeechItem, true);
if (mPlayer != null) { if (mPlayer != null) {
try { try {
mPlayer.stop(); mPlayer.stop();
@@ -578,7 +583,10 @@ public class TtsService extends Service implements OnCompletionListener {
setLanguage("", language, country, variant); 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) { } catch (InterruptedException e) {
Log.e("TTS speakInternalOnly", "tryLock interrupted"); Log.e("TTS speakInternalOnly", "tryLock interrupted");
e.printStackTrace(); e.printStackTrace();
@@ -641,7 +649,10 @@ public class TtsService extends Service implements OnCompletionListener {
setLanguage("", language, country, variant); 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) { } catch (InterruptedException e) {
Log.e("TTS synthToFileInternalOnly", "tryLock interrupted"); Log.e("TTS synthToFileInternalOnly", "tryLock interrupted");
e.printStackTrace(); e.printStackTrace();