diff options
Diffstat (limited to 'navit/speech/android/speech_android.c')
-rw-r--r-- | navit/speech/android/speech_android.c | 168 |
1 files changed, 66 insertions, 102 deletions
diff --git a/navit/speech/android/speech_android.c b/navit/speech/android/speech_android.c index 2b3f2612c..fb0574166 100644 --- a/navit/speech/android/speech_android.c +++ b/navit/speech/android/speech_android.c @@ -27,123 +27,87 @@ #include "speech.h" struct speech_priv { - jclass NavitSpeechClass; - jobject NavitSpeech; - jmethodID NavitSpeech_say; - int flags; + jclass NavitSpeechClass; + jobject NavitSpeech; + jmethodID NavitSpeech_say; + int flags; }; -static int -speech_android_say(struct speech_priv *this, const char *text) -{ - char *str=g_strdup(text); - jstring string; - int i; +static int speech_android_say(struct speech_priv *this, const char *text) { + char *str=g_strdup(text); + jstring string; + char *tok = str; - if (this->flags & 2) { - for (i = 0 ; i < strlen(str) ; i++) { - if (str[i] == 0xc3 && str[i+1] == 0x84) { - str[i]='A'; - str[i+1]='e'; - } - if (str[i] == 0xc3 && str[i+1] == 0x96) { - str[i]='O'; - str[i+1]='e'; - } - if (str[i] == 0xc3 && str[i+1] == 0x9c) { - str[i]='U'; - str[i+1]='e'; - } - if (str[i] == 0xc3 && str[i+1] == 0xa4) { - str[i]='a'; - str[i+1]='e'; - } - if (str[i] == 0xc3 && str[i+1] == 0xb6) { - str[i]='o'; - str[i+1]='e'; - } - if (str[i] == 0xc3 && str[i+1] == 0xbc) { - str[i]='u'; - str[i+1]='e'; - } - if (str[i] == 0xc3 && str[i+1] == 0x9f) { - str[i]='s'; - str[i+1]='s'; - } - } - } - string = (*jnienv)->NewStringUTF(jnienv, str); - dbg(lvl_debug,"enter %s\n",str); - (*jnienv)->CallVoidMethod(jnienv, this->NavitSpeech, this->NavitSpeech_say, string); - (*jnienv)->DeleteLocalRef(jnienv, string); - g_free(str); + /* Replace hyphens with white spaces, or some Android speech SDK will pronounce "hyphen" */ + while (*tok) { + if (*tok=='-') + *tok=' '; + tok++; + } - return 1; + string = (*jnienv)->NewStringUTF(jnienv, str); + dbg(lvl_debug,"enter %s",str); + (*jnienv)->CallVoidMethod(jnienv, this->NavitSpeech, this->NavitSpeech_say, string); + (*jnienv)->DeleteLocalRef(jnienv, string); + g_free(str); + + return 1; } -static void -speech_android_destroy(struct speech_priv *this) { - g_free(this); +static void speech_android_destroy(struct speech_priv *this) { + g_free(this); } static struct speech_methods speech_android_meth = { - speech_android_destroy, - speech_android_say, + speech_android_destroy, + speech_android_say, }; -static int -speech_android_init(struct speech_priv *ret) -{ - jmethodID cid; - char *class="org/navitproject/navit/NavitSpeech2"; - - if (ret->flags & 1) - class="org/navitproject/navit/NavitSpeech"; +static int speech_android_init(struct speech_priv *ret) { + jmethodID cid; + char *class="org/navitproject/navit/NavitSpeech2"; - if (!android_find_class_global(class, &ret->NavitSpeechClass)) { - dbg(lvl_error,"No class found\n"); - return 0; - } - dbg(lvl_debug,"at 3\n"); - cid = (*jnienv)->GetMethodID(jnienv, ret->NavitSpeechClass, "<init>", "(Lorg/navitproject/navit/Navit;)V"); - if (cid == NULL) { - dbg(lvl_error,"no method found\n"); - return 0; /* exception thrown */ - } - if (!android_find_method(ret->NavitSpeechClass, "say", "(Ljava/lang/String;)V", &ret->NavitSpeech_say)) - return 0; - dbg(lvl_debug,"at 4 android_activity=%p\n",android_activity); - ret->NavitSpeech=(*jnienv)->NewObject(jnienv, ret->NavitSpeechClass, cid, android_activity); - dbg(lvl_debug,"result=%p\n",ret->NavitSpeech); - if (!ret->NavitSpeech) - return 0; - if (ret->NavitSpeech) - ret->NavitSpeech = (*jnienv)->NewGlobalRef(jnienv, ret->NavitSpeech); - return 1; + if (!android_find_class_global(class, &ret->NavitSpeechClass)) { + dbg(lvl_error,"No class found"); + return 0; + } + dbg(lvl_debug,"at 3"); + cid = (*jnienv)->GetMethodID(jnienv, ret->NavitSpeechClass, "<init>", "(Lorg/navitproject/navit/Navit;)V"); + if (cid == NULL) { + dbg(lvl_error,"no method found"); + return 0; /* exception thrown */ + } + if (!android_find_method(ret->NavitSpeechClass, "say", "(Ljava/lang/String;)V", &ret->NavitSpeech_say)) + return 0; + dbg(lvl_debug,"at 4 android_activity=%p",android_activity); + ret->NavitSpeech=(*jnienv)->NewObject(jnienv, ret->NavitSpeechClass, cid, android_activity); + dbg(lvl_debug,"result=%p",ret->NavitSpeech); + if (!ret->NavitSpeech) + return 0; + if (ret->NavitSpeech) + ret->NavitSpeech = (*jnienv)->NewGlobalRef(jnienv, ret->NavitSpeech); + return 1; } -static struct speech_priv * -speech_android_new(struct speech_methods *meth, struct attr **attrs, struct attr *parent) { - struct speech_priv *this; - struct attr *flags; - *meth=speech_android_meth; - this=g_new0(struct speech_priv,1); - if (android_version < 4) - this->flags=3; - if (!speech_android_init(this)) { - dbg(lvl_error,"Failed to init speech %p\n",this->NavitSpeechClass); - g_free(this); - this=NULL; - } - if ((flags = attr_search(attrs, NULL, attr_flags))) - this->flags=flags->u.num; - - return this; +static struct speech_priv *speech_android_new(struct speech_methods *meth, struct attr **attrs, struct attr *parent) { + struct speech_priv *this; + struct attr *flags; + *meth=speech_android_meth; + this=g_new0(struct speech_priv,1); + if (android_version < 4) + this->flags=3; + if (!speech_android_init(this)) { + dbg(lvl_error,"Failed to init speech %p",this->NavitSpeechClass); + g_free(this); + this=NULL; + } + if ((flags = attr_search(attrs, NULL, attr_flags))) + this->flags=flags->u.num; + + return this; } -void -plugin_init(void) -{ - plugin_register_category_speech("android", speech_android_new); +void plugin_init(void) { + plugin_register_category_speech("android", speech_android_new); } |