summaryrefslogtreecommitdiff
path: root/navit/speech/android/speech_android.c
diff options
context:
space:
mode:
Diffstat (limited to 'navit/speech/android/speech_android.c')
-rw-r--r--navit/speech/android/speech_android.c168
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);
}