Calling the espeak library to set speech parameters seems to be an expensive operation. This patch guarantees that we only call espeak_SetParameter to update parameters which have *actually* changed. E.G., the call tts_set_punctuations all should be a no-op when the punctuation mode is already "all". --- servers/linux-espeak/tclespeak.cpp | 27 ++++++++++++++++++++++++--- 1 files changed, 24 insertions(+), 3 deletions(-) diff --git a/servers/linux-espeak/tclespeak.cpp b/servers/linux-espeak/tclespeak.cpp index a4e0b70..14bc3db 100644 --- a/servers/linux-espeak/tclespeak.cpp +++ b/servers/linux-espeak/tclespeak.cpp @@ -216,7 +216,9 @@ int SetRate (ClientData handle, Tcl_Interp * interp, int objc, Tcl_Obj * CONST objv[]) { + static int current_rate = -1; int rc, rate, voice; + int success = 1; if (objc != 3) { Tcl_AppendResult (interp, "Usage: setRate voiceCode speechRate ", @@ -230,7 +232,13 @@ SetRate (ClientData handle, Tcl_Interp * interp, if (rc != TCL_OK) return rc; - return (espeak_SetParameter(espeakRATE, rate, 0) == EE_OK) ? TCL_OK : TCL_ERROR; + if (rate != current_rate) + { + success = (espeak_SetParameter(espeakRATE, rate, 0) == EE_OK); + if (success) + current_rate = rate; + } + return success ? TCL_OK : TCL_ERROR; } //> @@ -447,22 +455,31 @@ int Caps (ClientData handle, Tcl_Interp * interp, int objc, Tcl_Obj * CONST objv[]) { + static const char *current_mode = ""; char* a_mode = (char*)Tcl_GetStringFromObj (objv[1], NULL); - if (a_mode) + if (a_mode && strcmp(a_mode, current_mode)) { int a_type = 0; // none if (strcmp(a_mode,"tone") == 0) { a_type = 1; + current_mode = "tone"; } else if (strcmp(a_mode,"spelling") == 0) { a_type = 2; + current_mode = "spelling"; } else if (strcmp(a_mode,"pitch") == 0) { a_type = 30; + current_mode = "pitch"; + } + else if (strcmp(a_mode, "none") == 0) + { + current_mode = "none"; + // a_type is already 0 (none). No need to assign. } espeak_SetParameter(espeakCAPITALS, a_type, 0); @@ -478,21 +495,25 @@ Punct (ClientData handle, Tcl_Interp * interp, int objc, Tcl_Obj * CONST objv[]) { char* a_mode = (char*)Tcl_GetStringFromObj (objv[1], NULL); - if (a_mode) + static const char *current_mode = ""; + if (a_mode && strcmp(a_mode, current_mode)) { espeak_PUNCT_TYPE a_type = espeakPUNCT_NONE; if (strcmp(a_mode,"none")==0) { a_type = espeakPUNCT_NONE; + current_mode = "none"; } else if (strcmp(a_mode,"all")==0) { a_type = espeakPUNCT_ALL; + current_mode = "all"; } else if (strcmp(a_mode,"some")==0) { a_type = espeakPUNCT_SOME; + current_mode = "some"; } espeak_SetParameter(espeakPUNCTUATION, a_type, 0); -- 1.7.3.2 ----------------------------------------------------------------------------- To unsubscribe from the emacspeak list or change your address on the emacspeak list send mail to "emacspeak-request@xxxxxxxxxxx" with a subject of "unsubscribe" or "help".
If you have questions about this archive or had problems using it, please send mail to:
priestdo@xxxxxxxxxxx No Soliciting!Emacspeak List Archive | 2010 | 2009 | 2008 | 2007 | 2006 | 2005 | 2004 | 2003 | 2002 | 2001 | 2000 | 1999 | 1998 | Pre 1998