summaryrefslogtreecommitdiff
path: root/navit/speech
diff options
context:
space:
mode:
Diffstat (limited to 'navit/speech')
-rw-r--r--navit/speech/android/speech_android.c168
-rw-r--r--navit/speech/cmdline/speech_cmdline.c392
-rw-r--r--navit/speech/dbus/CMakeLists.txt2
-rw-r--r--navit/speech/dbus/speech_dbus.c62
-rw-r--r--navit/speech/espeak/speak.c632
-rw-r--r--navit/speech/iphone/speech_iphone.m12
-rw-r--r--navit/speech/qt5_espeak/Qt5EspeakAudioOut.cpp43
-rwxr-xr-xnavit/speech/qt5_espeak/qt5_espeak.cpp70
-rw-r--r--navit/speech/speech_dispatcher/speech_speech_dispatcher.c59
9 files changed, 651 insertions, 789 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);
}
diff --git a/navit/speech/cmdline/speech_cmdline.c b/navit/speech/cmdline/speech_cmdline.c
index 490811ce5..11537e570 100644
--- a/navit/speech/cmdline/speech_cmdline.c
+++ b/navit/speech/cmdline/speech_cmdline.c
@@ -38,228 +38,210 @@
#endif
-static char *urldecode(char *str)
-{
- char *ret=g_strdup(str);
- char *src=ret;
- char *dst=ret;
- while (*src) {
- if (*src == '%') {
- int val;
- if (sscanf(src+1,"%02x",&val)) {
- src+=2;
- *dst++=val;
- }
- src++;
- } else
- *dst++=*src++;
- }
- *dst++='\0';
- return ret;
+static char *urldecode(char *str) {
+ char *ret=g_strdup(str);
+ char *src=ret;
+ char *dst=ret;
+ while (*src) {
+ if (*src == '%') {
+ int val;
+ if (sscanf(src+1,"%02x",&val)) {
+ src+=2;
+ *dst++=val;
+ }
+ src++;
+ } else
+ *dst++=*src++;
+ }
+ *dst++='\0';
+ return ret;
}
-static GList *
-speech_cmdline_search(GList *samples, int suffix_len, const char *text, int decode)
-{
- GList *loop_samples=samples,*result=NULL,*recursion_result;
- int shortest_result_length=INT_MAX;
- dbg(lvl_debug,"searching samples for text: '%s'\n",text);
- while (loop_samples) {
- char *sample_name=loop_samples->data;
- int sample_name_len;
- if (decode)
- sample_name=urldecode(sample_name);
- sample_name_len=strlen(sample_name)-suffix_len;
- // TODO: Here we compare UTF-8 text with a filename.
- // It's unclear how a case-insensitive comparison should work
- // in general, so for now we only do it for ASCII text.
- if (!g_ascii_strncasecmp(text, sample_name, sample_name_len)) {
- const char *remaining_text=text+sample_name_len;
- while (*remaining_text == ' ' || *remaining_text == ',')
- remaining_text++;
- dbg(lvl_debug,"sample '%s' matched; remaining text: '%s'\n",sample_name,remaining_text);
- if (*remaining_text) {
- recursion_result=speech_cmdline_search(samples, suffix_len, remaining_text, decode);
- if (recursion_result && g_list_length(recursion_result) < shortest_result_length) {
- g_list_free(result);
- result=recursion_result;
- result=g_list_prepend(result, loop_samples->data);
- shortest_result_length=g_list_length(result);
- } else {
- dbg(lvl_debug,"no (shorter) result found for remaining text '%s', "
- "trying next sample\n", remaining_text);
- g_list_free(recursion_result);
- }
- } else {
- g_list_free(result);
- result=g_list_prepend(NULL, loop_samples->data);
- break;
- }
- }
- if (decode)
- g_free(sample_name);
- loop_samples=g_list_next(loop_samples);
- }
- return result;
+static GList *speech_cmdline_search(GList *samples, int suffix_len, const char *text, int decode) {
+ GList *loop_samples=samples,*result=NULL,*recursion_result;
+ int shortest_result_length=INT_MAX;
+ dbg(lvl_debug,"searching samples for text: '%s'",text);
+ while (loop_samples) {
+ char *sample_name=loop_samples->data;
+ int sample_name_len;
+ if (decode)
+ sample_name=urldecode(sample_name);
+ sample_name_len=strlen(sample_name)-suffix_len;
+ // TODO: Here we compare UTF-8 text with a filename.
+ // It's unclear how a case-insensitive comparison should work
+ // in general, so for now we only do it for ASCII text.
+ if (!g_ascii_strncasecmp(text, sample_name, sample_name_len)) {
+ const char *remaining_text=text+sample_name_len;
+ while (*remaining_text == ' ' || *remaining_text == ',')
+ remaining_text++;
+ dbg(lvl_debug,"sample '%s' matched; remaining text: '%s'",sample_name,remaining_text);
+ if (*remaining_text) {
+ recursion_result=speech_cmdline_search(samples, suffix_len, remaining_text, decode);
+ if (recursion_result && g_list_length(recursion_result) < shortest_result_length) {
+ g_list_free(result);
+ result=recursion_result;
+ result=g_list_prepend(result, loop_samples->data);
+ shortest_result_length=g_list_length(result);
+ } else {
+ dbg(lvl_debug,"no (shorter) result found for remaining text '%s', "
+ "trying next sample\n", remaining_text);
+ g_list_free(recursion_result);
+ }
+ } else {
+ g_list_free(result);
+ result=g_list_prepend(NULL, loop_samples->data);
+ break;
+ }
+ }
+ if (decode)
+ g_free(sample_name);
+ loop_samples=g_list_next(loop_samples);
+ }
+ return result;
}
-#if 0
-
- r=search(l, strlen(path)+1, suffix_len, argv[1]);
- while (r) {
- printf("%s/%s\n",path,r->data);
- r=g_list_next(r);
- }
- return 0;
-#endif
struct speech_priv {
- char *cmdline;
- char *sample_dir;
- char *sample_suffix;
- int flags;
- GList *samples;
- struct spawn_process_info *spi;
+ char *cmdline;
+ char *sample_dir;
+ char *sample_suffix;
+ int flags;
+ GList *samples;
+ struct spawn_process_info *spi;
};
-static int
-speechd_say(struct speech_priv *this, const char *text)
-{
- char **cmdv=g_strsplit(this->cmdline," ", -1);
- int variable_arg_no=-1;
- GList *argl=NULL;
- guint listlen;
- int samplesmode=0;
- int i;
-
- for(i=0;cmdv[i];i++)
- if(strchr(cmdv[i],'%')) {
- variable_arg_no=i;
- break;
- }
-
- if (this->sample_dir && this->sample_suffix) {
- argl=speech_cmdline_search(this->samples, strlen(this->sample_suffix), text, !!(this->flags & 1));
- samplesmode=1;
- listlen=g_list_length(argl);
- dbg(lvl_debug,"For text: '%s', found %d samples.\n",text,listlen);
- if (!listlen){
- dbg(lvl_error,"No matching samples found. Cannot speak text: '%s'\n",text);
- }
- } else {
- listlen=1;
- }
- if(listlen>0) {
- dbg(lvl_debug,"Speaking text '%s'\n",text);
- int argc;
- char**argv;
- int j;
- int cmdvlen=g_strv_length(cmdv);
- argc=cmdvlen + listlen - (variable_arg_no>0?1:0);
- argv=g_new(char *,argc+1);
- if(variable_arg_no==-1) {
- argv[cmdvlen]=g_strdup("%s");
- variable_arg_no=cmdvlen;
- }
-
- for(i=0,j=0;j<argc;) {
- if( i==variable_arg_no ) {
- if (samplesmode) {
- GList *l=argl;
- while(l) {
- char *new_arg;
- new_arg=g_strdup_printf("%s/%s",this->sample_dir,(char *)l->data);
- dbg(lvl_debug,"new_arg %s\n",new_arg);
- argv[j++]=g_strdup_printf(cmdv[i],new_arg);
- g_free(new_arg);
- l=g_list_next(l);
- }
- } else {
- argv[j++]=g_strdup_printf(cmdv[i],text);
- }
- i++;
- } else {
- argv[j++]=g_strdup(cmdv[i++]);
- }
- }
- argv[j]=NULL;
- if (argl)
- // No need to free data elements here as they are
- // still referenced from this->samples
- g_list_free(argl);
+static int speechd_say(struct speech_priv *this, const char *text) {
+ char **cmdv=g_strsplit(this->cmdline," ", -1);
+ int variable_arg_no=-1;
+ GList *argl=NULL;
+ guint listlen;
+ int samplesmode=0;
+ int i;
+
+ for(i=0; cmdv[i]; i++)
+ if(strchr(cmdv[i],'%')) {
+ variable_arg_no=i;
+ break;
+ }
+
+ if (this->sample_dir && this->sample_suffix) {
+ argl=speech_cmdline_search(this->samples, strlen(this->sample_suffix), text, !!(this->flags & 1));
+ samplesmode=1;
+ listlen=g_list_length(argl);
+ dbg(lvl_debug,"For text: '%s', found %d samples.",text,listlen);
+ if (!listlen) {
+ dbg(lvl_error,"No matching samples found. Cannot speak text: '%s'",text);
+ }
+ } else {
+ listlen=1;
+ }
+ if(listlen>0) {
+ dbg(lvl_debug,"Speaking text '%s'",text);
+ int argc;
+ char**argv;
+ int j;
+ int cmdvlen=g_strv_length(cmdv);
+ argc=cmdvlen + listlen - (variable_arg_no>0?1:0);
+ argv=g_new(char *,argc+1);
+ if(variable_arg_no==-1) {
+ argv[cmdvlen]=g_strdup("%s");
+ variable_arg_no=cmdvlen;
+ }
+
+ for(i=0,j=0; j<argc;) {
+ if( i==variable_arg_no ) {
+ if (samplesmode) {
+ GList *l=argl;
+ while(l) {
+ char *new_arg;
+ new_arg=g_strdup_printf("%s/%s",this->sample_dir,(char *)l->data);
+ dbg(lvl_debug,"new_arg %s",new_arg);
+ argv[j++]=g_strdup_printf(cmdv[i],new_arg);
+ g_free(new_arg);
+ l=g_list_next(l);
+ }
+ } else {
+ argv[j++]=g_strdup_printf(cmdv[i],text);
+ }
+ i++;
+ } else {
+ argv[j++]=g_strdup(cmdv[i++]);
+ }
+ }
+ argv[j]=NULL;
+ if (argl)
+ // No need to free data elements here as they are
+ // still referenced from this->samples
+ g_list_free(argl);
- if(this->spi) {
- spawn_process_check_status(this->spi,1); // Block until previous spawned speech process is terminated.
- spawn_process_info_free(this->spi);
- }
- this->spi=spawn_process(argv);
- g_strfreev(argv);
- }
- g_strfreev(cmdv);
- return 0;
+ if(this->spi) {
+ spawn_process_check_status(this->spi,1); // Block until previous spawned speech process is terminated.
+ spawn_process_info_free(this->spi);
+ }
+ this->spi=spawn_process(argv);
+ g_strfreev(argv);
+ }
+ g_strfreev(cmdv);
+ return 0;
}
-static void
-speechd_destroy(struct speech_priv *this) {
- GList *l=this->samples;
- g_free(this->cmdline);
- g_free(this->sample_dir);
- g_free(this->sample_suffix);
- while(l) {
- g_free(l->data);
- }
- g_list_free(this->samples);
- if(this->spi)
- spawn_process_info_free(this->spi);
- g_free(this);
+static void speechd_destroy(struct speech_priv *this) {
+ GList *l=this->samples;
+ g_free(this->cmdline);
+ g_free(this->sample_dir);
+ g_free(this->sample_suffix);
+ while(l) {
+ g_free(l->data);
+ }
+ g_list_free(this->samples);
+ if(this->spi)
+ spawn_process_info_free(this->spi);
+ g_free(this);
}
static struct speech_methods speechd_meth = {
- speechd_destroy,
- speechd_say,
+ speechd_destroy,
+ speechd_say,
};
-static struct speech_priv *
-speechd_new(struct speech_methods *meth, struct attr **attrs, struct attr *parent) {
- struct speech_priv *this;
- struct attr *attr;
- attr=attr_search(attrs, NULL, attr_data);
- if (! attr)
- return NULL;
- this=g_new0(struct speech_priv,1);
- this->cmdline=g_strdup(attr->u.str);
- if ((attr=attr_search(attrs, NULL, attr_sample_dir)))
- this->sample_dir=g_strdup(attr->u.str);
- if ((attr=attr_search(attrs, NULL, attr_sample_suffix)))
- this->sample_suffix=g_strdup(attr->u.str);
- if ((attr=attr_search(attrs, NULL, attr_flags)))
- this->flags=attr->u.num;
- if (this->sample_dir && this->sample_suffix) {
- void *handle=file_opendir(this->sample_dir);
- if (!handle) {
- dbg(lvl_error,"Cannot read sample directory contents: %s", this->sample_dir);
- return NULL;
- }
- char *name;
- int suffix_len=strlen(this->sample_suffix);
- while((name=file_readdir(handle))) {
- int len=strlen(name);
- if (len > suffix_len) {
- if (!strcmp(name+len-suffix_len, this->sample_suffix)) {
- dbg(lvl_debug,"found %s\n",name);
- this->samples=g_list_prepend(this->samples, g_strdup(name));
- }
- }
- }
- file_closedir(handle);
- }
- *meth=speechd_meth;
- return this;
+static struct speech_priv *speechd_new(struct speech_methods *meth, struct attr **attrs, struct attr *parent) {
+ struct speech_priv *this;
+ struct attr *attr;
+ attr=attr_search(attrs, NULL, attr_data);
+ if (! attr)
+ return NULL;
+ this=g_new0(struct speech_priv,1);
+ this->cmdline=g_strdup(attr->u.str);
+ if ((attr=attr_search(attrs, NULL, attr_sample_dir)))
+ this->sample_dir=g_strdup(attr->u.str);
+ if ((attr=attr_search(attrs, NULL, attr_sample_suffix)))
+ this->sample_suffix=g_strdup(attr->u.str);
+ if ((attr=attr_search(attrs, NULL, attr_flags)))
+ this->flags=attr->u.num;
+ if (this->sample_dir && this->sample_suffix) {
+ void *handle=file_opendir(this->sample_dir);
+ if (!handle) {
+ dbg(lvl_error,"Cannot read sample directory contents: %s", this->sample_dir);
+ return NULL;
+ }
+ char *name;
+ int suffix_len=strlen(this->sample_suffix);
+ while((name=file_readdir(handle))) {
+ int len=strlen(name);
+ if (len > suffix_len) {
+ if (!strcmp(name+len-suffix_len, this->sample_suffix)) {
+ dbg(lvl_debug,"found %s",name);
+ this->samples=g_list_prepend(this->samples, g_strdup(name));
+ }
+ }
+ }
+ file_closedir(handle);
+ }
+ *meth=speechd_meth;
+ return this;
}
-void
-plugin_init(void)
-{
- plugin_register_category_speech("cmdline", speechd_new);
+void plugin_init(void) {
+ plugin_register_category_speech("cmdline", speechd_new);
}
diff --git a/navit/speech/dbus/CMakeLists.txt b/navit/speech/dbus/CMakeLists.txt
index 87413018a..c2e32eb8c 100644
--- a/navit/speech/dbus/CMakeLists.txt
+++ b/navit/speech/dbus/CMakeLists.txt
@@ -1 +1 @@
-module_add_library(speech_dbus speech_dbus.c)
+module_add_library(speech_dbus speech_dbus.c)
diff --git a/navit/speech/dbus/speech_dbus.c b/navit/speech/dbus/speech_dbus.c
index 0fdfb71ab..a3d60620c 100644
--- a/navit/speech/dbus/speech_dbus.c
+++ b/navit/speech/dbus/speech_dbus.c
@@ -28,50 +28,44 @@
#include "speech.h"
struct speech_priv {
- struct navit *nav;
+ struct navit *nav;
};
-static int
-speech_dbus_say(struct speech_priv *this, const char *text)
-{
- struct attr attr1,attr2,cb,*attr_list[3];
- int valid=0;
- attr1.type=attr_type;
- attr1.u.str="speech";
- attr2.type=attr_data;
- attr2.u.str=(char *)text;
- attr_list[0]=&attr1;
- attr_list[1]=&attr2;
- attr_list[2]=NULL;
- if (navit_get_attr(this->nav, attr_callback_list, &cb, NULL))
- callback_list_call_attr_4(cb.u.callback_list, attr_command, "dbus_send_signal", attr_list, NULL, &valid);
- return 0;
+static int speech_dbus_say(struct speech_priv *this, const char *text) {
+ struct attr attr1,attr2,cb,*attr_list[3];
+ int valid=0;
+ attr1.type=attr_type;
+ attr1.u.str="speech";
+ attr2.type=attr_data;
+ attr2.u.str=(char *)text;
+ attr_list[0]=&attr1;
+ attr_list[1]=&attr2;
+ attr_list[2]=NULL;
+ if (navit_get_attr(this->nav, attr_callback_list, &cb, NULL))
+ callback_list_call_attr_4(cb.u.callback_list, attr_command, "dbus_send_signal", attr_list, NULL, &valid);
+ return 0;
}
-static void
-speech_dbus_destroy(struct speech_priv *this) {
- g_free(this);
+static void speech_dbus_destroy(struct speech_priv *this) {
+ g_free(this);
}
static struct speech_methods speech_dbus_meth = {
- speech_dbus_destroy,
- speech_dbus_say,
+ speech_dbus_destroy,
+ speech_dbus_say,
};
-static struct speech_priv *
-speech_dbus_new(struct speech_methods *meth, struct attr **attrs, struct attr *parent) {
- struct speech_priv *this;
- if (!parent || parent->type != attr_navit)
- return NULL;
- this=g_new(struct speech_priv,1);
- this->nav=parent->u.navit;
- *meth=speech_dbus_meth;
- return this;
+static struct speech_priv *speech_dbus_new(struct speech_methods *meth, struct attr **attrs, struct attr *parent) {
+ struct speech_priv *this;
+ if (!parent || parent->type != attr_navit)
+ return NULL;
+ this=g_new(struct speech_priv,1);
+ this->nav=parent->u.navit;
+ *meth=speech_dbus_meth;
+ return this;
}
-void
-plugin_init(void)
-{
- plugin_register_category_speech("dbus", speech_dbus_new);
+void plugin_init(void) {
+ plugin_register_category_speech("dbus", speech_dbus_new);
}
diff --git a/navit/speech/espeak/speak.c b/navit/speech/espeak/speak.c
index 329a05d01..1aebcf318 100644
--- a/navit/speech/espeak/speak.c
+++ b/navit/speech/espeak/speak.c
@@ -56,287 +56,247 @@ int (* uri_callback)(int, const char *, const char *) = NULL;
int (* phoneme_callback)(const char *) = NULL;
FILE *f_wave = NULL;
-int GetFileLength(const char *filename)
-{
- struct stat statbuf;
+int GetFileLength(const char *filename) {
+ struct stat statbuf;
- if(stat(filename,&statbuf) != 0)
- return(0);
+ if(stat(filename,&statbuf) != 0)
+ return(0);
- if((statbuf.st_mode & S_IFMT) == S_IFDIR)
- return(-2); // a directory
+ if((statbuf.st_mode & S_IFMT) == S_IFDIR)
+ return(-2); // a directory
- return(statbuf.st_size);
+ return(statbuf.st_size);
}
-void MarkerEvent(int type, unsigned int char_position, int value, unsigned char *out_ptr)
-{
+void MarkerEvent(int type, unsigned int char_position, int value, int value2, unsigned char *out_ptr){
}
-char *Alloc(int size)
-{
- return g_malloc(size);
+char *Alloc(int size) {
+ return g_malloc(size);
}
-void Free(void *ptr)
-{
- g_free(ptr);
+void Free(void *ptr) {
+ g_free(ptr);
}
// --------------------------------------------------------------------
-enum speech_messages
-{
- msg_say = WM_USER,
- msg_exit
+enum speech_messages {
+ msg_say = WM_USER,
+ msg_exit
};
-enum speech_state
-{
- state_available,
- state_speaking_phase_1,
- state_speaking_phase_2,
- state_speaking_phase_3
+enum speech_state {
+ state_available,
+ state_speaking_phase_1,
+ state_speaking_phase_2,
+ state_speaking_phase_3
};
struct speech_priv {
- GList *free_buffers;
- HWAVEOUT h_wave_out;
- enum speech_state state;
- GList *phrases;
- HWND h_queue;
- HANDLE h_message_thread;
+ GList *free_buffers;
+ HWAVEOUT h_wave_out;
+ enum speech_state state;
+ GList *phrases;
+ HWND h_queue;
+ HANDLE h_message_thread;
};
-static void waveout_close(struct speech_priv* sp_priv)
-{
- waveOutClose(sp_priv->h_wave_out);
+static void waveout_close(struct speech_priv* sp_priv) {
+ waveOutClose(sp_priv->h_wave_out);
}
-static BOOL waveout_open(struct speech_priv* sp_priv)
-{
- MMRESULT result = 0;
-
- HWAVEOUT hwo;
- static WAVEFORMATEX wmTemp;
- wmTemp.wFormatTag = WAVE_FORMAT_PCM;
- wmTemp.nChannels = 1;
- wmTemp.nSamplesPerSec = 22050;
- wmTemp.wBitsPerSample = 16;
- wmTemp.nBlockAlign = wmTemp.nChannels * wmTemp.wBitsPerSample / 8;
- wmTemp.nAvgBytesPerSec = wmTemp.nSamplesPerSec * wmTemp.nBlockAlign;
- wmTemp.cbSize = 0;
- result = waveOutOpen(&hwo, (UINT) WAVE_MAPPER, &wmTemp, (DWORD)sp_priv->h_queue, (DWORD)sp_priv, CALLBACK_WINDOW);
- sp_priv->h_wave_out = hwo;
-
- return (result==MMSYSERR_NOERROR);
+static BOOL waveout_open(struct speech_priv* sp_priv) {
+ MMRESULT result = 0;
+
+ HWAVEOUT hwo;
+ static WAVEFORMATEX wmTemp;
+ wmTemp.wFormatTag = WAVE_FORMAT_PCM;
+ wmTemp.nChannels = 1;
+ wmTemp.nSamplesPerSec = 22050;
+ wmTemp.wBitsPerSample = 16;
+ wmTemp.nBlockAlign = wmTemp.nChannels * wmTemp.wBitsPerSample / 8;
+ wmTemp.nAvgBytesPerSec = wmTemp.nSamplesPerSec * wmTemp.nBlockAlign;
+ wmTemp.cbSize = 0;
+ result = waveOutOpen(&hwo, (UINT) WAVE_MAPPER, &wmTemp, (DWORD)sp_priv->h_queue, (DWORD)sp_priv, CALLBACK_WINDOW);
+ sp_priv->h_wave_out = hwo;
+
+ return (result==MMSYSERR_NOERROR);
}
-static int wave_out(struct speech_priv* sp_priv)
-{
- int isDone;
+static int wave_out(struct speech_priv* sp_priv) {
+ int isDone;
- WAVEHDR *WaveHeader = g_list_first(sp_priv->free_buffers)->data;
- sp_priv->free_buffers = g_list_remove(sp_priv->free_buffers, WaveHeader);
+ WAVEHDR *WaveHeader = g_list_first(sp_priv->free_buffers)->data;
+ sp_priv->free_buffers = g_list_remove(sp_priv->free_buffers, WaveHeader);
- out_ptr = out_start = WaveHeader->lpData;
- out_end = WaveHeader->lpData + WaveHeader->dwBufferLength;
+ out_ptr = out_start = WaveHeader->lpData;
+ out_end = WaveHeader->lpData + WaveHeader->dwBufferLength;
- isDone = WavegenFill(0);
+ isDone = WavegenFill(0);
- if ( out_ptr < out_end )
- {
- memset ( out_ptr, 0, out_end - out_ptr );
- }
- waveOutWrite(sp_priv->h_wave_out, WaveHeader, sizeof(WAVEHDR));
+ if ( out_ptr < out_end ) {
+ memset ( out_ptr, 0, out_end - out_ptr );
+ }
+ waveOutWrite(sp_priv->h_wave_out, WaveHeader, sizeof(WAVEHDR));
- return isDone;
+ return isDone;
}
-static BOOL initialise(void)
-{
- int param;
- int result;
-
- WavegenInit(22050,0); // 22050
- if((result = LoadPhData()) != 1)
- {
- if(result == -1)
- {
- dbg(lvl_error, "Failed to load espeak-data\n");
- return FALSE;
- }
- else
- dbg(lvl_error, "Wrong version of espeak-data 0x%x (expects 0x%x) at %s\n",result,version_phdata,path_home);
- }
- LoadConfig();
- SetVoiceStack(NULL);
- SynthesizeInit();
-
- for(param=0; param<N_SPEECH_PARAM; param++)
- param_stack[0].parameter[param] = param_defaults[param];
-
- return TRUE;
+static BOOL initialise(void) {
+ int param;
+ int result;
+
+ WavegenInit(22050,0); // 22050
+ if((result = LoadPhData(NULL)) != 1) {
+ if(result == -1) {
+ dbg(lvl_error, "Failed to load espeak-data");
+ return FALSE;
+ } else
+ dbg(lvl_error, "Wrong version of espeak-data 0x%x (expects 0x%x) at %s",result,version_phdata,path_home);
+ }
+ LoadConfig();
+ SetVoiceStack(NULL, "");
+ SynthesizeInit();
+
+ for(param=0; param<N_SPEECH_PARAM; param++)
+ param_stack[0].parameter[param] = param_defaults[param];
+
+ return TRUE;
}
-static void fill_buffer(struct speech_priv *this)
-{
- while ( this->free_buffers && this->state != state_speaking_phase_3 )
- {
- if(Generate(phoneme_list,&n_phoneme_list,1)==0)
- {
- if (!SpeakNextClause(NULL,NULL,1))
- {
- this->state = state_speaking_phase_2;
- }
- }
-
- if ( wave_out(this)!= 0 && this->state == state_speaking_phase_2)
- {
- this->state = state_speaking_phase_3;
- }
- }
+static void fill_buffer(struct speech_priv *this) {
+ while ( this->free_buffers && this->state != state_speaking_phase_3 ) {
+ if(Generate(phoneme_list,&n_phoneme_list,1)==0) {
+ if (!SpeakNextClause(NULL,NULL,1)) {
+ this->state = state_speaking_phase_2;
+ }
+ }
+
+ if ( wave_out(this)!= 0 && this->state == state_speaking_phase_2) {
+ this->state = state_speaking_phase_3;
+ }
+ }
}
-static void start_speaking(struct speech_priv* sp_priv)
-{
- char *phrase = g_list_first(sp_priv->phrases)->data;
+static void start_speaking(struct speech_priv* sp_priv) {
+ char *phrase = g_list_first(sp_priv->phrases)->data;
- sp_priv->state = state_speaking_phase_1;
+ sp_priv->state = state_speaking_phase_1;
- SpeakNextClause(NULL, phrase,0);
- wave_out(sp_priv);
- fill_buffer(sp_priv);
+ SpeakNextClause(NULL, phrase,0);
+ wave_out(sp_priv);
+ fill_buffer(sp_priv);
}
-static LRESULT CALLBACK speech_message_handler( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
-{
- dbg(lvl_debug, "message_handler called\n");
-
- switch (uMsg)
- {
- case msg_say:
- {
- struct speech_priv* sp_priv = (struct speech_priv*)wParam;
- sp_priv->phrases = g_list_append(sp_priv->phrases, (char*)lParam);
-
- if ( sp_priv->state == state_available )
- {
- start_speaking(sp_priv);
- }
-
- }
- break;
- case MM_WOM_DONE:
- {
- WAVEHDR *WaveHeader = (WAVEHDR *)lParam;
- struct speech_priv* sp_priv;
- dbg(lvl_info, "Wave buffer done\n");
-
- sp_priv = (struct speech_priv*)WaveHeader->dwUser;
- sp_priv->free_buffers = g_list_append(sp_priv->free_buffers, WaveHeader);
-
- if ( sp_priv->state != state_speaking_phase_3)
- {
- fill_buffer(sp_priv);
- }
- else if ( g_list_length(sp_priv->free_buffers) == BUFFERS && sp_priv->state == state_speaking_phase_3 )
- {
- // remove the spoken phrase from the list
- char *phrase = g_list_first(sp_priv->phrases)->data;
- g_free( phrase );
- sp_priv->phrases = g_list_remove(sp_priv->phrases, phrase);
-
- if ( sp_priv->phrases )
- {
- start_speaking(sp_priv);
- }
- else
- {
- sp_priv->state = state_available;
- }
- }
- }
- break;
- case msg_exit:
- ExitThread(0);
- break;
-
- default:
- break;
-
- }
-
- return TRUE;
+static LRESULT CALLBACK speech_message_handler( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) {
+ dbg(lvl_debug, "message_handler called");
+
+ switch (uMsg) {
+ case msg_say: {
+ struct speech_priv* sp_priv = (struct speech_priv*)wParam;
+ sp_priv->phrases = g_list_append(sp_priv->phrases, (char*)lParam);
+
+ if ( sp_priv->state == state_available ) {
+ start_speaking(sp_priv);
+ }
+
+ }
+ break;
+ case MM_WOM_DONE: {
+ WAVEHDR *WaveHeader = (WAVEHDR *)lParam;
+ struct speech_priv* sp_priv;
+ dbg(lvl_info, "Wave buffer done");
+
+ sp_priv = (struct speech_priv*)WaveHeader->dwUser;
+ sp_priv->free_buffers = g_list_append(sp_priv->free_buffers, WaveHeader);
+
+ if ( sp_priv->state != state_speaking_phase_3) {
+ fill_buffer(sp_priv);
+ } else if ( g_list_length(sp_priv->free_buffers) == BUFFERS && sp_priv->state == state_speaking_phase_3 ) {
+ // remove the spoken phrase from the list
+ char *phrase = g_list_first(sp_priv->phrases)->data;
+ g_free( phrase );
+ sp_priv->phrases = g_list_remove(sp_priv->phrases, phrase);
+
+ if ( sp_priv->phrases ) {
+ start_speaking(sp_priv);
+ } else {
+ sp_priv->state = state_available;
+ }
+ }
+ }
+ break;
+ case msg_exit:
+ ExitThread(0);
+ break;
+
+ default:
+ break;
+
+ }
+
+ return TRUE;
}
-static void speech_message_dispatcher( struct speech_priv * sp_priv)
-{
- BOOL bRet;
- MSG msg;
+static void speech_message_dispatcher( struct speech_priv * sp_priv) {
+ BOOL bRet;
+ MSG msg;
- while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
- {
- if (bRet == -1)
- {
- dbg(lvl_error, "Error getting message from queue\n");
+ while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0) {
+ if (bRet == -1) {
+ dbg(lvl_error, "Error getting message from queue");
break;
- }
- else
- {
+ } else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
-static void create_buffers(struct speech_priv *sp_priv)
-{
- int buffer_counter;
- char *buffer_head;
+static void create_buffers(struct speech_priv *sp_priv) {
+ int buffer_counter;
+ char *buffer_head;
SYSTEM_INFO system_info;
GetSystemInfo (&system_info);
- buffer_head = VirtualAlloc(0, system_info.dwPageSize * BUFFERS, MEM_RESERVE, PAGE_NOACCESS);
+ buffer_head = VirtualAlloc(0, system_info.dwPageSize * BUFFERS, MEM_RESERVE, PAGE_NOACCESS);
- for (buffer_counter = 0; buffer_counter < BUFFERS; buffer_counter++)
- {
- WAVEHDR *WaveHeader = g_new0(WAVEHDR, 1);
+ for (buffer_counter = 0; buffer_counter < BUFFERS; buffer_counter++) {
+ WAVEHDR *WaveHeader = g_new0(WAVEHDR, 1);
- WaveHeader->dwBufferLength = system_info.dwPageSize;
- WaveHeader->lpData = (char *)VirtualAlloc(buffer_head, WaveHeader->dwBufferLength, MEM_COMMIT, PAGE_READWRITE);
- buffer_head += WaveHeader->dwBufferLength;
+ WaveHeader->dwBufferLength = system_info.dwPageSize;
+ WaveHeader->lpData = (char *)VirtualAlloc(buffer_head, WaveHeader->dwBufferLength, MEM_COMMIT, PAGE_READWRITE);
+ buffer_head += WaveHeader->dwBufferLength;
- WaveHeader->dwUser = (DWORD)sp_priv;
- waveOutPrepareHeader(sp_priv->h_wave_out, WaveHeader, sizeof(WAVEHDR));
+ WaveHeader->dwUser = (DWORD)sp_priv;
+ waveOutPrepareHeader(sp_priv->h_wave_out, WaveHeader, sizeof(WAVEHDR));
- sp_priv->free_buffers = g_list_append( sp_priv->free_buffers, WaveHeader );
- }
+ sp_priv->free_buffers = g_list_append( sp_priv->free_buffers, WaveHeader );
+ }
}
-static DWORD startThread( LPVOID sp_priv)
-{
- struct speech_priv *this = (struct speech_priv *) sp_priv;
- // Create message queue
- TCHAR *g_szClassName = TEXT("SpeechQueue");
+static DWORD startThread( LPVOID sp_priv) {
+ struct speech_priv *this = (struct speech_priv *) sp_priv;
+ // Create message queue
+ TCHAR *g_szClassName = TEXT("SpeechQueue");
WNDCLASS wc;
HWND hwnd;
- HWND hWndParent;
+ HWND hWndParent;
- memset(&wc, 0 , sizeof(WNDCLASS));
+ memset(&wc, 0, sizeof(WNDCLASS));
wc.lpfnWndProc = speech_message_handler;
wc.hInstance = GetModuleHandle(NULL);
wc.lpszClassName = g_szClassName;
- if (!RegisterClass(&wc))
- {
- dbg(lvl_error, "Window registration for message queue failed\n");
+ if (!RegisterClass(&wc)) {
+ dbg(lvl_error, "Window registration for message queue failed");
return 1;
}
@@ -347,172 +307,158 @@ static DWORD startThread( LPVOID sp_priv)
// create a message only window
hwnd = CreateWindow(
- g_szClassName,
- TEXT("Navit"),
- 0,
- 0,
- 0,
- 0,
- 0,
- hWndParent,
- NULL,
- GetModuleHandle(NULL),
- NULL);
-
- if (hwnd == NULL)
- {
- dbg(lvl_error, "Window creation failed: %d\n", GetLastError());
+ g_szClassName,
+ TEXT("Navit"),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ hWndParent,
+ NULL,
+ GetModuleHandle(NULL),
+ NULL);
+
+ if (hwnd == NULL) {
+ dbg(lvl_error, "Window creation failed: %d", GetLastError());
return 1;
}
this->h_queue = hwnd;
- this->phrases = NULL;
- this->state = state_available;
+ this->phrases = NULL;
+ this->state = state_available;
- if(!waveout_open(this))
- {
- dbg(lvl_error, "Can't open wave output\n");
- return 1;
- }
+ if(!waveout_open(this)) {
+ dbg(lvl_error, "Can't open wave output");
+ return 1;
+ }
- this->free_buffers = NULL;
- create_buffers(this);
+ this->free_buffers = NULL;
+ create_buffers(this);
- speech_message_dispatcher(this);
+ speech_message_dispatcher(this);
return 0;
}
-static int
-espeak_say(struct speech_priv *this, const char *text)
-{
- char *phrase = g_strdup(text);
- dbg(lvl_debug, "Speak: '%s'\n", text);
+static int espeak_say(struct speech_priv *this, const char *text) {
+ char *phrase = g_strdup(text);
+ dbg(lvl_debug, "Speak: '%s'", text);
- if (!PostMessage(this->h_queue, msg_say, (WPARAM)this, (LPARAM)phrase))
- {
- dbg(lvl_error, "PostThreadMessage 'say' failed\n");
- }
+ if (!PostMessage(this->h_queue, msg_say, (WPARAM)this, (LPARAM)phrase)) {
+ dbg(lvl_error, "PostThreadMessage 'say' failed");
+ }
- return 0;
+ return 0;
}
-static void free_list(gpointer pointer, gpointer this )
-{
- if ( this )
- {
- struct speech_priv *sp_priv = (struct speech_priv *)this;
- WAVEHDR *WaveHeader = (WAVEHDR *)pointer;
-
- waveOutUnprepareHeader(sp_priv->h_wave_out, WaveHeader, sizeof(WAVEHDR));
- VirtualFree(WaveHeader->lpData, WaveHeader->dwBufferLength, MEM_DECOMMIT);
- }
- g_free(pointer);
+static void free_list(gpointer pointer, gpointer this ) {
+ if ( this ) {
+ struct speech_priv *sp_priv = (struct speech_priv *)this;
+ WAVEHDR *WaveHeader = (WAVEHDR *)pointer;
+
+ waveOutUnprepareHeader(sp_priv->h_wave_out, WaveHeader, sizeof(WAVEHDR));
+ VirtualFree(WaveHeader->lpData, WaveHeader->dwBufferLength, MEM_DECOMMIT);
+ }
+ g_free(pointer);
}
-static void
-espeak_destroy(struct speech_priv *this)
-{
- g_list_foreach( this->free_buffers, free_list, (gpointer)this );
- g_list_free( this->free_buffers );
+static void espeak_destroy(struct speech_priv *this) {
+ g_list_foreach( this->free_buffers, free_list, (gpointer)this );
+ g_list_free( this->free_buffers );
- g_list_foreach( this->phrases, free_list, 0 );
- g_list_free(this->phrases);
+ g_list_foreach( this->phrases, free_list, 0 );
+ g_list_free(this->phrases);
- waveout_close(this);
- g_free(this);
+ waveout_close(this);
+ g_free(this);
}
static struct speech_methods espeak_meth = {
- espeak_destroy,
- espeak_say,
+ espeak_destroy,
+ espeak_say,
};
-static struct speech_priv *
-espeak_new(struct speech_methods *meth, struct attr **attrs, struct attr *parent) {
- struct speech_priv *this = NULL;
- struct attr *path;
- struct attr *language;
- char *lang_str=NULL;
-
- path=attr_search(attrs, NULL, attr_path);
- if (path)
- strcpy(path_home,path->u.str);
- else
- sprintf(path_home,"%s/espeak-data",getenv("NAVIT_SHAREDIR"));
- dbg(lvl_debug,"path_home set to %s\n",path_home);
-
- if ( !initialise() )
- {
- return NULL;
- }
-
- language=attr_search(attrs, NULL, attr_language);
- if ( language ) {
- lang_str=g_strdup(language->u.str);
- } else {
- char *lang_env=getenv("LANG");
-
- if (lang_env) {
- char *country,*lang,*lang_full;
- char *file1;
- char *file2;
- lang_full=g_strdup(lang_env);
- strtolower(lang_full,lang_env);
- lang=g_strdup(lang_full);
- country=strchr(lang_full,'_');
- if (country) {
- lang[country-lang_full]='\0';
- *country++='-';
- }
- file1=g_strdup_printf("%s/voices/%s",path_home,lang_full);
- file2=g_strdup_printf("%s/voices/%s/%s",path_home,lang,lang_full);
- dbg(lvl_debug,"Testing %s and %s\n",file1,file2);
- if (file_exists(file1) || file_exists(file2))
- lang_str=g_strdup(lang_full);
- else
- lang_str=g_strdup(lang);
- dbg(lvl_debug,"Language full %s lang %s result %s\n",lang_full,lang,lang_str);
- g_free(lang_full);
- g_free(lang);
- g_free(file1);
- g_free(file2);
- }
- }
- if(lang_str && SetVoiceByName(lang_str) != EE_OK)
- {
- dbg(lvl_error, "Error setting language to: '%s',falling back to default\n", lang_str);
- g_free(lang_str);
- lang_str=NULL;
- }
- if(!lang_str && SetVoiceByName("default") != EE_OK) {
- dbg(lvl_error, "Error setting language to default\n");
- }
-
-
- SetParameter(espeakRATE,170,0);
- SetParameter(espeakVOLUME,100,0);
- SetParameter(espeakCAPITALS,option_capitals,0);
- SetParameter(espeakPUNCTUATION,option_punctuation,0);
- SetParameter(espeakWORDGAP,0,0);
+static struct speech_priv *espeak_new(struct speech_methods *meth, struct attr **attrs, struct attr *parent) {
+ struct speech_priv *this = NULL;
+ struct attr *path;
+ struct attr *language;
+ char *lang_str=NULL;
+
+ path=attr_search(attrs, NULL, attr_path);
+ if (path)
+ strcpy(path_home,path->u.str);
+ else
+ sprintf(path_home,"%s/espeak-data",getenv("NAVIT_SHAREDIR"));
+ dbg(lvl_debug,"path_home set to %s",path_home);
+
+ if ( !initialise() ) {
+ return NULL;
+ }
+
+ language=attr_search(attrs, NULL, attr_language);
+ if ( language ) {
+ lang_str=g_strdup(language->u.str);
+ } else {
+ char *lang_env=getenv("LANG");
+
+ if (lang_env) {
+ char *country,*lang,*lang_full;
+ char *file1;
+ char *file2;
+ lang_full=g_strdup(lang_env);
+ strtolower(lang_full,lang_env);
+ lang=g_strdup(lang_full);
+ country=strchr(lang_full,'_');
+ if (country) {
+ lang[country-lang_full]='\0';
+ *country++='-';
+ }
+ file1=g_strdup_printf("%s/voices/%s",path_home,lang_full);
+ file2=g_strdup_printf("%s/voices/%s/%s",path_home,lang,lang_full);
+ dbg(lvl_debug,"Testing %s and %s",file1,file2);
+ if (file_exists(file1) || file_exists(file2))
+ lang_str=g_strdup(lang_full);
+ else
+ lang_str=g_strdup(lang);
+ dbg(lvl_debug,"Language full %s lang %s result %s",lang_full,lang,lang_str);
+ g_free(lang_full);
+ g_free(lang);
+ g_free(file1);
+ g_free(file2);
+ }
+ }
+ if(lang_str && SetVoiceByName(lang_str) != EE_OK) {
+ dbg(lvl_error, "Error setting language to: '%s',falling back to default", lang_str);
+ g_free(lang_str);
+ lang_str=NULL;
+ }
+ if(!lang_str && SetVoiceByName("default") != EE_OK) {
+ dbg(lvl_error, "Error setting language to default");
+ }
+
+
+ SetParameter(espeakRATE,170,0);
+ SetParameter(espeakVOLUME,100,0);
+ SetParameter(espeakCAPITALS,option_capitals,0);
+ SetParameter(espeakPUNCTUATION,option_punctuation,0);
+ SetParameter(espeakWORDGAP,0,0);
// if(pitch_adjustment != 50)
// {
// SetParameter(espeakPITCH,pitch_adjustment,0);
// }
- DoVoiceChange(voice);
+ DoVoiceChange(voice);
- this=g_new(struct speech_priv,1);
- this->h_message_thread = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)startThread, (PVOID)this, 0, NULL);
+ this=g_new(struct speech_priv,1);
+ this->h_message_thread = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)startThread, (PVOID)this, 0, NULL);
- *meth=espeak_meth;
+ *meth=espeak_meth;
- return this;
+ return this;
}
-void
-plugin_init(void)
-{
- plugin_register_category_speech("espeak", espeak_new);
+void plugin_init(void) {
+ plugin_register_category_speech("espeak", espeak_new);
}
diff --git a/navit/speech/iphone/speech_iphone.m b/navit/speech/iphone/speech_iphone.m
index c77b6fbc2..571f6784b 100644
--- a/navit/speech/iphone/speech_iphone.m
+++ b/navit/speech/iphone/speech_iphone.m
@@ -30,18 +30,18 @@ struct speech_priv {
VSSpeechSynthesizer *speech;
};
-static int
+static int
speech_iphone_say(struct speech_priv *this, const char *text)
{
- dbg(0,"enter %s\n",text);
+ dbg(0,"enter %s",text);
NSString *s=[[NSString alloc]initWithUTF8String: text];
[this->speech startSpeakingString:s toURL:nil];
[s release];
- dbg(0,"ok\n");
+ dbg(0,"ok");
return 1;
}
-static void
+static void
speech_iphone_destroy(struct speech_priv *this)
{
[this->speech release];
@@ -60,7 +60,7 @@ speech_iphone_new(struct speech_methods *meth, struct attr **attrs, struct attr
*meth=speech_iphone_meth;
this=g_new0(struct speech_priv,1);
this->speech=[[NSClassFromString(@"VSSpeechSynthesizer") alloc] init];
- dbg(0,"this->speech=%p\n",this->speech);
+ dbg(0,"this->speech=%p",this->speech);
[this->speech setRate:(float)1.0];
return this;
}
@@ -69,6 +69,6 @@ speech_iphone_new(struct speech_methods *meth, struct attr **attrs, struct attr
void
plugin_init(void)
{
- dbg(0,"enter\n");
+ dbg(0,"enter");
plugin_register_category_speech("iphone", speech_iphone_new);
}
diff --git a/navit/speech/qt5_espeak/Qt5EspeakAudioOut.cpp b/navit/speech/qt5_espeak/Qt5EspeakAudioOut.cpp
index da2c6b3e1..a5e488391 100644
--- a/navit/speech/qt5_espeak/Qt5EspeakAudioOut.cpp
+++ b/navit/speech/qt5_espeak/Qt5EspeakAudioOut.cpp
@@ -23,8 +23,7 @@ extern "C" {
#include "debug.h"
}
-Qt5EspeakAudioOut::Qt5EspeakAudioOut(int samplerate, const char* category)
-{
+Qt5EspeakAudioOut::Qt5EspeakAudioOut(int samplerate, const char* category) {
data = new QByteArray();
buffer = new QBuffer(data);
buffer->open(QIODevice::ReadWrite);
@@ -41,31 +40,30 @@ Qt5EspeakAudioOut::Qt5EspeakAudioOut(int samplerate, const char* category)
QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
if (!info.isFormatSupported(format)) {
dbg(lvl_error,
- "Raw audio format not supported by backend, cannot play audio.\n");
+ "Raw audio format not supported by backend, cannot play audio.");
return;
}
audio = new QAudioOutput(format, this);
/* try to set a rather huge buffer size in order to avoid chopping due to
- * event loop
- * not getting idle. Drawing may take just too long time. This hopefully
- * removes the
- * need to do multi threading with all its problems. May be a problem on
- * systems with
- * really low memory.*/
+ * event loop
+ * not getting idle. Drawing may take just too long time. This hopefully
+ * removes the
+ * need to do multi threading with all its problems. May be a problem on
+ * systems with
+ * really low memory.*/
audio->setBufferSize((samplerate * 1 /*ch*/ * 2 /*samplezize*/) * 5 /*seconds*/);
- dbg(lvl_debug, "Buffer size is: %d\n", audio->bufferSize());
+ dbg(lvl_debug, "Buffer size is: %d", audio->bufferSize());
if (category != NULL)
audio->setCategory(QString(category));
connect(audio, SIGNAL(stateChanged(QAudio::State)), this,
- SLOT(handleStateChanged(QAudio::State)));
+ SLOT(handleStateChanged(QAudio::State)));
/* to cope with resume coming from other thread (of libespeak)*/
connect(this, SIGNAL(call_resume(int)), this, SLOT(resume(int)));
}
-Qt5EspeakAudioOut::~Qt5EspeakAudioOut()
-{
+Qt5EspeakAudioOut::~Qt5EspeakAudioOut() {
delete (audio);
audio = NULL;
delete (buffer);
@@ -74,9 +72,8 @@ Qt5EspeakAudioOut::~Qt5EspeakAudioOut()
data = NULL;
}
-void Qt5EspeakAudioOut::handleStateChanged(QAudio::State newState)
-{
- dbg(lvl_debug, "Enter %d\n", newState);
+void Qt5EspeakAudioOut::handleStateChanged(QAudio::State newState) {
+ dbg(lvl_debug, "Enter %d", newState);
switch (newState) {
case QAudio::ActiveState:
break;
@@ -88,21 +85,19 @@ void Qt5EspeakAudioOut::handleStateChanged(QAudio::State newState)
/*remove all data that was already read*/
data->remove(0, buffer->pos());
buffer->seek(0);
- dbg(lvl_debug, "Size %d\n", data->size());
+ dbg(lvl_debug, "Size %d", data->size());
break;
}
}
-void Qt5EspeakAudioOut::resume(int state)
-{
- dbg(lvl_debug, "Enter %d\n", state);
+void Qt5EspeakAudioOut::resume(int state) {
+ dbg(lvl_debug, "Enter %d", state);
if (audio->state() != QAudio::ActiveState)
audio->start(buffer);
}
-void Qt5EspeakAudioOut::addSamples(short* wav, int numsamples)
-{
- dbg(lvl_debug, "Enter (%d samples)\n", numsamples);
+void Qt5EspeakAudioOut::addSamples(short* wav, int numsamples) {
+ dbg(lvl_debug, "Enter (%d samples)", numsamples);
/*remove all data that was already read (if any)*/
data->remove(0, buffer->pos());
@@ -110,7 +105,7 @@ void Qt5EspeakAudioOut::addSamples(short* wav, int numsamples)
if (numsamples > 0) {
data->append((const char*)wav, numsamples * sizeof(short));
- dbg(lvl_debug, "%ld samples in buffer\n",
+ dbg(lvl_debug, "%ld samples in buffer",
(long int)(buffer->size() / sizeof(short)));
emit call_resume(numsamples);
}
diff --git a/navit/speech/qt5_espeak/qt5_espeak.cpp b/navit/speech/qt5_espeak/qt5_espeak.cpp
index 8d108eae6..a0372ff39 100755
--- a/navit/speech/qt5_espeak/qt5_espeak.cpp
+++ b/navit/speech/qt5_espeak/qt5_espeak.cpp
@@ -56,10 +56,9 @@ struct speech_priv {
};
/* callback from espeak to transfer generated samples */
-int qt5_espeak_SynthCallback(short* wav, int numsamples, espeak_EVENT* events)
-{
+int qt5_espeak_SynthCallback(short* wav, int numsamples, espeak_EVENT* events) {
struct speech_priv* pr = NULL;
- dbg(lvl_debug, "Callback %d samples\n", numsamples);
+ dbg(lvl_debug, "Callback %d samples", numsamples);
if (events != NULL)
pr = (struct speech_priv*)events->user_data;
if ((pr != NULL) && (pr->audio != NULL)) {
@@ -72,9 +71,7 @@ int qt5_espeak_SynthCallback(short* wav, int numsamples, espeak_EVENT* events)
}
/* set up espeak */
-static bool
-qt5_espeak_init_espeak(struct speech_priv* sr, struct attr** attrs)
-{
+static bool qt5_espeak_init_espeak(struct speech_priv* sr, struct attr** attrs) {
struct attr* path;
/* prepare espeak library path home */
@@ -86,12 +83,12 @@ qt5_espeak_init_espeak(struct speech_priv* sr, struct attr** attrs)
sr->path_home = g_strdup_printf("%s", getenv("NAVIT_SHAREDIR"));
#else
/* since no path was given by config, we don't know the path to external
- * espeak data.
- * so give NULL to use default path */
+ * espeak data.
+ * so give NULL to use default path */
sr->path_home = NULL;
#endif
}
- dbg(lvl_debug, "path_home set to %s\n", sr->path_home);
+ dbg(lvl_debug, "path_home set to %s", sr->path_home);
#if INTERNAL_ESPEAK
/*internal espeak is configured to support only synchronous modes */
sr->sample_rate = espeak_Initialize(AUDIO_OUTPUT_SYNCHRONOUS, BUFFERLENGTH, sr->path_home, 0);
@@ -101,19 +98,17 @@ qt5_espeak_init_espeak(struct speech_priv* sr, struct attr** attrs)
sr->sample_rate = espeak_Initialize(AUDIO_OUTPUT_SYNCHRONOUS, BUFFERLENGTH, sr->path_home, 0);
#endif
if (sr->sample_rate == EE_INTERNAL_ERROR) {
- dbg(lvl_error, "Init failed %d\n", sr->sample_rate);
+ dbg(lvl_error, "Init failed %d", sr->sample_rate);
return 1;
}
- dbg(lvl_error, "Sample rate is %d\n", sr->sample_rate);
+ dbg(lvl_error, "Sample rate is %d", sr->sample_rate);
espeak_SetSynthCallback(qt5_espeak_SynthCallback);
return TRUE;
}
/* set language to espeak */
-static bool
-qt5_espeak_init_language(struct speech_priv* pr, struct attr** attrs)
-{
+static bool qt5_espeak_init_language(struct speech_priv* pr, struct attr** attrs) {
struct attr* language;
gchar* lang_str = NULL;
espeak_ERROR error;
@@ -132,13 +127,13 @@ qt5_espeak_init_language(struct speech_priv* pr, struct attr** attrs)
strtolower(lang_str, lang_env);
/* extract language code from LANG environment */
- dbg(lvl_debug, "%s\n", lang_str);
+ dbg(lvl_debug, "%s", lang_str);
country = strchr(lang_str, '_');
- dbg(lvl_debug, "%s\n", country);
+ dbg(lvl_debug, "%s", country);
if (country) {
lang_str[country - lang_str] = '\0';
}
- dbg(lvl_debug, "espeak lang: %s\n", lang_str);
+ dbg(lvl_debug, "espeak lang: %s", lang_str);
}
}
/*TODO (golden water tap): expose all those values as attrs */
@@ -152,16 +147,14 @@ qt5_espeak_init_language(struct speech_priv* pr, struct attr** attrs)
if (lang_str != NULL)
g_free(lang_str);
if (error != EE_OK) {
- dbg(lvl_error, "Unable to set Language\n");
+ dbg(lvl_error, "Unable to set Language");
return false;
}
return true;
}
/* init audio system */
-static bool
-qt5_espeak_init_audio(struct speech_priv* sr, const char* category)
-{
+static bool qt5_espeak_init_audio(struct speech_priv* sr, const char* category) {
try {
sr->audio = new Qt5EspeakAudioOut(sr->sample_rate, category);
} catch (void* exception) {
@@ -175,24 +168,20 @@ qt5_espeak_init_audio(struct speech_priv* sr, const char* category)
* sr - private handle
* text - new (utf8) text
*/
-static int
-qt5_espeak_say(struct speech_priv* sr, const char* text)
-{
+static int qt5_espeak_say(struct speech_priv* sr, const char* text) {
espeak_ERROR error;
- dbg(lvl_debug, "Say \"%s\"\n", text);
+ dbg(lvl_debug, "Say \"%s\"", text);
error = espeak_Synth(text, strlen(text), 0, POS_CHARACTER, 0,
- espeakCHARS_UTF8, NULL, sr);
+ espeakCHARS_UTF8, NULL, sr);
if (error != EE_OK)
- dbg(lvl_error, "Unable to speak! error == %d\n", error);
+ dbg(lvl_error, "Unable to speak! error == %d", error);
return 0;
}
/* destructor */
-static void
-qt5_espeak_destroy(struct speech_priv* sr)
-{
- dbg(lvl_debug, "Enter\n");
+static void qt5_espeak_destroy(struct speech_priv* sr) {
+ dbg(lvl_debug, "Enter");
if (sr->path_home != NULL)
g_free(sr->path_home);
@@ -210,12 +199,10 @@ static struct speech_methods qt5_espeak_meth = {
* attr - get decoded attributes from config
* parent - get parent attributes from config
*/
-static struct speech_priv*
-qt5_espeak_new(struct speech_methods* meth, struct attr** attrs,
- struct attr* parent)
-{
+static struct speech_priv* qt5_espeak_new(struct speech_methods* meth, struct attr** attrs,
+ struct attr* parent) {
struct speech_priv* sr = NULL;
- dbg(lvl_debug, "Enter\n");
+ dbg(lvl_debug, "Enter");
/* allocate handle */
sr = g_new0(struct speech_priv, 1);
@@ -229,24 +216,23 @@ qt5_espeak_new(struct speech_methods* meth, struct attr** attrs,
/* init espeak library */
if (!(sr->espeak_ok = qt5_espeak_init_espeak(sr, attrs))) {
- dbg(lvl_error, "Unable to initialize espeak library\n");
+ dbg(lvl_error, "Unable to initialize espeak library");
}
/* init espeak voice and language */
if (!(sr->espeak_ok = qt5_espeak_init_language(sr, attrs))) {
- dbg(lvl_error, "Unable to initialize espeak language\n");
+ dbg(lvl_error, "Unable to initialize espeak language");
}
/* init qt5 audio using default category*/
if (!(sr->audio_ok = qt5_espeak_init_audio(sr, NULL))) {
- dbg(lvl_error, "Unable to initialize audio\n");
+ dbg(lvl_error, "Unable to initialize audio");
}
return sr;
}
/* initialize this as plugin */
-void plugin_init(void)
-{
- dbg(lvl_debug, "Enter\n");
+void plugin_init(void) {
+ dbg(lvl_debug, "Enter");
plugin_register_category_speech("qt5_espeak", qt5_espeak_new);
}
diff --git a/navit/speech/speech_dispatcher/speech_speech_dispatcher.c b/navit/speech/speech_dispatcher/speech_speech_dispatcher.c
index d22b3f795..c7b38a26d 100644
--- a/navit/speech/speech_dispatcher/speech_speech_dispatcher.c
+++ b/navit/speech/speech_dispatcher/speech_speech_dispatcher.c
@@ -32,50 +32,45 @@
#include "speech.h"
struct speech_priv {
- SPDConnection *conn;
+ SPDConnection *conn;
};
-static int
-speechd_say(struct speech_priv *this, const char *text) {
- int err;
+static int speechd_say(struct speech_priv *this, const char *text) {
+ int err;
- err = spd_sayf(this->conn, SPD_MESSAGE, text);
- if (err != 1)
- return 1;
- return 0;
+ err = spd_sayf(this->conn, SPD_MESSAGE, text);
+ if (err != 1)
+ return 1;
+ return 0;
}
-static void
-speechd_destroy(struct speech_priv *this) {
- spd_close(this->conn);
- g_free(this);
+static void speechd_destroy(struct speech_priv *this) {
+ spd_close(this->conn);
+ g_free(this);
}
static struct speech_methods speechd_meth = {
- speechd_destroy,
- speechd_say,
+ speechd_destroy,
+ speechd_say,
};
-static struct speech_priv *
-speechd_new(struct speech_methods *meth, struct attr **attrs, struct attr *attr) {
- struct speech_priv *this;
- SPDConnection *conn;
+static struct speech_priv *speechd_new(struct speech_methods *meth, struct attr **attrs, struct attr *attr) {
+ struct speech_priv *this;
+ SPDConnection *conn;
- conn = spd_open("navit","main",NULL,SPD_MODE_SINGLE);
- if (! conn)
- return NULL;
- this=g_new(struct speech_priv,1);
- if (this) {
- this->conn=conn;
- *meth=speechd_meth;
- spd_set_punctuation(conn, SPD_PUNCT_NONE);
- }
- return this;
+ conn = spd_open("navit","main",NULL,SPD_MODE_SINGLE);
+ if (! conn)
+ return NULL;
+ this=g_new(struct speech_priv,1);
+ if (this) {
+ this->conn=conn;
+ *meth=speechd_meth;
+ spd_set_punctuation(conn, SPD_PUNCT_NONE);
+ }
+ return this;
}
-void
-plugin_init(void)
-{
- plugin_register_category_speech("speech_dispatcher", speechd_new);
+void plugin_init(void) {
+ plugin_register_category_speech("speech_dispatcher", speechd_new);
}