static int spk_construct (volatile SpeechSynthesizer *spk, char **parameters) { int code; spk->setVolume = spk_setVolume; spk->setRate = spk_setRate; loadSynthesisLibrary(); if ((speechQueue = newQueue(deallocateSpeechItem, NULL))) { if (mpChannelInitEx) { if (!(code = mpChannelInitEx(&speechChannel, NULL, NULL, NULL))) { memset(&speechParameters, 0, sizeof(speechParameters)); speechParameters.nWriteWavHeader = 0; speechParameters.pfnWrite = writeSound; speechParameters.pWriteData = NULL; { const char *name = parameters[PARM_NAME]; if (name && *name) { char tag[0X100]; snprintf(tag, sizeof(tag), "<voice name=\"%s\"/>", name); enqueueTag(tag); } } { const char *pitch = parameters[PARM_PITCH]; if (pitch && *pitch) { int setting = 0; static const int minimum = -10; static const int maximum = 10; if (validateInteger(&setting, pitch, &minimum, &maximum)) { char tag[0X100]; snprintf(tag, sizeof(tag), "<pitch absmiddle=\"%d\"/>", setting); enqueueTag(tag); } else { logMessage(LOG_WARNING, "%s: %s", "invalid pitch specification", pitch); } } } return 1; } else { logSynthesisError(code, "channel initialization"); } } } else { logMessage(LOG_ERR, "Cannot allocate speech queue."); } spk_destruct(spk); return 0; }
static void myerror(volatile SpeechSynthesizer *spk, char *fmt, ...) { char buf[ERRBUFLEN]; int offs; va_list argp; va_start(argp, fmt); offs = snprintf(buf, ERRBUFLEN, "ExternalSpeech: "); if(offs < ERRBUFLEN) { offs += vsnprintf(buf+offs, ERRBUFLEN-offs, fmt, argp); } buf[ERRBUFLEN-1] = 0; va_end(argp); logMessage(LOG_ERR, "%s", buf); spk_destruct(spk); }