summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xcore/java/android/speech/tts/TextToSpeech.java28
-rw-r--r--packages/TtsService/jni/android_tts_SynthProxy.cpp18
-rwxr-xr-xpackages/TtsService/src/android/tts/TtsService.java8
3 files changed, 37 insertions, 17 deletions
diff --git a/core/java/android/speech/tts/TextToSpeech.java b/core/java/android/speech/tts/TextToSpeech.java
index 4794fe1..4e0a87c 100755
--- a/core/java/android/speech/tts/TextToSpeech.java
+++ b/core/java/android/speech/tts/TextToSpeech.java
@@ -820,14 +820,14 @@ public class TextToSpeech {
if (speechRate > 0) {
int rate = (int)(speechRate*100);
mCachedParams[Engine.TTS_PARAM_POSITION_RATE + 1] = String.valueOf(rate);
- result = mITts.setSpeechRate(mPackageName, rate);
+ // the rate is not set here, instead it is cached so it will be associated
+ // with all upcoming utterances.
+ if (speechRate > 0.0f) {
+ result = TTS_SUCCESS;
+ } else {
+ result = TTS_ERROR;
+ }
}
- } catch (RemoteException e) {
- // TTS died; restart it.
- Log.e("TextToSpeech.java - setSpeechRate", "RemoteException");
- e.printStackTrace();
- mStarted = false;
- initTts();
} catch (NullPointerException e) {
// TTS died; restart it.
Log.e("TextToSpeech.java - setSpeechRate", "NullPointerException");
@@ -907,7 +907,9 @@ public class TextToSpeech {
* @param loc
* The locale describing the language to be used.
*
- * @return Code indicating the support status for the locale. See the TTS_LANG_ codes.
+ * @return code indicating the support status for the locale. See {@link #TTS_LANG_AVAILABLE},
+ * {@link #TTS_LANG_COUNTRY_AVAILABLE}, {@link #TTS_LANG_COUNTRY_VAR_AVAILABLE},
+ * {@link #TTS_LANG_MISSING_DATA} and {@link #TTS_LANG_NOT_SUPPORTED}.
*/
public int setLanguage(Locale loc) {
synchronized (mStartLock) {
@@ -919,7 +921,10 @@ public class TextToSpeech {
mCachedParams[Engine.TTS_PARAM_POSITION_LANGUAGE + 1] = loc.getISO3Language();
mCachedParams[Engine.TTS_PARAM_POSITION_COUNTRY + 1] = loc.getISO3Country();
mCachedParams[Engine.TTS_PARAM_POSITION_VARIANT + 1] = loc.getVariant();
- result = mITts.setLanguage(mPackageName,
+ // the language is not set here, instead it is cached so it will be associated
+ // with all upcoming utterances. But we still need to change the language support,
+ // which is achieved by calling isLanguageAvailable()
+ result = mITts.isLanguageAvailable(
mCachedParams[Engine.TTS_PARAM_POSITION_LANGUAGE + 1],
mCachedParams[Engine.TTS_PARAM_POSITION_COUNTRY + 1],
mCachedParams[Engine.TTS_PARAM_POSITION_VARIANT + 1] );
@@ -994,8 +999,9 @@ public class TextToSpeech {
* @param loc
* The Locale describing the language to be used.
*
- * @return one of TTS_LANG_NOT_SUPPORTED, TTS_LANG_MISSING_DATA, TTS_LANG_AVAILABLE,
- * TTS_LANG_COUNTRY_AVAILABLE, TTS_LANG_COUNTRY_VAR_AVAILABLE.
+ * @return code indicating the support status for the locale. See {@link #TTS_LANG_AVAILABLE},
+ * {@link #TTS_LANG_COUNTRY_AVAILABLE}, {@link #TTS_LANG_COUNTRY_VAR_AVAILABLE},
+ * {@link #TTS_LANG_MISSING_DATA} and {@link #TTS_LANG_NOT_SUPPORTED}.
*/
public int isLanguageAvailable(Locale loc) {
synchronized (mStartLock) {
diff --git a/packages/TtsService/jni/android_tts_SynthProxy.cpp b/packages/TtsService/jni/android_tts_SynthProxy.cpp
index 68e3fb7..82067be 100644
--- a/packages/TtsService/jni/android_tts_SynthProxy.cpp
+++ b/packages/TtsService/jni/android_tts_SynthProxy.cpp
@@ -59,6 +59,9 @@ struct afterSynthData_t {
// ----------------------------------------------------------------------------
static fields_t javaTTSFields;
+// TODO move to synth member once we have multiple simultaneous engines running
+static Mutex engineMutex;
+
// ----------------------------------------------------------------------------
class SynthProxyJniStorage {
public :
@@ -194,7 +197,6 @@ static tts_callback_status ttsSynthDoneCB(void *& userdata, uint32_t rate,
if (bufferSize > 0) {
prepAudioTrack(pJniData, pForAfter->streamType, rate, format, channel);
if (pJniData->mAudioOut) {
- pJniData->mAudioOut->start();
pJniData->mAudioOut->write(wav, bufferSize);
memset(wav, 0, bufferSize);
//LOGV("AudioTrack wrote: %d bytes", bufferSize);
@@ -331,6 +333,8 @@ android_tts_SynthProxy_setLanguage(JNIEnv *env, jobject thiz, jint jniData,
return result;
}
+ Mutex::Autolock l(engineMutex);
+
SynthProxyJniStorage* pSynthData = (SynthProxyJniStorage*)jniData;
const char *langNativeString = env->GetStringUTFChars(language, 0);
const char *countryNativeString = env->GetStringUTFChars(country, 0);
@@ -390,6 +394,8 @@ android_tts_SynthProxy_setSpeechRate(JNIEnv *env, jobject thiz, jint jniData,
char buffer [bufSize];
sprintf(buffer, "%d", speechRate);
+ Mutex::Autolock l(engineMutex);
+
SynthProxyJniStorage* pSynthData = (SynthProxyJniStorage*)jniData;
LOGI("setting speech rate to %d", speechRate);
@@ -412,6 +418,8 @@ android_tts_SynthProxy_setPitch(JNIEnv *env, jobject thiz, jint jniData,
return result;
}
+ Mutex::Autolock l(engineMutex);
+
int bufSize = 10;
char buffer [bufSize];
sprintf(buffer, "%d", pitch);
@@ -444,6 +452,8 @@ android_tts_SynthProxy_synthesizeToFile(JNIEnv *env, jobject thiz, jint jniData,
return result;
}
+ Mutex::Autolock l(engineMutex);
+
// Retrieve audio parameters before writing the file header
AudioSystem::audio_format encoding = DEFAULT_TTS_FORMAT;
uint32_t rate = DEFAULT_TTS_RATE;
@@ -546,10 +556,12 @@ android_tts_SynthProxy_speak(JNIEnv *env, jobject thiz, jint jniData,
return result;
}
+ Mutex::Autolock l(engineMutex);
+
SynthProxyJniStorage* pSynthData = (SynthProxyJniStorage*)jniData;
if (pSynthData->mAudioOut) {
- pSynthData->mAudioOut->stop();
+ pSynthData->mAudioOut->start();
}
afterSynthData_t* pForAfter = new (afterSynthData_t);
@@ -600,6 +612,8 @@ android_tts_SynthProxy_shutdown(JNIEnv *env, jobject thiz, jint jniData)
return;
}
+ Mutex::Autolock l(engineMutex);
+
SynthProxyJniStorage* pSynthData = (SynthProxyJniStorage*)jniData;
if (pSynthData->mNativeSynthInterface) {
pSynthData->mNativeSynthInterface->shutdown();
diff --git a/packages/TtsService/src/android/tts/TtsService.java b/packages/TtsService/src/android/tts/TtsService.java
index 28801f8..9a4c97d 100755
--- a/packages/TtsService/src/android/tts/TtsService.java
+++ b/packages/TtsService/src/android/tts/TtsService.java
@@ -546,7 +546,7 @@ public class TtsService extends Service implements OnCompletionListener {
if (!synthAvailable) {
Thread.sleep(100);
Thread synth = (new Thread(new SynthThread()));
- synth.setPriority(Thread.MIN_PRIORITY);
+ //synth.setPriority(Thread.MIN_PRIORITY);
synth.start();
return;
}
@@ -608,7 +608,7 @@ public class TtsService extends Service implements OnCompletionListener {
}
}
Thread synth = (new Thread(new SynthThread()));
- synth.setPriority(Thread.MIN_PRIORITY);
+ //synth.setPriority(Thread.MIN_PRIORITY);
synth.start();
}
@@ -623,7 +623,7 @@ public class TtsService extends Service implements OnCompletionListener {
if (!synthAvailable) {
Thread.sleep(100);
Thread synth = (new Thread(new SynthThread()));
- synth.setPriority(Thread.MIN_PRIORITY);
+ //synth.setPriority(Thread.MIN_PRIORITY);
synth.start();
return;
}
@@ -677,7 +677,7 @@ public class TtsService extends Service implements OnCompletionListener {
}
}
Thread synth = (new Thread(new SynthThread()));
- synth.setPriority(Thread.MIN_PRIORITY);
+ //synth.setPriority(Thread.MIN_PRIORITY);
synth.start();
}