diff options
Diffstat (limited to 'navit/speech')
-rw-r--r-- | navit/speech/android/speech_android.c | 168 | ||||
-rw-r--r-- | navit/speech/cmdline/speech_cmdline.c | 392 | ||||
-rw-r--r-- | navit/speech/dbus/CMakeLists.txt | 2 | ||||
-rw-r--r-- | navit/speech/dbus/speech_dbus.c | 62 | ||||
-rw-r--r-- | navit/speech/espeak/speak.c | 632 | ||||
-rw-r--r-- | navit/speech/iphone/speech_iphone.m | 12 | ||||
-rw-r--r-- | navit/speech/qt5_espeak/Qt5EspeakAudioOut.cpp | 43 | ||||
-rwxr-xr-x | navit/speech/qt5_espeak/qt5_espeak.cpp | 70 | ||||
-rw-r--r-- | navit/speech/speech_dispatcher/speech_speech_dispatcher.c | 59 |
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); } |