Loading include/tts/TtsEngine.h +8 −15 Original line number Diff line number Diff line Loading @@ -26,6 +26,12 @@ namespace android { #define ANDROID_TTS_ENGINE_PROPERTY_CONFIG "engineConfig" #define ANDROID_TTS_ENGINE_PROPERTY_PITCH "pitch" #define ANDROID_TTS_ENGINE_PROPERTY_RATE "rate" #define ANDROID_TTS_ENGINE_PROPERTY_VOLUME "volume" enum tts_synth_status { TTS_SYNTH_DONE = 0, TTS_SYNTH_PENDING = 1 Loading Loading @@ -85,7 +91,7 @@ public: // Initialize the TTS engine and returns whether initialization succeeded. // @param synthDoneCBPtr synthesis callback function pointer // @return TTS_SUCCESS, or TTS_FAILURE virtual tts_result init(synthDoneCB_t synthDoneCBPtr); virtual tts_result init(synthDoneCB_t synthDoneCBPtr, const char *engineConfig); // Shut down the TTS engine and releases all associated resources. // @return TTS_SUCCESS, or TTS_FAILURE Loading Loading @@ -220,19 +226,6 @@ public: virtual tts_result synthesizeText(const char *text, int8_t *buffer, size_t bufferSize, void *userdata); // Synthesize IPA text. // As the synthesis is performed, the engine invokes the callback to notify // the TTS framework that it has filled the given buffer, and indicates how // many bytes it wrote. The callback is called repeatedly until the engine // has generated all the audio data corresponding to the IPA data. // @param ipa the IPA data to synthesize // @param userdata pointer to be returned when the call is invoked // @param buffer the location where the synthesized data must be written // @param bufferSize the number of bytes that can be written in buffer // @return TTS_FEATURE_UNSUPPORTED if IPA is not supported, // otherwise TTS_SUCCESS or TTS_FAILURE virtual tts_result synthesizeIpa(const char *ipa, int8_t *buffer, size_t bufferSize, void *userdata); }; } // namespace android Loading packages/TtsService/jni/android_tts_SynthProxy.cpp +32 −3 Original line number Diff line number Diff line Loading @@ -383,7 +383,7 @@ android_tts_SynthProxy_setLowShelf(JNIEnv *env, jobject thiz, jboolean applyFilt // ---------------------------------------------------------------------------- static int android_tts_SynthProxy_native_setup(JNIEnv *env, jobject thiz, jobject weak_this, jstring nativeSoLib) jobject weak_this, jstring nativeSoLib, jstring engConfig) { int result = TTS_FAILURE; Loading @@ -395,6 +395,7 @@ android_tts_SynthProxy_native_setup(JNIEnv *env, jobject thiz, DEFAULT_TTS_STREAM_TYPE, DEFAULT_TTS_RATE, DEFAULT_TTS_FORMAT, DEFAULT_TTS_NB_CHANNELS); const char *nativeSoLibNativeString = env->GetStringUTFChars(nativeSoLib, 0); const char *engConfigString = env->GetStringUTFChars(engConfig, 0); void *engine_lib_handle = dlopen(nativeSoLibNativeString, RTLD_NOW | RTLD_LOCAL); Loading @@ -409,7 +410,7 @@ android_tts_SynthProxy_native_setup(JNIEnv *env, jobject thiz, if (pJniStorage->mNativeSynthInterface) { Mutex::Autolock l(engineMutex); pJniStorage->mNativeSynthInterface->init(ttsSynthDoneCB); pJniStorage->mNativeSynthInterface->init(ttsSynthDoneCB, engConfigString); } result = TTS_SUCCESS; Loading @@ -422,6 +423,7 @@ android_tts_SynthProxy_native_setup(JNIEnv *env, jobject thiz, env->SetIntField(thiz, javaTTSFields.synthProxyFieldJniData, (int)pJniStorage); env->ReleaseStringUTFChars(nativeSoLib, nativeSoLibNativeString); env->ReleaseStringUTFChars(engConfig, engConfigString); return result; } Loading Loading @@ -482,6 +484,29 @@ android_tts_SynthProxy_isLanguageAvailable(JNIEnv *env, jobject thiz, jint jniDa return result; } static int android_tts_SynthProxy_setConfig(JNIEnv *env, jobject thiz, jint jniData, jstring engineConfig) { int result = TTS_FAILURE; if (jniData == 0) { LOGE("android_tts_SynthProxy_setConfig(): invalid JNI data"); return result; } Mutex::Autolock l(engineMutex); SynthProxyJniStorage* pSynthData = (SynthProxyJniStorage*)jniData; const char *engineConfigNativeString = env->GetStringUTFChars(engineConfig, 0); if (pSynthData->mNativeSynthInterface) { result = pSynthData->mNativeSynthInterface->setProperty(ANDROID_TTS_ENGINE_PROPERTY_CONFIG, engineConfigNativeString, strlen(engineConfigNativeString)); } env->ReleaseStringUTFChars(engineConfig, engineConfigNativeString); return result; } static int android_tts_SynthProxy_setLanguage(JNIEnv *env, jobject thiz, jint jniData, Loading Loading @@ -867,6 +892,10 @@ static JNINativeMethod gMethods[] = { "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)I", (void*)android_tts_SynthProxy_isLanguageAvailable }, { "native_setConfig", "(ILjava/lang/String;)I", (void*)android_tts_SynthProxy_setConfig }, { "native_setLanguage", "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)I", (void*)android_tts_SynthProxy_setLanguage Loading Loading @@ -896,7 +925,7 @@ static JNINativeMethod gMethods[] = { (void*)android_tts_SynthProxy_shutdown }, { "native_setup", "(Ljava/lang/Object;Ljava/lang/String;)I", "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;)I", (void*)android_tts_SynthProxy_native_setup }, { "native_setLowShelf", Loading packages/TtsService/src/android/tts/SynthProxy.java +7 −4 Original line number Diff line number Diff line Loading @@ -51,7 +51,7 @@ public class SynthProxy { public SynthProxy(String nativeSoLib, String engineConfig) { boolean applyFilter = nativeSoLib.toLowerCase().contains("pico"); Log.v(TtsService.SERVICE_TAG, "About to load "+ nativeSoLib + ", applyFilter="+applyFilter); native_setup(new WeakReference<SynthProxy>(this), nativeSoLib); native_setup(new WeakReference<SynthProxy>(this), nativeSoLib, engineConfig); native_setLowShelf(applyFilter, PICO_FILTER_GAIN, PICO_FILTER_LOWSHELF_ATTENUATION, PICO_FILTER_TRANSITION_FREQ, PICO_FILTER_SHELF_SLOPE); } Loading Loading @@ -105,10 +105,10 @@ public class SynthProxy { } /** * Sets the engine configuration. * Updates the engine configuration. */ public int setConfig(String engineConfig) { return android.speech.tts.TextToSpeech.SUCCESS; return native_setConfig(engineConfig); } /** Loading Loading @@ -180,7 +180,8 @@ public class SynthProxy { */ private int mJniData = 0; private native final int native_setup(Object weak_this, String nativeSoLib); private native final int native_setup(Object weak_this, String nativeSoLib, String engineConfig); private native final int native_setLowShelf(boolean applyFilter, float filterGain, float attenuationInDb, float freqInHz, float slope); Loading @@ -204,6 +205,8 @@ public class SynthProxy { private native final int native_loadLanguage(int jniData, String language, String country, String variant); private native final int native_setConfig(String engineConfig); private native final int native_setSpeechRate(int jniData, int speechRate); private native final int native_setPitch(int jniData, int speechRate); Loading Loading
include/tts/TtsEngine.h +8 −15 Original line number Diff line number Diff line Loading @@ -26,6 +26,12 @@ namespace android { #define ANDROID_TTS_ENGINE_PROPERTY_CONFIG "engineConfig" #define ANDROID_TTS_ENGINE_PROPERTY_PITCH "pitch" #define ANDROID_TTS_ENGINE_PROPERTY_RATE "rate" #define ANDROID_TTS_ENGINE_PROPERTY_VOLUME "volume" enum tts_synth_status { TTS_SYNTH_DONE = 0, TTS_SYNTH_PENDING = 1 Loading Loading @@ -85,7 +91,7 @@ public: // Initialize the TTS engine and returns whether initialization succeeded. // @param synthDoneCBPtr synthesis callback function pointer // @return TTS_SUCCESS, or TTS_FAILURE virtual tts_result init(synthDoneCB_t synthDoneCBPtr); virtual tts_result init(synthDoneCB_t synthDoneCBPtr, const char *engineConfig); // Shut down the TTS engine and releases all associated resources. // @return TTS_SUCCESS, or TTS_FAILURE Loading Loading @@ -220,19 +226,6 @@ public: virtual tts_result synthesizeText(const char *text, int8_t *buffer, size_t bufferSize, void *userdata); // Synthesize IPA text. // As the synthesis is performed, the engine invokes the callback to notify // the TTS framework that it has filled the given buffer, and indicates how // many bytes it wrote. The callback is called repeatedly until the engine // has generated all the audio data corresponding to the IPA data. // @param ipa the IPA data to synthesize // @param userdata pointer to be returned when the call is invoked // @param buffer the location where the synthesized data must be written // @param bufferSize the number of bytes that can be written in buffer // @return TTS_FEATURE_UNSUPPORTED if IPA is not supported, // otherwise TTS_SUCCESS or TTS_FAILURE virtual tts_result synthesizeIpa(const char *ipa, int8_t *buffer, size_t bufferSize, void *userdata); }; } // namespace android Loading
packages/TtsService/jni/android_tts_SynthProxy.cpp +32 −3 Original line number Diff line number Diff line Loading @@ -383,7 +383,7 @@ android_tts_SynthProxy_setLowShelf(JNIEnv *env, jobject thiz, jboolean applyFilt // ---------------------------------------------------------------------------- static int android_tts_SynthProxy_native_setup(JNIEnv *env, jobject thiz, jobject weak_this, jstring nativeSoLib) jobject weak_this, jstring nativeSoLib, jstring engConfig) { int result = TTS_FAILURE; Loading @@ -395,6 +395,7 @@ android_tts_SynthProxy_native_setup(JNIEnv *env, jobject thiz, DEFAULT_TTS_STREAM_TYPE, DEFAULT_TTS_RATE, DEFAULT_TTS_FORMAT, DEFAULT_TTS_NB_CHANNELS); const char *nativeSoLibNativeString = env->GetStringUTFChars(nativeSoLib, 0); const char *engConfigString = env->GetStringUTFChars(engConfig, 0); void *engine_lib_handle = dlopen(nativeSoLibNativeString, RTLD_NOW | RTLD_LOCAL); Loading @@ -409,7 +410,7 @@ android_tts_SynthProxy_native_setup(JNIEnv *env, jobject thiz, if (pJniStorage->mNativeSynthInterface) { Mutex::Autolock l(engineMutex); pJniStorage->mNativeSynthInterface->init(ttsSynthDoneCB); pJniStorage->mNativeSynthInterface->init(ttsSynthDoneCB, engConfigString); } result = TTS_SUCCESS; Loading @@ -422,6 +423,7 @@ android_tts_SynthProxy_native_setup(JNIEnv *env, jobject thiz, env->SetIntField(thiz, javaTTSFields.synthProxyFieldJniData, (int)pJniStorage); env->ReleaseStringUTFChars(nativeSoLib, nativeSoLibNativeString); env->ReleaseStringUTFChars(engConfig, engConfigString); return result; } Loading Loading @@ -482,6 +484,29 @@ android_tts_SynthProxy_isLanguageAvailable(JNIEnv *env, jobject thiz, jint jniDa return result; } static int android_tts_SynthProxy_setConfig(JNIEnv *env, jobject thiz, jint jniData, jstring engineConfig) { int result = TTS_FAILURE; if (jniData == 0) { LOGE("android_tts_SynthProxy_setConfig(): invalid JNI data"); return result; } Mutex::Autolock l(engineMutex); SynthProxyJniStorage* pSynthData = (SynthProxyJniStorage*)jniData; const char *engineConfigNativeString = env->GetStringUTFChars(engineConfig, 0); if (pSynthData->mNativeSynthInterface) { result = pSynthData->mNativeSynthInterface->setProperty(ANDROID_TTS_ENGINE_PROPERTY_CONFIG, engineConfigNativeString, strlen(engineConfigNativeString)); } env->ReleaseStringUTFChars(engineConfig, engineConfigNativeString); return result; } static int android_tts_SynthProxy_setLanguage(JNIEnv *env, jobject thiz, jint jniData, Loading Loading @@ -867,6 +892,10 @@ static JNINativeMethod gMethods[] = { "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)I", (void*)android_tts_SynthProxy_isLanguageAvailable }, { "native_setConfig", "(ILjava/lang/String;)I", (void*)android_tts_SynthProxy_setConfig }, { "native_setLanguage", "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)I", (void*)android_tts_SynthProxy_setLanguage Loading Loading @@ -896,7 +925,7 @@ static JNINativeMethod gMethods[] = { (void*)android_tts_SynthProxy_shutdown }, { "native_setup", "(Ljava/lang/Object;Ljava/lang/String;)I", "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;)I", (void*)android_tts_SynthProxy_native_setup }, { "native_setLowShelf", Loading
packages/TtsService/src/android/tts/SynthProxy.java +7 −4 Original line number Diff line number Diff line Loading @@ -51,7 +51,7 @@ public class SynthProxy { public SynthProxy(String nativeSoLib, String engineConfig) { boolean applyFilter = nativeSoLib.toLowerCase().contains("pico"); Log.v(TtsService.SERVICE_TAG, "About to load "+ nativeSoLib + ", applyFilter="+applyFilter); native_setup(new WeakReference<SynthProxy>(this), nativeSoLib); native_setup(new WeakReference<SynthProxy>(this), nativeSoLib, engineConfig); native_setLowShelf(applyFilter, PICO_FILTER_GAIN, PICO_FILTER_LOWSHELF_ATTENUATION, PICO_FILTER_TRANSITION_FREQ, PICO_FILTER_SHELF_SLOPE); } Loading Loading @@ -105,10 +105,10 @@ public class SynthProxy { } /** * Sets the engine configuration. * Updates the engine configuration. */ public int setConfig(String engineConfig) { return android.speech.tts.TextToSpeech.SUCCESS; return native_setConfig(engineConfig); } /** Loading Loading @@ -180,7 +180,8 @@ public class SynthProxy { */ private int mJniData = 0; private native final int native_setup(Object weak_this, String nativeSoLib); private native final int native_setup(Object weak_this, String nativeSoLib, String engineConfig); private native final int native_setLowShelf(boolean applyFilter, float filterGain, float attenuationInDb, float freqInHz, float slope); Loading @@ -204,6 +205,8 @@ public class SynthProxy { private native final int native_loadLanguage(int jniData, String language, String country, String variant); private native final int native_setConfig(String engineConfig); private native final int native_setSpeechRate(int jniData, int speechRate); private native final int native_setPitch(int jniData, int speechRate); Loading