Author: greenlizard Date: Thu Sep 6 12:57:43 2007 New Revision: 5685 Added: freeswitch/branches/greenlizard/scripts/contrib/trixter/softphone.pl - copied unchanged from r5684, /freeswitch/trunk/scripts/contrib/trixter/softphone.pl freeswitch/branches/greenlizard/scripts/py_modules/ - copied from r5684, /freeswitch/trunk/scripts/py_modules/ freeswitch/branches/greenlizard/scripts/py_modules/__init__.py - copied unchanged from r5684, /freeswitch/trunk/scripts/py_modules/__init__.py freeswitch/branches/greenlizard/scripts/py_modules/speechtools.py - copied unchanged from r5684, /freeswitch/trunk/scripts/py_modules/speechtools.py freeswitch/branches/greenlizard/scripts/recipewizard.py - copied unchanged from r5684, /freeswitch/trunk/scripts/recipewizard.py Modified: freeswitch/branches/greenlizard/Makefile.am freeswitch/branches/greenlizard/conf/conference.conf.xml freeswitch/branches/greenlizard/src/include/switch_caller.h freeswitch/branches/greenlizard/src/include/switch_core.h freeswitch/branches/greenlizard/src/include/switch_ivr.h freeswitch/branches/greenlizard/src/mod/applications/mod_conference/mod_conference.c freeswitch/branches/greenlizard/src/mod/applications/mod_dptools/mod_dptools.c freeswitch/branches/greenlizard/src/mod/applications/mod_ivrtest/mod_ivrtest.c freeswitch/branches/greenlizard/src/mod/applications/mod_rss/mod_rss.c freeswitch/branches/greenlizard/src/mod/asr_tts/mod_openmrcp/mod_openmrcp.c freeswitch/branches/greenlizard/src/mod/endpoints/mod_dingaling/mod_dingaling.c freeswitch/branches/greenlizard/src/mod/endpoints/mod_iax/mod_iax.c freeswitch/branches/greenlizard/src/mod/endpoints/mod_portaudio/mod_portaudio.c freeswitch/branches/greenlizard/src/mod/endpoints/mod_sofia/sofia.c freeswitch/branches/greenlizard/src/mod/endpoints/mod_sofia/sofia_glue.c freeswitch/branches/greenlizard/src/mod/endpoints/mod_sofia/sofia_reg.c freeswitch/branches/greenlizard/src/mod/endpoints/mod_woomera/mod_woomera.c freeswitch/branches/greenlizard/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c freeswitch/branches/greenlizard/src/mod/languages/mod_spidermonkey/mod_spidermonkey.h freeswitch/branches/greenlizard/src/mod/say/mod_say_en/mod_say_en.c freeswitch/branches/greenlizard/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c freeswitch/branches/greenlizard/src/mod/xml_int/mod_xml_curl/mod_xml_curl.c freeswitch/branches/greenlizard/src/switch_caller.c freeswitch/branches/greenlizard/src/switch_console.c freeswitch/branches/greenlizard/src/switch_core_directory.c freeswitch/branches/greenlizard/src/switch_core_session.c freeswitch/branches/greenlizard/src/switch_core_speech.c freeswitch/branches/greenlizard/src/switch_cpp.cpp freeswitch/branches/greenlizard/src/switch_ivr_bridge.c freeswitch/branches/greenlizard/src/switch_ivr_menu.c freeswitch/branches/greenlizard/src/switch_ivr_originate.c freeswitch/branches/greenlizard/src/switch_ivr_play_say.c freeswitch/branches/greenlizard/src/switch_odbc.c freeswitch/branches/greenlizard/src/switch_swig.c freeswitch/branches/greenlizard/src/switch_xml.c Log: merge trunk 5651:5684 Modified: freeswitch/branches/greenlizard/Makefile.am ============================================================================== --- freeswitch/branches/greenlizard/Makefile.am (original) +++ freeswitch/branches/greenlizard/Makefile.am Thu Sep 6 12:57:43 2007 @@ -90,7 +90,8 @@ src/include/switch_cpp.h\ libs/libteletone/src/libteletone_detect.h\ libs/libteletone/src/libteletone_generate.h\ -libs/libteletone/src/libteletone.h +libs/libteletone/src/libteletone.h\ +src/include/switch_odbc.h CORE_CFLAGS = `$(switch_srcdir)/libs/apr/apr-1-config --cflags --cppflags --includes` CORE_CFLAGS += `$(switch_srcdir)/libs/apr-util/apu-1-config --includes` @@ -104,11 +105,6 @@ CORE_LIBS = libs/apr/libapr-1.la libs/apr-util/libaprutil-1.la CORE_LIBS += libs/sqlite/libsqlite3.la libs/pcre/libpcre.la CORE_LIBS += libs/srtp/libsrtp.la $(RESAMPLE_LIB) -if ADD_ODBC -libfreeswitch_la_SOURCES += src/switch_odbc.c -library_include_HEADERS += src/include/switch_odbc.h -CORE_LIBS += -lodbc -endif lib_LTLIBRARIES = libfreeswitch.la libfreeswitch_la_CFLAGS = $(CORE_CFLAGS) $(AM_CFLAGS) @@ -136,6 +132,10 @@ freeswitch_LDADD += -lcurses endif +if ADD_ODBC +libfreeswitch_la_SOURCES += src/switch_odbc.c +CORE_LIBS += -lodbc +endif libs/libedit/Makefile: Modified: freeswitch/branches/greenlizard/conf/conference.conf.xml ============================================================================== --- freeswitch/branches/greenlizard/conf/conference.conf.xml (original) +++ freeswitch/branches/greenlizard/conf/conference.conf.xml Thu Sep 6 12:57:43 2007 @@ -44,9 +44,9 @@ <!-- Name of the caller control group to use for this profile --> <!-- <param name="caller-controls" value="some name"/> --> <!-- TTS Engine to use --> - <!--<param name="tts-engine" value="cepstral"/>--> + <param name="tts-engine" value="cepstral"/> <!-- TTS Voice to use --> - <!--<param name="tts-voice" value="david"/>--> + <param name="tts-voice" value="david"/> <!-- If TTS is enabled all audio-file params beginning with --> <!-- 'say:' will be considered text to say with TTS --> Modified: freeswitch/branches/greenlizard/src/include/switch_caller.h ============================================================================== --- freeswitch/branches/greenlizard/src/include/switch_caller.h (original) +++ freeswitch/branches/greenlizard/src/include/switch_caller.h Thu Sep 6 12:57:43 2007 @@ -99,6 +99,7 @@ struct switch_caller_profile *originatee_caller_profile; struct switch_channel_timetable *times; struct switch_caller_extension *caller_extension; + switch_memory_pool_t *pool; struct switch_caller_profile *next; }; @@ -189,10 +190,16 @@ \param session session associated with the profile (bound by scope) \param tocopy the existing profile */ - SWITCH_DECLARE(switch_caller_profile_t *) switch_caller_profile_clone(switch_core_session_t *session, switch_caller_profile_t *tocopy); /*! + \brief Duplicate an existing caller profile object + \param pool pool to duplicate with + \param tocopy the existing profile +*/ +SWITCH_DECLARE(switch_caller_profile_t *) switch_caller_profile_dup(switch_memory_pool_t *pool, switch_caller_profile_t *tocopy); + +/*! \brief Add headers to an existing event in regards to a specific profile \param caller_profile the desired profile \param prefix a prefix string to all of the field names (for uniqueness) Modified: freeswitch/branches/greenlizard/src/include/switch_core.h ============================================================================== --- freeswitch/branches/greenlizard/src/include/switch_core.h (original) +++ freeswitch/branches/greenlizard/src/include/switch_core.h Thu Sep 6 12:57:43 2007 @@ -1173,13 +1173,17 @@ \param module_name the speech module to use \param voice_name the desired voice name \param rate the sampling rate + \param interval the sampling interval \param flags tts flags \param pool the pool to use (NULL for new pool) \return SWITCH_STATUS_SUCCESS if the handle is opened */ SWITCH_DECLARE(switch_status_t) switch_core_speech_open(switch_speech_handle_t *sh, char *module_name, - char *voice_name, unsigned int rate, switch_speech_flag_t *flags, switch_memory_pool_t *pool); + char *voice_name, + unsigned int rate, + unsigned int interval, + switch_speech_flag_t *flags, switch_memory_pool_t *pool); /*! \brief Feed text to the TTS module \param sh the speech handle to feed Modified: freeswitch/branches/greenlizard/src/include/switch_ivr.h ============================================================================== --- freeswitch/branches/greenlizard/src/include/switch_ivr.h (original) +++ freeswitch/branches/greenlizard/src/include/switch_ivr.h Thu Sep 6 12:57:43 2007 @@ -317,13 +317,12 @@ \param session the session to speak on \param tts_name the desired tts module \param voice_name the desired voice - \param rate the sample rate \param text the text to speak \param args arguements to pass for callbacks etc \return SWITCH_STATUS_SUCCESS if all is well */ SWITCH_DECLARE(switch_status_t) switch_ivr_speak_text(switch_core_session_t *session, - char *tts_name, char *voice_name, uint32_t rate, char *text, switch_input_args_t *args); + char *tts_name, char *voice_name, char *text, switch_input_args_t *args); /*! \brief Make an outgoing call Modified: freeswitch/branches/greenlizard/src/mod/applications/mod_conference/mod_conference.c ============================================================================== --- freeswitch/branches/greenlizard/src/mod/applications/mod_conference/mod_conference.c (original) +++ freeswitch/branches/greenlizard/src/mod/applications/mod_conference/mod_conference.c Thu Sep 6 12:57:43 2007 @@ -155,7 +155,7 @@ typedef struct conference_file_node { switch_file_handle_t fh; - switch_speech_handle_t sh; + switch_speech_handle_t *sh; node_type_t type; uint8_t done; uint8_t async; @@ -218,6 +218,8 @@ uint32_t count; int32_t energy_level; uint8_t min; + switch_speech_handle_t lsh; + switch_speech_handle_t *sh; } conference_obj_t; /* Relationship with another member */ @@ -257,6 +259,8 @@ conference_file_node_t *fnode; conference_relationship_t *relationships; switch_ivr_digit_stream_t *digit_stream; + switch_speech_handle_t lsh; + switch_speech_handle_t *sh; struct conference_member *next; }; @@ -606,10 +610,7 @@ cur = fnode; fnode = fnode->next; - if (cur->type == NODE_TYPE_SPEECH) { - switch_speech_flag_t flags = SWITCH_SPEECH_FLAG_NONE; - switch_core_speech_close(&cur->sh, &flags); - } else { + if (cur->type != NODE_TYPE_SPEECH) { switch_core_file_close(&cur->fh); } @@ -618,6 +619,12 @@ } } + if (member->sh) { + switch_speech_flag_t flags = SWITCH_SPEECH_FLAG_NONE; + switch_core_speech_close(&member->lsh, &flags); + member->sh = NULL; + } + member->conference = NULL; if (!switch_test_flag(member, MFLAG_NOCHANNEL)) { @@ -763,7 +770,7 @@ switch_speech_flag_t flags = SWITCH_SPEECH_FLAG_BLOCKING; uint32_t rate = conference->rate; - if (switch_core_speech_read_tts(&conference->fnode->sh, file_frame, &file_data_len, &rate, &flags) == SWITCH_STATUS_SUCCESS) { + if (switch_core_speech_read_tts(conference->fnode->sh, file_frame, &file_data_len, &rate, &flags) == SWITCH_STATUS_SUCCESS) { file_sample_len = file_data_len / 2; } else { file_sample_len = file_data_len = 0; @@ -896,10 +903,7 @@ conference_file_node_t *fnode; switch_memory_pool_t *pool; - if (conference->fnode->type == NODE_TYPE_SPEECH) { - switch_speech_flag_t flags = SWITCH_SPEECH_FLAG_NONE; - switch_core_speech_close(&conference->fnode->sh, &flags); - } else { + if (conference->fnode->type != NODE_TYPE_SPEECH) { switch_core_file_close(&conference->fnode->fh); } @@ -942,10 +946,7 @@ cur = fnode; fnode = fnode->next; - if (cur->type == NODE_TYPE_SPEECH) { - switch_speech_flag_t flags = SWITCH_SPEECH_FLAG_NONE; - switch_core_speech_close(&cur->sh, &flags); - } else { + if (cur->type != NODE_TYPE_SPEECH) { switch_core_file_close(&cur->fh); } @@ -991,6 +992,12 @@ switch_ivr_digit_stream_parser_destroy(conference->dtmf_parser); + if (conference->sh) { + switch_speech_flag_t flags = SWITCH_SPEECH_FLAG_NONE; + switch_core_speech_close(&conference->lsh, &flags); + conference->sh = NULL; + } + if (conference->pool) { switch_memory_pool_t *pool = conference->pool; switch_core_destroy_memory_pool(&pool); @@ -1657,10 +1664,7 @@ conference_file_node_t *fnode; switch_memory_pool_t *pool; - if (member->fnode->type == NODE_TYPE_SPEECH) { - switch_speech_flag_t flags = SWITCH_SPEECH_FLAG_NONE; - switch_core_speech_close(&member->fnode->sh, &flags); - } else { + if (member->fnode->type != NODE_TYPE_SPEECH) { switch_core_file_close(&member->fnode->fh); } @@ -1680,7 +1684,7 @@ switch_speech_flag_t flags = SWITCH_SPEECH_FLAG_BLOCKING; uint32_t rate = member->conference->rate; - if (switch_core_speech_read_tts(&member->fnode->sh, file_frame, &file_data_len, &rate, &flags) == SWITCH_STATUS_SUCCESS) { + if (switch_core_speech_read_tts(member->fnode->sh, file_frame, &file_data_len, &rate, &flags) == SWITCH_STATUS_SUCCESS) { file_sample_len = file_data_len / 2; } else { file_sample_len = file_data_len = 0; @@ -2238,11 +2242,15 @@ fnode->leadin = leadin; fnode->pool = pool; - memset(&fnode->sh, 0, sizeof(fnode->sh)); - if (switch_core_speech_open(&fnode->sh, conference->tts_engine, conference->tts_voice, conference->rate, &flags, fnode->pool) != - SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid TTS module [%s]!\n", conference->tts_engine); - return SWITCH_STATUS_FALSE; + if (!member->sh) { + memset(&member->lsh, 0, sizeof(member->lsh)); + if (switch_core_speech_open(&member->lsh, conference->tts_engine, conference->tts_voice, + conference->rate, conference->interval, &flags, fnode->pool) != + SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid TTS module [%s]!\n", conference->tts_engine); + return SWITCH_STATUS_FALSE; + } + member->sh = &member->lsh; } /* Queue the node */ @@ -2254,10 +2262,24 @@ } else { member->fnode = fnode; } - + + fnode->sh = member->sh; /* Begin Generation */ switch_sleep(200000); - switch_core_speech_feed_tts(&fnode->sh, text, &flags); + + if (*text == '#') { + char *tmp = (char *)text + 1; + char *vp = tmp, voice[128] = ""; + if ((tmp = strchr(tmp, '#'))) { + text = tmp + 1; + switch_copy_string(voice, vp, (tmp - vp) + 1); + switch_core_speech_text_param_tts(fnode->sh, "voice", voice); + } + } else { + switch_core_speech_text_param_tts(fnode->sh, "voice", conference->tts_voice); + } + + switch_core_speech_feed_tts(fnode->sh, text, &flags); switch_mutex_unlock(member->flag_mutex); status = SWITCH_STATUS_SUCCESS; @@ -2309,12 +2331,16 @@ fnode->type = NODE_TYPE_SPEECH; fnode->leadin = leadin; - - memset(&fnode->sh, 0, sizeof(fnode->sh)); - if (switch_core_speech_open(&fnode->sh, conference->tts_engine, conference->tts_voice, conference->rate, &flags, conference->pool) != - SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid TTS module [%s]!\n", conference->tts_engine); - return SWITCH_STATUS_FALSE; + + if (!conference->sh) { + memset(&conference->lsh, 0, sizeof(conference->lsh)); + if (switch_core_speech_open(&conference->lsh, conference->tts_engine, conference->tts_voice, + conference->rate, conference->interval, &flags, conference->pool) != + SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid TTS module [%s]!\n", conference->tts_engine); + return SWITCH_STATUS_FALSE; + } + conference->sh = &conference->lsh; } fnode->pool = pool; @@ -2329,9 +2355,22 @@ conference->fnode = fnode; } + fnode->sh = conference->sh; + if (*text == '#') { + char *tmp = (char *)text + 1; + char *vp = tmp, voice[128] = ""; + if ((tmp = strchr(tmp, '#'))) { + text = tmp + 1; + switch_copy_string(voice, vp, (tmp - vp) + 1); + switch_core_speech_text_param_tts(fnode->sh, "voice", voice); + } + } else { + switch_core_speech_text_param_tts(fnode->sh, "voice", conference->tts_voice); + } + /* Begin Generation */ switch_sleep(200000); - switch_core_speech_feed_tts(&fnode->sh, (char *) text, &flags); + switch_core_speech_feed_tts(fnode->sh, (char *) text, &flags); switch_mutex_unlock(conference->mutex); status = SWITCH_STATUS_SUCCESS; @@ -3826,7 +3865,7 @@ if (!(conference->tts_engine && conference->tts_voice)) { status = SWITCH_STATUS_FALSE; } else { - status = switch_ivr_speak_text(session, conference->tts_engine, conference->tts_voice, 0, path + 4, NULL); + status = switch_ivr_speak_text(session, conference->tts_engine, conference->tts_voice, path + 4, NULL); } goto done; } Modified: freeswitch/branches/greenlizard/src/mod/applications/mod_dptools/mod_dptools.c ============================================================================== --- freeswitch/branches/greenlizard/src/mod/applications/mod_dptools/mod_dptools.c (original) +++ freeswitch/branches/greenlizard/src/mod/applications/mod_dptools/mod_dptools.c Thu Sep 6 12:57:43 2007 @@ -346,6 +346,88 @@ } } + +SWITCH_STANDARD_APP(set_profile_var_function) +{ + switch_channel_t *channel; + switch_caller_profile_t *caller_profile; + char *name, *val = NULL; + + channel = switch_core_session_get_channel(session); + assert(channel != NULL); + + caller_profile = switch_channel_get_caller_profile(channel); + + if (switch_strlen_zero(data)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No variable name specified.\n"); + } else { + name = switch_core_session_strdup(session, data); + val = strchr(name, '='); + + if (val) { + *val++ = '\0'; + if (switch_strlen_zero(val)) { + val = NULL; + } + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "SET_PROFILE_VAR [%s]=[%s]\n", name, val ? val : "UNDEF"); + + if (!strcasecmp(name, "dialplan")) { + caller_profile->dialplan = val; + } + if (!strcasecmp(name, "username")) { + caller_profile->username = val; + } + if (!strcasecmp(name, "caller_id_name")) { + caller_profile->caller_id_name = val; + } + if (!strcasecmp(name, "caller_id_number")) { + caller_profile->caller_id_number = val; + } + if (!strcasecmp(name, "caller_ton")) { + caller_profile->caller_ton = (uint8_t)atoi(val); + } + if (!strcasecmp(name, "caller_numplan")) { + caller_profile->caller_numplan = (uint8_t)atoi(val); + } + if (!strcasecmp(name, "destination_number_ton")) { + caller_profile->destination_number_ton = (uint8_t)atoi(val); + } + if (!strcasecmp(name, "destination_number_numplan")) { + caller_profile->destination_number_numplan = (uint8_t)atoi(val); + } + if (!strcasecmp(name, "ani")) { + caller_profile->ani = val; + } + if (!strcasecmp(name, "aniii")) { + caller_profile->aniii = val; + } + if (!strcasecmp(name, "network_addr")) { + caller_profile->network_addr = val; + } + if (!strcasecmp(name, "rdnis")) { + caller_profile->rdnis = val; + } + if (!strcasecmp(name, "destination_number")) { + caller_profile->destination_number = val; + } + if (!strcasecmp(name, "uuid")) { + caller_profile->uuid = val; + } + if (!strcasecmp(name, "source")) { + caller_profile->source = val; + } + if (!strcasecmp(name, "context")) { + caller_profile->context = val; + } + if (!strcasecmp(name, "chan_name")) { + caller_profile->chan_name = val; + } + } +} + + SWITCH_STANDARD_APP(export_function) { switch_channel_t *channel; @@ -860,7 +942,7 @@ args.input_callback = on_dtmf; args.buf = buf; args.buflen = sizeof(buf); - switch_ivr_speak_text(session, engine, voice, codec->implementation->samples_per_second, text, &args); + switch_ivr_speak_text(session, engine, voice, text, &args); } @@ -1141,6 +1223,7 @@ #define SCHED_HANGUP_DESCR "Schedule a hangup in the future" #define UNSET_LONG_DESC "Unset a channel varaible for the channel calling the application." #define SET_LONG_DESC "Set a channel varaible for the channel calling the application." +#define SET_PROFILE_VAR_LONG_DESC "Set a caller profile varaible for the channel calling the application." #define EXPORT_LONG_DESC "Set and export a channel varaible for the channel calling the application." #define LOG_LONG_DESC "Logs a channel varaible for the channel calling the application." #define TRANSFER_LONG_DESC "Immediatly transfer the calling channel to a new extension" @@ -1171,6 +1254,7 @@ SWITCH_ADD_APP(app_interface, "event", "Fire an event", "Fire an event", event_function, "", SAF_SUPPORT_NOMEDIA); SWITCH_ADD_APP(app_interface, "export", "Export a channel varaible across a bridge", EXPORT_LONG_DESC, export_function, "<varname>=<value>", SAF_SUPPORT_NOMEDIA); SWITCH_ADD_APP(app_interface, "set", "Set a channel varaible", SET_LONG_DESC, set_function, "<varname>=<value>", SAF_SUPPORT_NOMEDIA); + SWITCH_ADD_APP(app_interface, "set_profile_var", "Set a caller profile varaible", SET_PROFILE_VAR_LONG_DESC, set_profile_var_function, "<varname>=<value>", SAF_SUPPORT_NOMEDIA); SWITCH_ADD_APP(app_interface, "unset", "Unset a channel varaible", UNSET_LONG_DESC, unset_function, "<varname>", SAF_SUPPORT_NOMEDIA); SWITCH_ADD_APP(app_interface, "ring_ready", "Indicate Ring_Ready", "Indicate Ring_Ready on a channel.", ring_ready_function, "", SAF_SUPPORT_NOMEDIA); SWITCH_ADD_APP(app_interface, "break", "Break", "Set the break flag.", break_function, "", SAF_SUPPORT_NOMEDIA); Modified: freeswitch/branches/greenlizard/src/mod/applications/mod_ivrtest/mod_ivrtest.c ============================================================================== --- freeswitch/branches/greenlizard/src/mod/applications/mod_ivrtest/mod_ivrtest.c (original) +++ freeswitch/branches/greenlizard/src/mod/applications/mod_ivrtest/mod_ivrtest.c Thu Sep 6 12:57:43 2007 @@ -207,7 +207,7 @@ args.input_callback = show_dtmf; args.buf = buf; args.buflen = sizeof(buf); - switch_ivr_speak_text(session, tts_name, voice_name, codec->implementation->samples_per_second, text, &args); + switch_ivr_speak_text(session, tts_name, voice_name, text, &args); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Done\n"); } @@ -405,7 +405,7 @@ } snprintf(say, sizeof(say), "You Dialed [%s]\n", buf); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, say); - switch_ivr_speak_text(session, "cepstral", "david", codec->implementation->samples_per_second, say, NULL); + switch_ivr_speak_text(session, "cepstral", "david", say, NULL); } } Modified: freeswitch/branches/greenlizard/src/mod/applications/mod_rss/mod_rss.c ============================================================================== --- freeswitch/branches/greenlizard/src/mod/applications/mod_rss/mod_rss.c (original) +++ freeswitch/branches/greenlizard/src/mod/applications/mod_rss/mod_rss.c Thu Sep 6 12:57:43 2007 @@ -243,7 +243,7 @@ } memset(&sh, 0, sizeof(sh)); - if (switch_core_speech_open(&sh, engine, voice, rate, &flags, switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) { + if (switch_core_speech_open(&sh, engine, voice, rate, interval, &flags, switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid TTS module!\n"); return; } Modified: freeswitch/branches/greenlizard/src/mod/asr_tts/mod_openmrcp/mod_openmrcp.c ============================================================================== --- freeswitch/branches/greenlizard/src/mod/asr_tts/mod_openmrcp/mod_openmrcp.c (original) +++ freeswitch/branches/greenlizard/src/mod/asr_tts/mod_openmrcp/mod_openmrcp.c Thu Sep 6 12:57:43 2007 @@ -62,14 +62,9 @@ #include "mrcp_recognizer.h" #include "mrcp_synthesizer.h" #include "mrcp_generic_header.h" -#include "mrcp_resource_set.h" #include <switch.h> -#define OPENMRCP_WAIT_TIMEOUT 5000 -#define MY_BUF_LEN 1024 * 128 -#define MY_BLOCK_SIZE MY_BUF_LEN - SWITCH_MODULE_LOAD_FUNCTION(mod_openmrcp_load); SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_openmrcp_shutdown); SWITCH_MODULE_DEFINITION(mod_openmrcp, mod_openmrcp_load, @@ -95,12 +90,9 @@ } openmrcp_session_t; typedef enum { - FLAG_HAS_TEXT = (1 << 0), - FLAG_BARGE = (1 << 1), - FLAG_READY = (1 << 2), - FLAG_SPEAK_COMPLETE = (1 << 3), - FLAG_FEED_STARTED = (1 << 4), - FLAG_TERMINATING = (1 << 5) + FLAG_HAS_MESSAGE = (1 << 0), + FLAG_FEED_STARTED = (1 << 1), + FLAG_TERMINATING = (1 << 2) } mrcp_flag_t; typedef struct { @@ -220,38 +212,19 @@ return MRCP_STATUS_FAILURE; } - if (mrcp_message->start_line.message_type != MRCP_MESSAGE_TYPE_EVENT) { + if (mrcp_message->start_line.message_type == MRCP_MESSAGE_TYPE_RESPONSE && mrcp_message->start_line.request_state == MRCP_REQUEST_STATE_INPROGRESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "ignoring mrcp response\n"); return MRCP_STATUS_SUCCESS; } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "mrcp msg body: %s\n", mrcp_message->body); - - if (mrcp_message->channel_id.resource_id == MRCP_RESOURCE_RECOGNIZER) { - if (mrcp_message->start_line.method_id == RECOGNIZER_RECOGNITION_COMPLETE) { - openmrcp_session->mrcp_message_last_rcvd = mrcp_message; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "setting FLAG_HAS_TEXT\n"); - switch_set_flag_locked(openmrcp_session, FLAG_HAS_TEXT); - } - else if (mrcp_message->start_line.method_id == RECOGNIZER_START_OF_INPUT) { - openmrcp_session->mrcp_message_last_rcvd = mrcp_message; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "setting FLAG_BARGE\n"); - switch_set_flag_locked(openmrcp_session, FLAG_BARGE); - } - else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "ignoring event: %s\n", mrcp_message->start_line.method_name); - } - } - else if(mrcp_message->channel_id.resource_id == MRCP_RESOURCE_SYNTHESIZER) { - if (mrcp_message->start_line.method_id == SYNTHESIZER_SPEAK_COMPLETE) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "setting FLAG_SPEAK_COMPLETE\n"); - switch_set_flag_locked(openmrcp_session, FLAG_SPEAK_COMPLETE); - } - else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "ignoring event: %s\n", mrcp_message->start_line.method_name); - } + if (switch_test_flag(openmrcp_session, FLAG_HAS_MESSAGE)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "already has message\n"); + return MRCP_STATUS_SUCCESS; } - + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "setting FLAG_HAS_MESSAGE\n"); + openmrcp_session->mrcp_message_last_rcvd = mrcp_message; + switch_set_flag_locked(openmrcp_session, FLAG_HAS_MESSAGE); return MRCP_STATUS_SUCCESS; } @@ -473,8 +446,8 @@ { openmrcp_session_t *asr_session = (openmrcp_session_t *) ah->private_info; - switch_status_t rv = (switch_test_flag(asr_session, FLAG_HAS_TEXT) || switch_test_flag(asr_session, FLAG_BARGE)) ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_FALSE; - + switch_status_t rv = (switch_test_flag(asr_session, FLAG_HAS_MESSAGE)) ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_FALSE; + return rv; } @@ -483,50 +456,61 @@ { openmrcp_session_t *asr_session = (openmrcp_session_t *) ah->private_info; switch_status_t ret = SWITCH_STATUS_SUCCESS; + mrcp_message_t *message; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "openmrcp_asr_get_results called\n"); - if (switch_test_flag(asr_session, FLAG_BARGE)) { - switch_clear_flag_locked(asr_session, FLAG_BARGE); - ret = SWITCH_STATUS_BREAK; - } - - if (switch_test_flag(asr_session, FLAG_HAS_TEXT)) { - /*! - we have to extract the XML but stripping off the <?xml version="1.0"?> - header. the body looks like: - - Completion-Cause:001 no-match - Content-Type: application/nlsml+xml - Content-Length: 260 - - <?xml version="1.0"?> - <result xmlns="http://www.ietf.org/xml/ns/mrcpv2" xmlns:ex="http://www.example.com/example" score="100" grammar="session:request1@form-level.store"> - <interpretation> <input mode="speech">open a</input> - </interpretation> - </result> - */ - - if(asr_session->mrcp_message_last_rcvd && asr_session->mrcp_message_last_rcvd->body) { - char *marker = "?>"; // FIXME -- lame and brittle way of doing this. use regex or better. - char *position = strstr(asr_session->mrcp_message_last_rcvd->body, marker); - if (!position) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Bad result received from mrcp server: %s", asr_session->mrcp_message_last_rcvd->body); - ret = SWITCH_STATUS_FALSE; + message = asr_session->mrcp_message_last_rcvd; + asr_session->mrcp_message_last_rcvd = NULL; + // since we are returning our result here, future calls to check_results + // should return False + switch_clear_flag_locked(asr_session, FLAG_HAS_MESSAGE); + + if (message->start_line.message_type == MRCP_MESSAGE_TYPE_RESPONSE) { + if (message->start_line.status_code != MRCP_STATUS_CODE_SUCCESS && + message->start_line.status_code != MRCP_STATUS_CODE_SUCCESS_WITH_IGNORE) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "error code received [%d]\n", message->start_line.status_code); + ret = SWITCH_STATUS_FALSE; + } + } + else if (message->start_line.message_type == MRCP_MESSAGE_TYPE_EVENT) { + if (message->start_line.method_id == RECOGNIZER_RECOGNITION_COMPLETE) { + /*! + we have to extract the XML but stripping off the <?xml version="1.0"?> + header. the body looks like: + + Completion-Cause:001 no-match + Content-Type: application/nlsml+xml + Content-Length: 260 + + <?xml version="1.0"?> + <result xmlns="http://www.ietf.org/xml/ns/mrcpv2" xmlns:ex="http://www.example.com/example" score="100" grammar="session:request1@form-level.store"> + <interpretation> <input mode="speech">open a</input> + </interpretation> + </result> + */ + + if(message->body) { + char *marker = "?>"; // FIXME -- lame and brittle way of doing this. use regex or better. + char *position = strstr(message->body, marker); + if (!position) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Bad result received from mrcp server: %s", message->body); + ret = SWITCH_STATUS_FALSE; + } + else { + position += strlen(marker); + *xmlstr = strdup(position); + } } else { - position += strlen(marker); - *xmlstr = strdup(position); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No result received from mrcp server\n"); + ret = SWITCH_STATUS_FALSE; } - } - else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No result received from mrcp server\n"); - ret = SWITCH_STATUS_FALSE; - } - // since we are returning our result here, future calls to check_results - // should return False - switch_clear_flag_locked(asr_session, FLAG_HAS_TEXT); - ret = SWITCH_STATUS_SUCCESS; + ret = SWITCH_STATUS_SUCCESS; + } + else if (message->start_line.method_id == RECOGNIZER_START_OF_INPUT) { + ret = SWITCH_STATUS_BREAK; + } } return ret; } @@ -658,10 +642,25 @@ media_frame_t media_frame; audio_source_t *audio_source; - if (switch_test_flag(tts_session, FLAG_SPEAK_COMPLETE)) { - /* tell fs we are done */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "FLAG_SPEAK_COMPLETE\n"); - return SWITCH_STATUS_BREAK; + if (switch_test_flag(tts_session, FLAG_HAS_MESSAGE)) { + mrcp_message_t *message = tts_session->mrcp_message_last_rcvd; + tts_session->mrcp_message_last_rcvd = NULL; + switch_clear_flag_locked(tts_session, FLAG_HAS_MESSAGE); + + if (message->start_line.message_type == MRCP_MESSAGE_TYPE_RESPONSE) { + if (message->start_line.status_code != MRCP_STATUS_CODE_SUCCESS && + message->start_line.status_code != MRCP_STATUS_CODE_SUCCESS_WITH_IGNORE) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "error code received [%d]\n", message->start_line.status_code); + return SWITCH_STATUS_BREAK; + } + } + else if (message->start_line.message_type == MRCP_MESSAGE_TYPE_EVENT) { + if (message->start_line.method_id == SYNTHESIZER_SPEAK_COMPLETE) { + /* tell fs we are done */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "FLAG_SPEAK_COMPLETE\n"); + return SWITCH_STATUS_BREAK; + } + } } audio_source = mrcp_client_audio_source_get(tts_session->audio_channel); @@ -962,5 +961,5 @@ { /* destroy openmrcp */ openmrcp_destroy(); - return SWITCH_STATUS_UNLOAD; + return SWITCH_STATUS_SUCCESS; } Modified: freeswitch/branches/greenlizard/src/mod/endpoints/mod_dingaling/mod_dingaling.c ============================================================================== --- freeswitch/branches/greenlizard/src/mod/endpoints/mod_dingaling/mod_dingaling.c (original) +++ freeswitch/branches/greenlizard/src/mod/endpoints/mod_dingaling/mod_dingaling.c Thu Sep 6 12:57:43 2007 @@ -2650,12 +2650,11 @@ cid_name, cid_num, ldl_session_get_ip(dlsession), - ldl_session_get_value(dlsession, - "ani"), - ldl_session_get_value(dlsession, - "aniii"), - ldl_session_get_value(dlsession, - "rdnis"), (char *) modname, context, + ldl_session_get_value(dlsession, "ani"), + ldl_session_get_value(dlsession, "aniii"), + ldl_session_get_value(dlsession, "rdnis"), + modname, + context, exten)) != 0) { char name[128]; snprintf(name, sizeof(name), "DingaLing/%s", tech_pvt->caller_profile->destination_number); Modified: freeswitch/branches/greenlizard/src/mod/endpoints/mod_iax/mod_iax.c ============================================================================== --- freeswitch/branches/greenlizard/src/mod/endpoints/mod_iax/mod_iax.c (original) +++ freeswitch/branches/greenlizard/src/mod/endpoints/mod_iax/mod_iax.c Thu Sep 6 12:57:43 2007 @@ -1107,8 +1107,9 @@ iaxevent->ies.calling_ani, NULL, NULL, - (char *) modname, - iaxevent->ies.called_context, iaxevent->ies.called_number)) != 0) { + modname, + iaxevent->ies.called_context, + iaxevent->ies.called_number)) != 0) { char name[128]; snprintf(name, sizeof(name), "IAX/%s-%04x", tech_pvt->caller_profile->destination_number, rand() & 0xffff); switch_channel_set_name(channel, name); Modified: freeswitch/branches/greenlizard/src/mod/endpoints/mod_portaudio/mod_portaudio.c ============================================================================== --- freeswitch/branches/greenlizard/src/mod/endpoints/mod_portaudio/mod_portaudio.c (original) +++ freeswitch/branches/greenlizard/src/mod/endpoints/mod_portaudio/mod_portaudio.c Thu Sep 6 12:57:43 2007 @@ -1600,8 +1600,8 @@ } if ((tech_pvt->caller_profile = switch_caller_profile_new(switch_core_session_get_pool(session), - NULL, - dialplan, cid_name, cid_num, NULL, NULL, NULL, NULL, (char *) modname, NULL, + NULL, dialplan, cid_name, cid_num, + NULL, NULL, NULL, NULL, modname, NULL, dest)) != 0) { char name[128]; snprintf(name, sizeof(name), "PortAudio/%s", Modified: freeswitch/branches/greenlizard/src/mod/endpoints/mod_sofia/sofia.c ============================================================================== --- freeswitch/branches/greenlizard/src/mod/endpoints/mod_sofia/sofia.c (original) +++ freeswitch/branches/greenlizard/src/mod/endpoints/mod_sofia/sofia.c Thu Sep 6 12:57:43 2007 @@ -1935,7 +1935,10 @@ tech_pvt->caller_profile = switch_caller_profile_new(switch_core_session_get_pool(session), from_user, profile->dialplan, - displayname, from_user, network_ip, NULL, NULL, NULL, MODNAME, context, destination_number); + displayname, + from_user, + network_ip, + NULL, NULL, NULL, MODNAME, context, destination_number); if (tech_pvt->caller_profile) { Modified: freeswitch/branches/greenlizard/src/mod/endpoints/mod_sofia/sofia_glue.c ============================================================================== --- freeswitch/branches/greenlizard/src/mod/endpoints/mod_sofia/sofia_glue.c (original) +++ freeswitch/branches/greenlizard/src/mod/endpoints/mod_sofia/sofia_glue.c Thu Sep 6 12:57:43 2007 @@ -505,10 +505,10 @@ if (switch_test_flag(caller_profile, SWITCH_CPF_HIDE_NAME)) { priv = "name"; if (switch_test_flag(caller_profile, SWITCH_CPF_HIDE_NUMBER)) { - priv = "yes"; + priv = "full"; } } else if (switch_test_flag(caller_profile, SWITCH_CPF_HIDE_NUMBER)) { - priv = "yes"; + priv = "full"; } if (switch_test_flag(caller_profile, SWITCH_CPF_SCREEN)) { screen = "yes"; @@ -1369,6 +1369,7 @@ case 603: return SWITCH_CAUSE_CALL_REJECTED; case 404: + return SWITCH_CAUSE_UNALLOCATED; case 485: case 604: return SWITCH_CAUSE_NO_ROUTE_DESTINATION; Modified: freeswitch/branches/greenlizard/src/mod/endpoints/mod_sofia/sofia_reg.c ============================================================================== --- freeswitch/branches/greenlizard/src/mod/endpoints/mod_sofia/sofia_reg.c (original) +++ freeswitch/branches/greenlizard/src/mod/endpoints/mod_sofia/sofia_reg.c Thu Sep 6 12:57:43 2007 @@ -729,8 +729,9 @@ const char *passwd = NULL; const char *a1_hash = NULL; char *sql; - switch_xml_t domain, xml, user, param, xparams; - + switch_xml_t domain, xml = NULL, user, param, xparams; + char hexdigest[2 * SU_MD5_DIGEST_SIZE + 1] = ""; + username = realm = nonce = uri = qop = cnonce = nc = response = NULL; if (authorization->au_params) { @@ -805,7 +806,6 @@ if (!(xparams = switch_xml_child(user, "params"))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "can't find params for user [%s@%s]\n", username, realm); - switch_xml_free(xml); ret = AUTH_FORBIDDEN; goto end; } @@ -838,8 +838,6 @@ } } - switch_xml_free(xml); - if (switch_strlen_zero(passwd) && switch_strlen_zero(a1_hash)) { ret = AUTH_OK; goto end; @@ -847,7 +845,6 @@ if (!a1_hash) { su_md5_t ctx; - char hexdigest[2 * SU_MD5_DIGEST_SIZE + 1]; char *input; input = switch_mprintf("%s:%s:%s", username, realm, passwd); @@ -894,6 +891,9 @@ } end: + if (xml) { + switch_xml_free(xml); + } switch_safe_free(input); switch_safe_free(input2); switch_safe_free(username); Modified: freeswitch/branches/greenlizard/src/mod/endpoints/mod_woomera/mod_woomera.c ============================================================================== --- freeswitch/branches/greenlizard/src/mod/endpoints/mod_woomera/mod_woomera.c (original) +++ freeswitch/branches/greenlizard/src/mod/endpoints/mod_woomera/mod_woomera.c Thu Sep 6 12:57:43 2007 @@ -1059,7 +1059,15 @@ if ((tech_pvt->caller_profile = switch_caller_profile_new(switch_core_session_get_pool(session), NULL, tech_pvt->profile->dialplan, - cid_name, cid_num, ip, NULL, NULL, NULL, (char *) modname, NULL, exten)) != 0) { + cid_name, + cid_num, + ip, + NULL, + NULL, + NULL, + modname, + NULL, + exten)) != 0) { char name[128]; snprintf(name, sizeof(name), "Woomera/%s-%04x", tech_pvt->caller_profile->destination_number, rand() & 0xffff); switch_channel_set_name(channel, name); Modified: freeswitch/branches/greenlizard/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c ============================================================================== --- freeswitch/branches/greenlizard/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c (original) +++ freeswitch/branches/greenlizard/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c Thu Sep 6 12:57:43 2007 @@ -1242,6 +1242,7 @@ char *phrase_name = NULL; char *phrase_data = NULL; char *phrase_lang = NULL; + char *tmp = NULL; //char *input_callback = NULL; void *bp = NULL; int len = 0; @@ -1272,7 +1273,10 @@ } if (argc > 2) { - phrase_lang = JS_GetStringBytes(JS_ValueToString(cx, argv[2])); + tmp = JS_GetStringBytes(JS_ValueToString(cx, argv[2])); + if (!switch_strlen_zero(tmp)) { + phrase_lang = tmp; + } } if (argc > 3) { @@ -1502,6 +1506,53 @@ return JS_TRUE; } +static void destroy_speech_engine(struct js_session *jss) +{ + if (jss->speech) { + switch_speech_flag_t flags = SWITCH_SPEECH_FLAG_NONE; + switch_core_codec_destroy(&jss->speech->codec); + switch_core_speech_close(&jss->speech->sh, &flags); + jss->speech = NULL; + } +} + + +static switch_status_t init_speech_engine(struct js_session *jss, char *engine, char *voice) +{ + switch_codec_t *read_codec; + switch_speech_flag_t flags = SWITCH_SPEECH_FLAG_NONE; + uint32_t rate = 0; + int interval = 0; + + read_codec = switch_core_session_get_read_codec(jss->session); + rate = read_codec->implementation->samples_per_second; + interval = read_codec->implementation->microseconds_per_frame / 1000; + + if (switch_core_codec_init(&jss->speech->codec, + "L16", + NULL, + rate, + interval, + 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, + switch_core_session_get_pool(jss->session)) == SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Raw Codec Activation Success L16@%uhz 1 channel %dms\n", rate, interval); + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Raw Codec Activation Failed L16@%uhz 1 channel %dms\n", rate, interval); + return SWITCH_STATUS_FALSE; + } + + + if (switch_core_speech_open(&jss->speech->sh, engine, voice, rate, interval, + &flags, switch_core_session_get_pool(jss->session)) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid TTS module!\n"); + switch_core_codec_destroy(&jss->speech->codec); + return SWITCH_STATUS_FALSE; + } + + return SWITCH_STATUS_SUCCESS; + +} + static JSBool session_speak(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval) { @@ -1520,13 +1571,13 @@ METHOD_SANITY_CHECK(); + *rval = BOOLEAN_TO_JSVAL(JS_FALSE); channel = switch_core_session_get_channel(jss->session); assert(channel != NULL); CHANNEL_SANITY_CHECK(); if (argc < 3) { - *rval = BOOLEAN_TO_JSVAL(JS_FALSE); return JS_FALSE; } @@ -1534,6 +1585,34 @@ voice_name = JS_GetStringBytes(JS_ValueToString(cx, argv[1])); text = JS_GetStringBytes(JS_ValueToString(cx, argv[2])); + + if (switch_strlen_zero(tts_name)) { + eval_some_js("~throw new Error(\"Invalid TTS Name\");", cx, obj, rval); + return JS_TRUE; + } + + if (switch_strlen_zero(text)) { + eval_some_js("~throw new Error(\"Invalid Text\");", cx, obj, rval); + return JS_TRUE; + } + + + if (jss->speech && strcasecmp(jss->speech->sh.name, tts_name)) { + destroy_speech_engine(jss); + } + + if (jss->speech) { + switch_core_speech_text_param_tts(&jss->speech->sh, "voice", voice_name); + } else { + jss->speech = switch_core_session_alloc(jss->session, sizeof(*jss->speech)); + assert(jss->speech != NULL); + if (init_speech_engine(jss, tts_name, voice_name) != SWITCH_STATUS_SUCCESS) { + eval_some_js("~throw new Error(\"Cannot allocate speech engine!\");", cx, obj, rval); + jss->speech = NULL; + return JS_TRUE; + } + } + if (argc > 3) { if ((function = JS_ValueToFunction(cx, argv[3]))) { memset(&cb_state, 0, sizeof(cb_state)); @@ -1551,9 +1630,6 @@ } } - if (!tts_name && text) { - return JS_FALSE; - } codec = switch_core_session_get_read_codec(jss->session); cb_state.ret = BOOLEAN_TO_JSVAL(JS_FALSE); @@ -1561,8 +1637,9 @@ args.input_callback = dtmf_func; args.buf = bp; args.buflen = len; - switch_ivr_speak_text(jss->session, tts_name, voice_name - && strlen(voice_name) ? voice_name : NULL, codec->implementation->samples_per_second, text, &args); + + switch_core_speech_flush_tts(&jss->speech->sh); + switch_ivr_speak_text_handle(jss->session, &jss->speech->sh, &jss->speech->codec, NULL, text, &args); JS_ResumeRequest(cx, cb_state.saveDepth); *rval = cb_state.ret; @@ -2353,9 +2430,8 @@ return JS_FALSE; } - caller_profile = switch_caller_profile_new(pool, - username, dialplan, cid_name, cid_num, network_addr, ani, aniii, rdnis, (char *) modname, context, - dest); + caller_profile = switch_caller_profile_new(pool,username, dialplan, cid_name, cid_num, network_addr, + ani, aniii, rdnis, modname, context, dest); if (switch_ivr_originate(session, &peer_session, &jss->cause, dest, to ? atoi(to) : 60, NULL, NULL, NULL, caller_profile) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Cannot Create Outgoing Channel! [%s]\n", dest); @@ -2385,6 +2461,8 @@ if (cx && obj) { if ((jss = JS_GetPrivate(cx, obj))) { + destroy_speech_engine(jss); + if (jss->session) { channel = switch_core_session_get_channel(jss->session); switch_channel_set_private(channel, "jss", NULL); Modified: freeswitch/branches/greenlizard/src/mod/languages/mod_spidermonkey/mod_spidermonkey.h ============================================================================== --- freeswitch/branches/greenlizard/src/mod/languages/mod_spidermonkey/mod_spidermonkey.h (original) +++ freeswitch/branches/greenlizard/src/mod/languages/mod_spidermonkey/mod_spidermonkey.h Thu Sep 6 12:57:43 2007 @@ -122,6 +122,11 @@ typedef struct sm_module_interface sm_module_interface_t; typedef switch_status_t (*spidermonkey_init_t) (const sm_module_interface_t ** module_interface); +struct js_session_speech { + switch_speech_handle_t sh; + switch_codec_t codec; +}; + struct js_session { switch_core_session_t *session; JSContext *cx; @@ -141,6 +146,7 @@ char *rdnis; char *context; char *username; + struct js_session_speech *speech; }; JSBool DEFAULT_SET_PROPERTY(JSContext * cx, JSObject *obj, jsval id, jsval *vp) Modified: freeswitch/branches/greenlizard/src/mod/say/mod_say_en/mod_say_en.c ============================================================================== --- freeswitch/branches/greenlizard/src/mod/say/mod_say_en/mod_say_en.c (original) +++ freeswitch/branches/greenlizard/src/mod/say/mod_say_en/mod_say_en.c Thu Sep 6 12:57:43 2007 @@ -156,7 +156,8 @@ { switch_channel_t *channel; int in; - int x = 0, places[9] = { 0 }; + uint32_t x = 0; + int places[9] = { 0 }; char sbuf[13] = ""; switch_status_t status; Modified: freeswitch/branches/greenlizard/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c ============================================================================== --- freeswitch/branches/greenlizard/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c (original) +++ freeswitch/branches/greenlizard/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c Thu Sep 6 12:57:43 2007 @@ -88,7 +88,8 @@ if(!switch_strlen_zero(logdir)) { if ((path = switch_mprintf("%s/xml_cdr/%s.cdr.xml", logdir, switch_core_session_get_uuid(session)))) { if ((fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)) > -1) { - write(fd, xml_text, (unsigned) strlen(xml_text)); + int wrote; + wrote = write(fd, xml_text, (unsigned) strlen(xml_text)); close(fd); fd = -1; } else { @@ -160,7 +161,8 @@ if ((path = switch_mprintf("%s/%s.cdr.xml", globals.errLogDir, switch_core_session_get_uuid(session)))) { if ((fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)) > -1) { - write(fd, xml_text, (unsigned) strlen(xml_text)); + int wrote; + wrote = write(fd, xml_text, (unsigned) strlen(xml_text)); close(fd); fd = -1; } else { Modified: freeswitch/branches/greenlizard/src/mod/xml_int/mod_xml_curl/mod_xml_curl.c ============================================================================== --- freeswitch/branches/greenlizard/src/mod/xml_int/mod_xml_curl/mod_xml_curl.c (original) +++ freeswitch/branches/greenlizard/src/mod/xml_int/mod_xml_curl/mod_xml_curl.c Thu Sep 6 12:57:43 2007 @@ -53,8 +53,8 @@ { register unsigned int realsize = (unsigned int) (size * nmemb); struct config_data *config_data = data; - - write(config_data->fd, ptr, realsize); + int x; + x = write(config_data->fd, ptr, realsize); return realsize; } @@ -72,7 +72,7 @@ xml_binding_t *binding = (xml_binding_t *) user_data; char *file_url; struct curl_slist *slist = NULL; - long httpRes; + long httpRes = 0; if (!binding) { return NULL; Modified: freeswitch/branches/greenlizard/src/switch_caller.c ============================================================================== --- freeswitch/branches/greenlizard/src/switch_caller.c (original) +++ freeswitch/branches/greenlizard/src/switch_caller.c Thu Sep 6 12:57:43 2007 @@ -63,29 +63,31 @@ profile->context = switch_clean_string(switch_core_strdup(pool, switch_str_nil(context))); profile->destination_number = switch_clean_string(switch_core_strdup(pool, switch_str_nil(destination_number))); switch_set_flag(profile, SWITCH_CPF_SCREEN); + profile->pool = pool; } return profile; } -SWITCH_DECLARE(switch_caller_profile_t *) switch_caller_profile_clone(switch_core_session_t *session, switch_caller_profile_t *tocopy) +SWITCH_DECLARE(switch_caller_profile_t *) switch_caller_profile_dup(switch_memory_pool_t *pool, switch_caller_profile_t *tocopy) { switch_caller_profile_t *profile = NULL; - if ((profile = switch_core_session_alloc(session, sizeof(switch_caller_profile_t))) != 0) { - profile->username = switch_core_session_strdup(session, tocopy->username); - profile->dialplan = switch_core_session_strdup(session, tocopy->dialplan); - profile->caller_id_name = switch_core_session_strdup(session, tocopy->caller_id_name); - profile->ani = switch_core_session_strdup(session, tocopy->ani); - profile->aniii = switch_core_session_strdup(session, tocopy->aniii); - profile->caller_id_number = switch_core_session_strdup(session, tocopy->caller_id_number); - profile->network_addr = switch_core_session_strdup(session, tocopy->network_addr); - profile->rdnis = switch_core_session_strdup(session, tocopy->rdnis); - profile->destination_number = switch_core_session_strdup(session, tocopy->destination_number); - profile->uuid = switch_core_session_strdup(session, tocopy->uuid); - profile->source = switch_core_session_strdup(session, tocopy->source); - profile->context = switch_core_session_strdup(session, tocopy->context); - profile->chan_name = switch_core_session_strdup(session, tocopy->chan_name); + + if ((profile = switch_core_alloc(pool, sizeof(switch_caller_profile_t))) != 0) { + profile->username = switch_core_strdup(pool, tocopy->username); + profile->dialplan = switch_core_strdup(pool, tocopy->dialplan); + profile->caller_id_name = switch_core_strdup(pool, tocopy->caller_id_name); + profile->ani = switch_core_strdup(pool, tocopy->ani); + profile->aniii = switch_core_strdup(pool, tocopy->aniii); + profile->caller_id_number = switch_core_strdup(pool, tocopy->caller_id_number); + profile->network_addr = switch_core_strdup(pool, tocopy->network_addr); + profile->rdnis = switch_core_strdup(pool, tocopy->rdnis); + profile->destination_number = switch_core_strdup(pool, tocopy->destination_number); + profile->uuid = switch_core_strdup(pool, tocopy->uuid); + profile->source = switch_core_strdup(pool, tocopy->source); + profile->context = switch_core_strdup(pool, tocopy->context); + profile->chan_name = switch_core_strdup(pool, tocopy->chan_name); profile->caller_ton = tocopy->caller_ton; profile->caller_numplan = tocopy->caller_numplan; profile->ani_ton = tocopy->ani_ton; @@ -95,11 +97,23 @@ profile->destination_number_ton = tocopy->destination_number_ton; profile->destination_number_numplan = tocopy->destination_number_numplan; profile->flags = tocopy->flags; + profile->pool = pool; } return profile; } + +SWITCH_DECLARE(switch_caller_profile_t *) switch_caller_profile_clone(switch_core_session_t *session, switch_caller_profile_t *tocopy) +{ + switch_memory_pool_t *pool; + + pool = switch_core_session_get_pool(session); + + return switch_caller_profile_dup(pool, tocopy); +} + + SWITCH_DECLARE(char *) switch_caller_get_field_by_name(switch_caller_profile_t *caller_profile, const char *name) { if (!strcasecmp(name, "dialplan")) { @@ -141,6 +155,30 @@ if (!strcasecmp(name, "chan_name")) { return caller_profile->chan_name; } + if (!strcasecmp(name, "caller_ton")) { + return switch_core_sprintf(caller_profile->pool, "%u", caller_profile->caller_ton); + } + if (!strcasecmp(name, "caller_numplan")) { + return switch_core_sprintf(caller_profile->pool, "%u", caller_profile->caller_numplan); + } + if (!strcasecmp(name, "destination_number_ton")) { + return switch_core_sprintf(caller_profile->pool, "%u", caller_profile->destination_number_ton); + } + if (!strcasecmp(name, "destination_number_numplan")) { + return switch_core_sprintf(caller_profile->pool, "%u", caller_profile->destination_number_numplan); + } + if (!strcasecmp(name, "ani_ton")) { + return switch_core_sprintf(caller_profile->pool, "%u", caller_profile->ani_ton); + } + if (!strcasecmp(name, "ani_numplan")) { + return switch_core_sprintf(caller_profile->pool, "%u", caller_profile->ani_numplan); + } + if (!strcasecmp(name, "rdnis_ton")) { + return switch_core_sprintf(caller_profile->pool, "%u", caller_profile->rdnis_ton); + } + if (!strcasecmp(name, "rdnis_numplan")) { + return switch_core_sprintf(caller_profile->pool, "%u", caller_profile->rdnis_numplan); + } return NULL; } Modified: freeswitch/branches/greenlizard/src/switch_console.c ============================================================================== --- freeswitch/branches/greenlizard/src/switch_console.c (original) +++ freeswitch/branches/greenlizard/src/switch_console.c Thu Sep 6 12:57:43 2007 @@ -183,7 +183,7 @@ static char prompt_str[512] = ""; char * prompt(EditLine *e) { - if (switch_strlen_zero(prompt_str)) { + if (*prompt_str == '\0') { gethostname(hostname, sizeof(hostname)); snprintf(prompt_str, sizeof(prompt_str), "freeswitch@%s> ", hostname); } Modified: freeswitch/branches/greenlizard/src/switch_core_directory.c ============================================================================== --- freeswitch/branches/greenlizard/src/switch_core_directory.c (original) +++ freeswitch/branches/greenlizard/src/switch_core_directory.c Thu Sep 6 12:57:43 2007 @@ -76,28 +76,3 @@ return dh->directory_interface->directory_close(dh); } -SWITCH_DECLARE(switch_status_t) switch_core_speech_open(switch_speech_handle_t *sh, - char *module_name, - char *voice_name, unsigned int rate, switch_speech_flag_t *flags, switch_memory_pool_t *pool) -{ - switch_status_t status; - - if ((sh->speech_interface = switch_loadable_module_get_speech_interface(module_name)) == 0) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "invalid speech module [%s]!\n", module_name); - return SWITCH_STATUS_GENERR; - } - - switch_copy_string(sh->engine, module_name, sizeof(sh->engine)); - sh->flags = *flags; - if (pool) { - sh->memory_pool = pool; - } else { - if ((status = switch_core_new_memory_pool(&sh->memory_pool)) != SWITCH_STATUS_SUCCESS) { - return status; - } - switch_set_flag(sh, SWITCH_SPEECH_FLAG_FREE_POOL); - } - sh->rate = rate; - sh->name = switch_core_strdup(pool, module_name); - return sh->speech_interface->speech_open(sh, voice_name, rate, flags); -} Modified: freeswitch/branches/greenlizard/src/switch_core_session.c ============================================================================== --- freeswitch/branches/greenlizard/src/switch_core_session.c (original) +++ freeswitch/branches/greenlizard/src/switch_core_session.c Thu Sep 6 12:57:43 2007 @@ -201,23 +201,14 @@ ecaller_id_number = switch_channel_get_variable(channel, "effective_caller_id_number"); if (ecaller_id_name || ecaller_id_number) { - if (!ecaller_id_name) { - ecaller_id_name = caller_profile->caller_id_name; + outgoing_profile = switch_caller_profile_clone(session, caller_profile); + + if (ecaller_id_name) { + outgoing_profile->caller_id_name = ecaller_id_name; } - if (!ecaller_id_number) { - ecaller_id_number = caller_profile->caller_id_number; + if (ecaller_id_number) { + outgoing_profile->caller_id_number = ecaller_id_number; } - outgoing_profile = switch_caller_profile_new(switch_core_session_get_pool(session), - caller_profile->username, - caller_profile->dialplan, - ecaller_id_name, - ecaller_id_number, - caller_profile->network_addr, - caller_profile->ani, - caller_profile->aniii, - caller_profile->rdnis, - caller_profile->source, caller_profile->context, caller_profile->destination_number); - outgoing_profile->flags = caller_profile->flags; } } if (!outgoing_profile) { Modified: freeswitch/branches/greenlizard/src/switch_core_speech.c ============================================================================== --- freeswitch/branches/greenlizard/src/switch_core_speech.c (original) +++ freeswitch/branches/greenlizard/src/switch_core_speech.c Thu Sep 6 12:57:43 2007 @@ -34,6 +34,40 @@ #include <switch.h> #include "private/switch_core_pvt.h" + +SWITCH_DECLARE(switch_status_t) switch_core_speech_open(switch_speech_handle_t *sh, + char *module_name, + char *voice_name, + unsigned int rate, + unsigned int interval, + switch_speech_flag_t *flags, + switch_memory_pool_t *pool) +{ + switch_status_t status; + + if ((sh->speech_interface = switch_loadable_module_get_speech_interface(module_name)) == 0) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "invalid speech module [%s]!\n", module_name); + return SWITCH_STATUS_GENERR; + } + + switch_copy_string(sh->engine, module_name, sizeof(sh->engine)); + sh->flags = *flags; + if (pool) { + sh->memory_pool = pool; + } else { + if ((status = switch_core_new_memory_pool(&sh->memory_pool)) != SWITCH_STATUS_SUCCESS) { + return status; + } + switch_set_flag(sh, SWITCH_SPEECH_FLAG_FREE_POOL); + } + sh->rate = rate; + sh->name = switch_core_strdup(pool, module_name); + sh->samples = switch_bytes_per_frame(rate, interval); + + return sh->speech_interface->speech_open(sh, voice_name, rate, flags); +} + + SWITCH_DECLARE(switch_status_t) switch_core_speech_feed_tts(switch_speech_handle_t *sh, char *text, switch_speech_flag_t *flags) { assert(sh != NULL); Modified: freeswitch/branches/greenlizard/src/switch_cpp.cpp ============================================================================== --- freeswitch/branches/greenlizard/src/switch_cpp.cpp (original) +++ freeswitch/branches/greenlizard/src/switch_cpp.cpp Thu Sep 6 12:57:43 2007 @@ -123,7 +123,6 @@ int CoreSession::speak(char *text) { switch_status_t status; - switch_codec_t *codec; sanity_check(-1); @@ -142,9 +141,9 @@ return SWITCH_STATUS_FALSE; } - codec = switch_core_session_get_read_codec(session); + begin_allow_threads(); - status = switch_ivr_speak_text(session, tts_name, voice_name, codec->implementation->samples_per_second, text, ap); + status = switch_ivr_speak_text(session, tts_name, voice_name, text, ap); end_allow_threads(); return status == SWITCH_STATUS_SUCCESS ? 1 : 0; } Modified: freeswitch/branches/greenlizard/src/switch_ivr_bridge.c ============================================================================== --- freeswitch/branches/greenlizard/src/switch_ivr_bridge.c (original) +++ freeswitch/branches/greenlizard/src/switch_ivr_bridge.c Thu Sep 6 12:57:43 2007 @@ -84,12 +84,14 @@ switch_event_t *event; loop_count++; - /* if you really want to make sure it's not ready, test it twice because it might be just a break */ - if (!switch_channel_ready(chan_a) && !switch_channel_ready(chan_a)) { + if (!switch_channel_ready(chan_a)) { break; } if ((b_state = switch_channel_get_state(chan_b)) >= CS_HANGUP) { + if (originator && !ans_a && !ans_b) { + switch_channel_hangup(chan_a, switch_channel_get_cause(chan_b)); + } break; } @@ -163,8 +165,7 @@ continue; } } - - + /* read audio from 1 channel and write it to the other */ status = switch_core_session_read_frame(session_a, &read_frame, -1, stream_id); Modified: freeswitch/branches/greenlizard/src/switch_ivr_menu.c ============================================================================== --- freeswitch/branches/greenlizard/src/switch_ivr_menu.c (original) +++ freeswitch/branches/greenlizard/src/switch_ivr_menu.c Thu Sep 6 12:57:43 2007 @@ -263,7 +263,7 @@ } else { if (strlen(sound) > 4 && strncmp(sound, "say:", 4) == 0) { if (menu->tts_engine && menu->tts_voice) { - status = switch_ivr_speak_text(session, menu->tts_engine, menu->tts_voice, 0, sound + 4, &args); + status = switch_ivr_speak_text(session, menu->tts_engine, menu->tts_voice, sound + 4, &args); } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No TTS engine to play sound\n"); } @@ -369,7 +369,7 @@ status = switch_ivr_play_file(session, NULL, aptr, NULL); break; case SWITCH_IVR_ACTION_SAYTEXT: - status = switch_ivr_speak_text(session, menu->tts_engine, menu->tts_voice, 0, aptr, NULL); + status = switch_ivr_speak_text(session, menu->tts_engine, menu->tts_voice, aptr, NULL); break; case SWITCH_IVR_ACTION_SAYPHRASE: status = switch_ivr_phrase_macro(session, aptr, "", menu->phrase_lang, NULL); Modified: freeswitch/branches/greenlizard/src/switch_ivr_originate.c ============================================================================== --- freeswitch/branches/greenlizard/src/switch_ivr_originate.c (original) +++ freeswitch/branches/greenlizard/src/switch_ivr_originate.c Thu Sep 6 12:57:43 2007 @@ -470,34 +470,18 @@ } caller_caller_profile = caller_profile_override ? caller_profile_override : switch_channel_get_caller_profile(caller_channel); + new_profile = switch_caller_profile_clone(session, caller_caller_profile); + new_profile->destination_number = chan_data; - if (!cid_name_override) { - cid_name_override = caller_caller_profile->caller_id_name; + if (cid_name_override) { + new_profile->caller_id_name = cid_name_override; } - if (!cid_num_override) { - cid_num_override = caller_caller_profile->caller_id_number; + if (cid_num_override) { + new_profile->caller_id_number = cid_num_override; } - new_profile = switch_caller_profile_new(switch_core_session_get_pool(session), - caller_caller_profile->username, - caller_caller_profile->dialplan, - cid_name_override, - cid_num_override, - caller_caller_profile->network_addr, - NULL, - NULL, - caller_caller_profile->rdnis, - caller_caller_profile->source, caller_caller_profile->context, chan_data); - new_profile->flags = caller_caller_profile->flags; pool = NULL; } else { - if (!cid_name_override) { - cid_name_override = "FreeSWITCH"; - } - if (!cid_num_override) { - cid_num_override = "0000000000"; - } - if (switch_core_new_memory_pool(&pool) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "OH OH no pool\n"); status = SWITCH_STATUS_TERM; @@ -505,22 +489,23 @@ } if (caller_profile_override) { - new_profile = switch_caller_profile_new(pool, - caller_profile_override->username, - caller_profile_override->dialplan, - caller_profile_override->caller_id_name, - caller_profile_override->caller_id_number, - caller_profile_override->network_addr, - caller_profile_override->ani, - caller_profile_override->aniii, - caller_profile_override->rdnis, - caller_profile_override->source, caller_profile_override->context, chan_data); + new_profile = switch_caller_profile_dup(pool, caller_profile_override); + new_profile->destination_number = chan_data; } else { + if (!cid_name_override) { + cid_name_override = "FreeSWITCH"; + } + if (!cid_num_override) { + cid_num_override = "0000000000"; + } + new_profile = switch_caller_profile_new(pool, - NULL, - NULL, - cid_name_override, cid_num_override, NULL, NULL, NULL, NULL, __FILE__, NULL, - chan_data); + NULL, + NULL, + cid_name_override, + cid_num_override, + NULL, NULL, NULL, NULL, __FILE__, NULL, + chan_data); } } Modified: freeswitch/branches/greenlizard/src/switch_ivr_play_say.c ============================================================================== --- freeswitch/branches/greenlizard/src/switch_ivr_play_say.c (original) +++ freeswitch/branches/greenlizard/src/switch_ivr_play_say.c Thu Sep 6 12:57:43 2007 @@ -250,11 +250,7 @@ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid SAY Interface [%s]!\n", chan_lang); } } else if (!strcasecmp(func, "speak-text")) { - switch_codec_t *read_codec; - if ((read_codec = switch_core_session_get_read_codec(session))) { - - status = switch_ivr_speak_text(session, tts_engine, tts_voice, read_codec->implementation->samples_per_second, odata, args); - } + status = switch_ivr_speak_text(session, tts_engine, tts_voice, odata, args); } } } @@ -1340,11 +1336,11 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_speak_text(switch_core_session_t *session, - char *tts_name, char *voice_name, uint32_t rate, char *text, switch_input_args_t *args) + char *tts_name, char *voice_name, char *text, switch_input_args_t *args) { switch_channel_t *channel; + uint32_t rate = 0; int interval = 0; - uint32_t len = 0; switch_frame_t write_frame = { 0 }; switch_timer_t timer; switch_core_thread_session_t thread_session; @@ -1366,12 +1362,12 @@ switch_core_session_reset(session); read_codec = switch_core_session_get_read_codec(session); - if (rate == 0) { - rate = read_codec->implementation->samples_per_second; - } + rate = read_codec->implementation->samples_per_second; + interval = read_codec->implementation->microseconds_per_frame / 1000; memset(&sh, 0, sizeof(sh)); - if (switch_core_speech_open(&sh, tts_name, voice_name, (uint32_t) rate, &flags, switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) { + if (switch_core_speech_open(&sh, tts_name, voice_name, (uint32_t) rate, interval, + &flags, switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid TTS module!\n"); switch_core_session_reset(session); return SWITCH_STATUS_FALSE; @@ -1380,9 +1376,6 @@ switch_channel_answer(channel); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "OPEN TTS %s\n", tts_name); - interval = read_codec->implementation->microseconds_per_frame / 1000; - sh.samples = switch_bytes_per_frame(rate, interval); - len = sh.samples * 2; codec_name = "L16"; @@ -1409,7 +1402,7 @@ switch_core_session_reset(session); return SWITCH_STATUS_GENERR; } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "setup timer success %u bytes per %d ms!\n", len, interval); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "setup timer success %u bytes per %d ms!\n", sh.samples * 2, interval); /* start a thread to absorb incoming audio */ for (stream_id = 0; stream_id < switch_core_session_get_stream_count(session); stream_id++) { Modified: freeswitch/branches/greenlizard/src/switch_odbc.c ============================================================================== --- freeswitch/branches/greenlizard/src/switch_odbc.c (original) +++ freeswitch/branches/greenlizard/src/switch_odbc.c Thu Sep 6 12:57:43 2007 @@ -415,14 +415,14 @@ SWITCH_DECLARE(char *) switch_odbc_handle_get_error(switch_odbc_handle_t *handle, SQLHSTMT stmt) { - char buffer[SQL_MAX_MESSAGE_LENGTH + 1]; - char sqlstate[SQL_SQLSTATE_SIZE + 1]; + char buffer[SQL_MAX_MESSAGE_LENGTH + 1] = ""; + char sqlstate[SQL_SQLSTATE_SIZE + 1] = ""; SQLINTEGER sqlcode; SQLSMALLINT length; char *ret = NULL; if (SQLError(handle->env, handle->con, stmt, (SQLCHAR *)sqlstate, &sqlcode, (SQLCHAR *)buffer, sizeof(buffer), &length) == SQL_SUCCESS) { - ret = switch_mprintf("STATE: %s CODE %ld ERROR: %s\n", switch_str_nil(sqlstate), sqlcode, switch_str_nil(buffer)); + ret = switch_mprintf("STATE: %s CODE %ld ERROR: %s\n", sqlstate, sqlcode, buffer); }; return ret; Modified: freeswitch/branches/greenlizard/src/switch_swig.c ============================================================================== --- freeswitch/branches/greenlizard/src/switch_swig.c (original) +++ freeswitch/branches/greenlizard/src/switch_swig.c Thu Sep 6 12:57:43 2007 @@ -260,11 +260,11 @@ return status == SWITCH_STATUS_SUCCESS ? 1 : 0; } -int fs_switch_ivr_speak_text(switch_core_session_t *session, char *tts_name, char *voice_name, uint32_t rate, char *text) +int fs_switch_ivr_speak_text(switch_core_session_t *session, char *tts_name, char *voice_name, char *text) { switch_status_t status; - status = switch_ivr_speak_text(session, tts_name, voice_name, rate, text, NULL); + status = switch_ivr_speak_text(session, tts_name, voice_name, text, NULL); return status == SWITCH_STATUS_SUCCESS ? 1 : 0; } Modified: freeswitch/branches/greenlizard/src/switch_xml.c ============================================================================== --- freeswitch/branches/greenlizard/src/switch_xml.c (original) +++ freeswitch/branches/greenlizard/src/switch_xml.c Thu Sep 6 12:57:43 2007 @@ -966,16 +966,16 @@ } } - if ((cmd = strstr(bp, "<!--#"))) { - if(write(write_fd, bp, (unsigned) (cmd - bp)) != (cmd - bp)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Short write!\n"); - } + if ((cmd = strstr(bp, "<!--#"))) { + if(write(write_fd, bp, (unsigned) (cmd - bp)) != (cmd - bp)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Short write!\n"); + } if ((e = strstr(cmd, "-->"))) { *e = '\0'; - e += 3; - if(write(write_fd, e, (unsigned) strlen(e)) != (int) strlen(e)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Short write!\n"); - } + e += 3; + if(write(write_fd, e, (unsigned) strlen(e)) != (int) strlen(e)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Short write!\n"); + } } else { ml++; } @@ -1031,11 +1031,11 @@ continue; } - - if(write(write_fd, bp, (unsigned) cur) != (int) cur) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Short write!\n"); - } - + + if(write(write_fd, bp, (unsigned) cur) != (int) cur) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Short write!\n"); + } + } close(read_fd);