diff options
author | Charles Chen <clchen@google.com> | 2009-07-13 21:21:01 -0700 |
---|---|---|
committer | Charles Chen <clchen@google.com> | 2009-07-13 21:21:01 -0700 |
commit | 3ab2076d65b86a69f6c5de220082c2fbace575e2 (patch) | |
tree | a854c51f7ab9263ab661ae43fe2feddb832dba09 /packages/TtsService/src | |
parent | 8af55ca4dd7eeb098b5c2e69bc7a9171c893269a (diff) | |
download | frameworks_base-3ab2076d65b86a69f6c5de220082c2fbace575e2.zip frameworks_base-3ab2076d65b86a69f6c5de220082c2fbace575e2.tar.gz frameworks_base-3ab2076d65b86a69f6c5de220082c2fbace575e2.tar.bz2 |
Implementing utterance ID callbacks for silence and pre-recorded files
(both generating and playing).
Diffstat (limited to 'packages/TtsService/src')
-rwxr-xr-x | packages/TtsService/src/android/tts/TtsService.java | 79 |
1 files changed, 62 insertions, 17 deletions
diff --git a/packages/TtsService/src/android/tts/TtsService.java b/packages/TtsService/src/android/tts/TtsService.java index 09bb8f9..e486a47 100755 --- a/packages/TtsService/src/android/tts/TtsService.java +++ b/packages/TtsService/src/android/tts/TtsService.java @@ -69,8 +69,9 @@ public class TtsService extends Service implements OnCompletionListener { mCallingApp = source; } - public SpeechItem(String source, long silenceTime) { + public SpeechItem(String source, long silenceTime, ArrayList<String> params) { mDuration = silenceTime; + mParams = params; mType = SILENCE; mCallingApp = source; } @@ -125,6 +126,7 @@ public class TtsService extends Service implements OnCompletionListener { private HashMap<String, SoundResource> mEarcons; private HashMap<String, SoundResource> mUtterances; private MediaPlayer mPlayer; + private SpeechItem mCurrentSpeechItem; private TtsService mSelf; private ContentResolver mResolver; @@ -152,6 +154,7 @@ public class TtsService extends Service implements OnCompletionListener { mSpeechQueue = new ArrayList<SpeechItem>(); mPlayer = null; + mCurrentSpeechItem = null; setDefaultSettings(); } @@ -401,6 +404,7 @@ public class TtsService extends Service implements OnCompletionListener { } finally { // This check is needed because finally will always run; even if the // method returns somewhere in the try block. + mCurrentSpeechItem = null; if (speechQueueAvailable) { speechQueueLock.unlock(); } @@ -409,6 +413,21 @@ public class TtsService extends Service implements OnCompletionListener { } public void onCompletion(MediaPlayer arg0) { + String callingApp = mCurrentSpeechItem.mCallingApp; + ArrayList<String> params = mCurrentSpeechItem.mParams; + String utteranceId = ""; + if (params != null){ + for (int i = 0; i < params.size() - 1; i = i + 2){ + String param = params.get(i); + if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_UTTERANCE_ID)){ + utteranceId = params.get(i+1); + } + } + } + if (utteranceId.length() > 0){ + dispatchUtteranceCompletedCallback(utteranceId, callingApp); + } + mCurrentSpeechItem = null; processSpeechQueue(); } @@ -417,21 +436,37 @@ public class TtsService extends Service implements OnCompletionListener { if (queueMode == TextToSpeech.TTS_QUEUE_FLUSH) { stop(callingApp); } - mSpeechQueue.add(new SpeechItem(callingApp, duration)); + mSpeechQueue.add(new SpeechItem(callingApp, duration, params)); if (!mIsSpeaking) { processSpeechQueue(); } return TextToSpeech.TTS_SUCCESS; } - private void silence(final long duration) { + private void silence(final SpeechItem speechItem) { class SilenceThread implements Runnable { public void run() { + long duration = speechItem.mDuration; + String callingApp = speechItem.mCallingApp; + ArrayList<String> params = speechItem.mParams; + String utteranceId = ""; + if (params != null){ + for (int i = 0; i < params.size() - 1; i = i + 2){ + String param = params.get(i); + if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_UTTERANCE_ID)){ + utteranceId = params.get(i+1); + } + } + } try { Thread.sleep(duration); } catch (InterruptedException e) { e.printStackTrace(); } finally { + if (utteranceId.length() > 0){ + dispatchUtteranceCompletedCallback(utteranceId, callingApp); + } + mCurrentSpeechItem = null; processSpeechQueue(); } } @@ -503,6 +538,7 @@ public class TtsService extends Service implements OnCompletionListener { if (utteranceId.length() > 0){ dispatchUtteranceCompletedCallback(utteranceId, callingApp); } + mCurrentSpeechItem = null; processSpeechQueue(); } } @@ -512,12 +548,16 @@ public class TtsService extends Service implements OnCompletionListener { synth.start(); } - private void synthToFileInternalOnly(final String text, - final ArrayList<String> params, final String filename) { + private void synthToFileInternalOnly(final SpeechItem speechItem) { class SynthThread implements Runnable { public void run() { - Log.i("TTS", "Synthesizing to " + filename); + String text = speechItem.mText; + ArrayList<String> params = speechItem.mParams; + String filename = speechItem.mFilename; + String callingApp = speechItem.mCallingApp; boolean synthAvailable = false; + String utteranceId = ""; + Log.i("TTS", "Synthesizing to " + filename); try { synthAvailable = synthesizerLock.tryLock(); if (!synthAvailable) { @@ -542,6 +582,8 @@ public class TtsService extends Service implements OnCompletionListener { country = params.get(i+1); } else if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_VARIANT)){ variant = params.get(i+1); + } else if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_UTTERANCE_ID)){ + utteranceId = params.get(i+1); } } } @@ -560,6 +602,10 @@ public class TtsService extends Service implements OnCompletionListener { if (synthAvailable) { synthesizerLock.unlock(); } + if (utteranceId.length() > 0){ + dispatchUtteranceCompletedCallback(utteranceId, callingApp); + } + mCurrentSpeechItem = null; processSpeechQueue(); } } @@ -647,22 +693,21 @@ public class TtsService extends Service implements OnCompletionListener { return; } - SpeechItem currentSpeechItem = mSpeechQueue.get(0); + mCurrentSpeechItem = mSpeechQueue.get(0); mIsSpeaking = true; - SoundResource sr = getSoundResource(currentSpeechItem); + SoundResource sr = getSoundResource(mCurrentSpeechItem); // Synth speech as needed - synthesizer should call // processSpeechQueue to continue running the queue - Log.i("TTS processing: ", currentSpeechItem.mText); + Log.i("TTS processing: ", mCurrentSpeechItem.mText); if (sr == null) { - if (currentSpeechItem.mType == SpeechItem.TEXT) { - currentSpeechItem = splitCurrentTextIfNeeded(currentSpeechItem); - speakInternalOnly(currentSpeechItem); - } else if (currentSpeechItem.mType == SpeechItem.TEXT_TO_FILE) { - synthToFileInternalOnly(currentSpeechItem.mText, - currentSpeechItem.mParams, currentSpeechItem.mFilename); + if (mCurrentSpeechItem.mType == SpeechItem.TEXT) { + mCurrentSpeechItem = splitCurrentTextIfNeeded(mCurrentSpeechItem); + speakInternalOnly(mCurrentSpeechItem); + } else if (mCurrentSpeechItem.mType == SpeechItem.TEXT_TO_FILE) { + synthToFileInternalOnly(mCurrentSpeechItem); } else { // This is either silence or an earcon that was missing - silence(currentSpeechItem.mDuration); + silence(mCurrentSpeechItem); } } else { cleanUpPlayer(); @@ -696,7 +741,7 @@ public class TtsService extends Service implements OnCompletionListener { } mPlayer.setOnCompletionListener(this); try { - mPlayer.setAudioStreamType(getStreamTypeFromParams(currentSpeechItem.mParams)); + mPlayer.setAudioStreamType(getStreamTypeFromParams(mCurrentSpeechItem.mParams)); mPlayer.start(); } catch (IllegalStateException e) { mSpeechQueue.clear(); |