[commit] r1573 - in freeswitch/trunk/src: . include mod/applications/mod_rss mod/asr_tts/mod_cepstral mod/endpoints/mod_wanpipe
Author: anthm Date: Thu Jun 8 15:22:54 2006 New Revision: 1573 Removed: freeswitch/trunk/src/mod/applications/mod_rss/ Modified: freeswitch/trunk/src/include/switch_core.h freeswitch/trunk/src/include/switch_module_interfaces.h freeswitch/trunk/src/include/switch_types.h freeswitch/trunk/src/mod/asr_tts/mod_cepstral/mod_cepstral.c freeswitch/trunk/src/mod/endpoints/mod_wanpipe/mod_wanpipe.c freeswitch/trunk/src/switch_core.c freeswitch/trunk/src/switch_ivr.c Log: ivr stuff (part 1) Modified: freeswitch/trunk/src/include/switch_core.h ============================================================================== --- freeswitch/trunk/src/include/switch_core.h (original) +++ freeswitch/trunk/src/include/switch_core.h Thu Jun 8 15:22:54 2006 @@ -918,6 +918,14 @@ SWITCH_DECLARE(void) switch_core_speech_numeric_param_tts(switch_speech_handle_t *sh, char *param, int val); /*! + \brief Set a float parameter on a TTS handle + \param sh the speech handle + \param param the parameter + \param val the value +*/ +SWITCH_DECLARE(void) switch_core_speech_float_param_tts(switch_speech_handle_t *sh, char *param, double val); + +/*! \brief Read rendered audio from the TTS module \param sh the speech handle to read \param data the buffer to read to Modified: freeswitch/trunk/src/include/switch_module_interfaces.h ============================================================================== --- freeswitch/trunk/src/include/switch_module_interfaces.h (original) +++ freeswitch/trunk/src/include/switch_module_interfaces.h Thu Jun 8 15:22:54 2006 @@ -330,6 +330,7 @@ void (*speech_flush_tts)(switch_speech_handle_t *sh); void (*speech_text_param_tts)(switch_speech_handle_t *sh, char *param, char *val); void (*speech_numeric_param_tts)(switch_speech_handle_t *sh, char *param, int val); + void (*speech_float_param_tts)(switch_speech_handle_t *sh, char *param, double val); const struct switch_speech_interface *next; }; @@ -345,6 +346,9 @@ char *name; /*! The Rate*/ uint32_t rate; + uint32_t speed; + char voice[80]; + char engine[80]; /*! the handle's memory pool */ switch_memory_pool_t *memory_pool; /*! private data for the format module to store handle specific info */ Modified: freeswitch/trunk/src/include/switch_types.h ============================================================================== --- freeswitch/trunk/src/include/switch_types.h (original) +++ freeswitch/trunk/src/include/switch_types.h Thu Jun 8 15:22:54 2006 @@ -424,6 +424,7 @@ SWITCH_SPEECH_FLAG_PEEK = (1 << 3) - Read data but do not erase it. SWITCH_SPEECH_FLAG_FREE_POOL = (1 << 4) - Free interface's pool on destruction. SWITCH_SPEECH_FLAG_BLOCKING = (1 << 5) - Indicate that a blocking call is desired +SWITCH_SPEECH_FLAG_PAUSE = (1 << 6) - Pause toggle for playback </pre> */ typedef enum { @@ -433,6 +434,7 @@ SWITCH_SPEECH_FLAG_PEEK = (1 << 3), SWITCH_SPEECH_FLAG_FREE_POOL = (1 << 4), SWITCH_SPEECH_FLAG_BLOCKING = (1 << 5), + SWITCH_SPEECH_FLAG_PAUSE = (1 << 6) } switch_speech_flag_t; Modified: freeswitch/trunk/src/mod/asr_tts/mod_cepstral/mod_cepstral.c ============================================================================== --- freeswitch/trunk/src/mod/asr_tts/mod_cepstral/mod_cepstral.c (original) +++ freeswitch/trunk/src/mod/asr_tts/mod_cepstral/mod_cepstral.c Thu Jun 8 15:22:54 2006 @@ -36,7 +36,7 @@ #include <swift.h> #include <switch.h> -#define MY_BUF_LEN 1024 * 512 +#define MY_BUF_LEN 1024 * 256 static const char modname[] = "mod_cepstral"; @@ -152,8 +152,14 @@ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to set voice.\n"); goto all_done; } + + voice_name = (char *) swift_voice_get_attribute(cepstral->voice, "name"); } + if (voice_name) { + switch_copy_string(sh->voice, voice_name, sizeof(sh->voice)); + } + swift_port_set_callback(cepstral->port, &write_audio, SWIFT_EVENT_AUDIO, cepstral); sh->private_info = cepstral; @@ -175,7 +181,6 @@ cepstral->done = 1; cepstral->done_gen = 1; - printf("CLOSE!!!\n"); swift_port_stop(cepstral->port, SWIFT_ASYNC_ANY, SWIFT_EVENT_NOW); /* Close the Swift Port and Engine */ if (NULL != cepstral->port) swift_port_close(cepstral->port); @@ -294,6 +299,83 @@ return status; } +static void cepstral_text_param_tts(switch_speech_handle_t *sh, char *param, char *val) +{ + cepstral_t *cepstral; + + cepstral = sh->private_info; + assert(cepstral != NULL); + + if (!strcasecmp(param, "voice")) { + char *voice_name = val; + if (!strcasecmp(voice_name, "next")) { + if ((cepstral->voice = swift_port_find_next_voice(cepstral->port))) { + if ( SWIFT_FAILED(swift_port_set_voice(cepstral->port, cepstral->voice)) ) { + cepstral->done = cepstral->done_gen = 1; + return; + } + voice_name = (char *) swift_voice_get_attribute(cepstral->voice, "name"); + } else { + voice_name = NULL; + } + } else { + if (voice_name && SWIFT_FAILED(swift_port_set_voice_by_name(cepstral->port, voice_name))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Invalid voice %s!\n", voice_name); + voice_name = NULL; + } + } + + if (!voice_name) { + /* Find the first voice on the system */ + if ((cepstral->voice = swift_port_find_first_voice(cepstral->port, NULL, NULL)) == NULL) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to find any voices!\n"); + cepstral->done = cepstral->done_gen = 1; + return; + } + + /* Set the voice found by find_first_voice() as the port's current voice */ + if ( SWIFT_FAILED(swift_port_set_voice(cepstral->port, cepstral->voice)) ) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to set voice.\n"); + cepstral->done = cepstral->done_gen = 1; + return; + } + + voice_name = (char *) swift_voice_get_attribute(cepstral->voice, "name"); + } + + if (voice_name) { + switch_copy_string(sh->voice, voice_name, sizeof(sh->voice)); + } + + return; + } + + swift_port_set_param_string(cepstral->port, param, val, NULL); +} + +static void cepstral_numeric_param_tts(switch_speech_handle_t *sh, char *param, int val) +{ + cepstral_t *cepstral; + + cepstral = sh->private_info; + assert(cepstral != NULL); + + swift_port_set_param_int(cepstral->port, param, val, NULL); + +} + + +static void cepstral_float_param_tts(switch_speech_handle_t *sh, char *param, double val) +{ + cepstral_t *cepstral; + + cepstral = sh->private_info; + assert(cepstral != NULL); + + swift_port_set_param_float(cepstral->port, param, val, NULL); + +} + static const switch_speech_interface_t cepstral_speech_interface = { /*.interface_name*/ "cepstral", /*.speech_open*/ cepstral_speech_open, @@ -302,7 +384,10 @@ /*.speech_interpret_asr*/ NULL, /*.speech_feed_tts*/ cepstral_speech_feed_tts, /*.speech_read_tts*/ cepstral_speech_read_tts, - /*.speech_flush_tts*/ cepstral_speech_flush_tts + /*.speech_flush_tts*/ cepstral_speech_flush_tts, + /*.speech_text_param_tts*/ cepstral_text_param_tts, + /*.speech_numeric_param_tts*/ cepstral_numeric_param_tts, + /*.speech_numeric_param_tts*/ cepstral_float_param_tts }; static const switch_loadable_module_interface_t cepstral_module_interface = { Modified: freeswitch/trunk/src/mod/endpoints/mod_wanpipe/mod_wanpipe.c ============================================================================== --- freeswitch/trunk/src/mod/endpoints/mod_wanpipe/mod_wanpipe.c (original) +++ freeswitch/trunk/src/mod/endpoints/mod_wanpipe/mod_wanpipe.c Thu Jun 8 15:22:54 2006 @@ -566,8 +566,8 @@ while (bytes > 0) { unsigned int towrite; -#if 0 - if (sangoma_socket_waitfor(tech_pvt->socket, -1, POLLOUT | POLLERR | POLLHUP) <= 0) { +#if 1 + if (sangoma_socket_waitfor(tech_pvt->socket, 1000, POLLOUT | POLLERR | POLLHUP) <= 0) { return SWITCH_STATUS_GENERR; } #endif Modified: freeswitch/trunk/src/switch_core.c ============================================================================== --- freeswitch/trunk/src/switch_core.c (original) +++ freeswitch/trunk/src/switch_core.c Thu Jun 8 15:22:54 2006 @@ -578,6 +578,7 @@ return SWITCH_STATUS_GENERR; } + switch_copy_string(sh->engine, module_name, sizeof(sh->engine)); sh->flags = *flags; if (pool) { sh->memory_pool = pool; @@ -640,6 +641,15 @@ } } +SWITCH_DECLARE(void) switch_core_speech_float_param_tts(switch_speech_handle_t *sh, char *param, double val) +{ + assert(sh != NULL); + + if (sh->speech_interface->speech_float_param_tts) { + sh->speech_interface->speech_float_param_tts(sh, param, val); + } +} + SWITCH_DECLARE(switch_status_t) switch_core_speech_read_tts(switch_speech_handle_t *sh, void *data, switch_size_t *datalen, @@ -736,15 +746,13 @@ while (data->running > 0) { switch (switch_core_session_read_frame(session, &read_frame, -1, stream_id)) { case SWITCH_STATUS_SUCCESS: - break; case SWITCH_STATUS_TIMEOUT: + case SWITCH_STATUS_BREAK: break; default: data->running = -1; continue; } - - switch_yield(10000); } data->running = 0; Modified: freeswitch/trunk/src/switch_ivr.c ============================================================================== --- freeswitch/trunk/src/switch_ivr.c (original) +++ freeswitch/trunk/src/switch_ivr.c Thu Jun 8 15:22:54 2006 @@ -554,6 +554,52 @@ ilen = len; while(switch_channel_ready(channel)) { + + if (dtmf_callback || buf) { + /* + dtmf handler function you can hook up to be executed when a digit is dialed during playback + if you return anything but SWITCH_STATUS_SUCCESS the playback will stop. + */ + if (switch_channel_has_dtmf(channel)) { + if (buf && !strcasecmp(buf, "_break_")) { + status = SWITCH_STATUS_BREAK; + } else { + switch_channel_dequeue_dtmf(channel, dtmf, sizeof(dtmf)); + if (dtmf_callback) { + status = dtmf_callback(session, dtmf, buf, buflen); + } else { + switch_copy_string((char *)buf, dtmf, buflen); + status = SWITCH_STATUS_BREAK; + } + } + } + + if (status != SWITCH_STATUS_SUCCESS) { + done = 1; + break; + } + } + + if (switch_test_flag(sh, SWITCH_SPEECH_FLAG_PAUSE)) { + if (timer) { + if ((x = switch_core_timer_next(timer)) < 0) { + break; + } + } else { + switch_frame_t *read_frame; + switch_status_t status = switch_core_session_read_frame(session, &read_frame, -1, 0); + + while (switch_channel_test_flag(channel, CF_HOLD)) { + switch_yield(10000); + } + + if (!SWITCH_READ_ACCEPTABLE(status)) { + break; + } + } + continue; + } + flags = SWITCH_SPEECH_FLAG_BLOCKING; status = switch_core_speech_read_tts(sh, abuf, @@ -596,27 +642,6 @@ } } - if (dtmf_callback || buf) { - /* - dtmf handler function you can hook up to be executed when a digit is dialed during playback - if you return anything but SWITCH_STATUS_SUCCESS the playback will stop. - */ - if (switch_channel_has_dtmf(channel)) { - switch_channel_dequeue_dtmf(channel, dtmf, sizeof(dtmf)); - if (dtmf_callback) { - status = dtmf_callback(session, dtmf, buf, buflen); - } else { - switch_copy_string((char *)buf, dtmf, buflen); - status = SWITCH_STATUS_BREAK; - } - } - - if (status != SWITCH_STATUS_SUCCESS) { - done = 1; - break; - } - } - if (timer) { if ((x = switch_core_timer_next(timer)) < 0) { break;
participants (1)
-
anthm@freeswitch.org