Author: anthm Date: Fri Apr 18 13:03:34 2008 New Revision: 8126 Modified: freeswitch/trunk/src/include/private/switch_core_pvt.h freeswitch/trunk/src/include/switch_core.h freeswitch/trunk/src/include/switch_types.h freeswitch/trunk/src/mod/applications/mod_commands/mod_commands.c freeswitch/trunk/src/mod/endpoints/mod_alsa/mod_alsa.c freeswitch/trunk/src/mod/endpoints/mod_dingaling/mod_dingaling.c freeswitch/trunk/src/mod/endpoints/mod_iax/mod_iax.c freeswitch/trunk/src/mod/endpoints/mod_portaudio/mod_portaudio.c freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c freeswitch/trunk/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c freeswitch/trunk/src/switch_channel.c freeswitch/trunk/src/switch_core.c freeswitch/trunk/src/switch_core_io.c freeswitch/trunk/src/switch_ivr_async.c freeswitch/trunk/src/switch_rtp.c Log: make dtmf duration defaults tweakable Modified: freeswitch/trunk/src/include/private/switch_core_pvt.h ============================================================================== --- freeswitch/trunk/src/include/private/switch_core_pvt.h (original) +++ freeswitch/trunk/src/include/private/switch_core_pvt.h Fri Apr 18 13:03:34 2008 @@ -184,6 +184,8 @@ switch_log_level_t hard_log_level; char *mailer_app; char *mailer_app_args; + uint32_t max_dtmf_duration; + uint32_t default_dtmf_duration; }; extern struct switch_runtime runtime; Modified: freeswitch/trunk/src/include/switch_core.h ============================================================================== --- freeswitch/trunk/src/include/switch_core.h (original) +++ freeswitch/trunk/src/include/switch_core.h Fri Apr 18 13:03:34 2008 @@ -1598,6 +1598,8 @@ SWITCH_DECLARE(void) switch_load_network_lists(switch_bool_t reload); SWITCH_DECLARE(switch_bool_t) switch_check_network_list_ip(const char *ip_str, const char *list_name); SWITCH_DECLARE(void) switch_time_set_monotonic(switch_bool_t enable); +SWITCH_DECLARE(uint32_t) switch_core_max_dtmf_duration(uint32_t duration); +SWITCH_DECLARE(uint32_t) switch_core_default_dtmf_duration(uint32_t duration); ///\} Modified: freeswitch/trunk/src/include/switch_types.h ============================================================================== --- freeswitch/trunk/src/include/switch_types.h (original) +++ freeswitch/trunk/src/include/switch_types.h Fri Apr 18 13:03:34 2008 @@ -1137,7 +1137,9 @@ SCSC_LAST_SPS, SCSC_RECLAIM, SCSC_MAX_SESSIONS, - SCSC_SYNC_CLOCK + SCSC_SYNC_CLOCK, + SCSC_MAX_DTMF_DURATION, + SCSC_DEFAULT_DTMF_DURATION } switch_session_ctl_t; typedef struct apr_pool_t switch_memory_pool_t; Modified: freeswitch/trunk/src/mod/applications/mod_commands/mod_commands.c ============================================================================== --- freeswitch/trunk/src/mod/applications/mod_commands/mod_commands.c (original) +++ freeswitch/trunk/src/mod/applications/mod_commands/mod_commands.c Fri Apr 18 13:03:34 2008 @@ -562,7 +562,7 @@ return SWITCH_STATUS_SUCCESS; } -#define CTL_SYNTAX "[hupall|pause|resume|shutdown|sync_clock|reclaim_mem|max_sessions [num]|loglevel [level]]" +#define CTL_SYNTAX "[hupall|pause|resume|shutdown|sync_clock|reclaim_mem|max_sessions|max_dtmf_duration [num]|loglevel [level]]" SWITCH_STANDARD_API(ctl_function) { int argc; @@ -597,6 +597,18 @@ } switch_core_session_ctl(SCSC_MAX_SESSIONS, &arg); stream->write_function(stream, "+OK max sessions: %d\n", arg); + } else if (!strcasecmp(argv[0], "max_dtmf_duration")) { + if (argc > 1) { + arg = atoi(argv[1]); + } + switch_core_session_ctl(SCSC_MAX_DTMF_DURATION, &arg); + stream->write_function(stream, "+OK max dtmf duration: %d\n", arg); + } else if (!strcasecmp(argv[0], "default_dtmf_duration")) { + if (argc > 1) { + arg = atoi(argv[1]); + } + switch_core_session_ctl(SCSC_DEFAULT_DTMF_DURATION, &arg); + stream->write_function(stream, "+OK default dtmf duration: %d\n", arg); } else if (!strcasecmp(argv[0], "loglevel")) { if (argc > 1) { if (*argv[1] > 47 && *argv[1] < 58) { Modified: freeswitch/trunk/src/mod/endpoints/mod_alsa/mod_alsa.c ============================================================================== --- freeswitch/trunk/src/mod/endpoints/mod_alsa/mod_alsa.c (original) +++ freeswitch/trunk/src/mod/endpoints/mod_alsa/mod_alsa.c Fri Apr 18 13:03:34 2008 @@ -1212,7 +1212,7 @@ static switch_status_t dtmf_call(char **argv, int argc, switch_stream_handle_t *stream) { char *dtmf_str = argv[0]; - switch_dtmf_t dtmf = {0, SWITCH_DEFAULT_DTMF_DURATION}; + switch_dtmf_t dtmf = {0, switch_core_default_dtmf_duration(0)}; if (switch_strlen_zero(dtmf_str)) { stream->write_function(stream, "No DTMF Supplied!\n"); Modified: freeswitch/trunk/src/mod/endpoints/mod_dingaling/mod_dingaling.c ============================================================================== --- freeswitch/trunk/src/mod/endpoints/mod_dingaling/mod_dingaling.c (original) +++ freeswitch/trunk/src/mod/endpoints/mod_dingaling/mod_dingaling.c Fri Apr 18 13:03:34 2008 @@ -2706,7 +2706,7 @@ if (msg) { if (*msg == '+') { char *p = msg + 1; - switch_dtmf_t dtmf = { 0, SWITCH_DEFAULT_DTMF_DURATION }; + switch_dtmf_t dtmf = { 0, switch_core_default_dtmf_duration(0) }; while (p && *p) { dtmf.digit = *p; switch_channel_queue_dtmf(channel, &dtmf); Modified: freeswitch/trunk/src/mod/endpoints/mod_iax/mod_iax.c ============================================================================== --- freeswitch/trunk/src/mod/endpoints/mod_iax/mod_iax.c (original) +++ freeswitch/trunk/src/mod/endpoints/mod_iax/mod_iax.c Fri Apr 18 13:03:34 2008 @@ -1126,7 +1126,7 @@ break; case IAX_EVENT_DTMF: if (channel) { - switch_dtmf_t dtmf = { (char) iaxevent->subclass , SWITCH_DEFAULT_DTMF_DURATION }; + switch_dtmf_t dtmf = { (char) iaxevent->subclass , switch_core_default_dtmf_duration(0) }; if (globals.debug) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%c DTMF %s\n", dtmf.digit, switch_channel_get_name(channel)); } Modified: freeswitch/trunk/src/mod/endpoints/mod_portaudio/mod_portaudio.c ============================================================================== --- freeswitch/trunk/src/mod/endpoints/mod_portaudio/mod_portaudio.c (original) +++ freeswitch/trunk/src/mod/endpoints/mod_portaudio/mod_portaudio.c Fri Apr 18 13:03:34 2008 @@ -1203,7 +1203,7 @@ static switch_status_t dtmf_call(char **argv, int argc, switch_stream_handle_t *stream) { char *dtmf_str = argv[0]; - switch_dtmf_t dtmf = {0, SWITCH_DEFAULT_DTMF_DURATION}; + switch_dtmf_t dtmf = {0, switch_core_default_dtmf_duration(0)}; if (switch_strlen_zero(dtmf_str)) { stream->write_function(stream, "No DTMF Supplied!\n"); Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c ============================================================================== --- freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c (original) +++ freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c Fri Apr 18 13:03:34 2008 @@ -2382,7 +2382,7 @@ const char *signal_ptr; const char *rec_header; const char *clientcode_header; - switch_dtmf_t dtmf = { 0, SWITCH_DEFAULT_DTMF_DURATION }; + switch_dtmf_t dtmf = { 0, switch_core_default_dtmf_duration(0) }; if (session) { /* Get the channel */ @@ -2408,7 +2408,7 @@ int tmp; signal_ptr += 9; if ((tmp = atoi(signal_ptr)) <= 0) { - tmp = SWITCH_DEFAULT_DTMF_DURATION; + tmp = switch_core_default_dtmf_duration(0); } dtmf.duration = tmp * 8; } Modified: freeswitch/trunk/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c ============================================================================== --- freeswitch/trunk/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c (original) +++ freeswitch/trunk/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c Fri Apr 18 13:03:34 2008 @@ -761,7 +761,7 @@ static JSBool dtmf_construct(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval) { switch_dtmf_t *dtmf; - int32 duration = SWITCH_DEFAULT_DTMF_DURATION; + int32 duration = switch_core_default_dtmf_duration(0); char *ename; if (argc > 0) { @@ -774,7 +774,7 @@ if (argc > 1) { JS_ValueToInt32(cx, argv[1], &duration); if (duration <= 0) { - duration = SWITCH_DEFAULT_DTMF_DURATION; + duration = switch_core_default_dtmf_duration(0); } } Modified: freeswitch/trunk/src/switch_channel.c ============================================================================== --- freeswitch/trunk/src/switch_channel.c (original) +++ freeswitch/trunk/src/switch_channel.c Fri Apr 18 13:03:34 2008 @@ -226,12 +226,12 @@ switch_dtmf_t *dt; int x = 0; - if (new_dtmf.duration > SWITCH_MAX_DTMF_DURATION) { + if (new_dtmf.duration > switch_core_max_dtmf_duration(0)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "%s EXECSSIVE DTMF DIGIT [%c] LEN [%d]\n", switch_channel_get_name(channel), new_dtmf.digit, new_dtmf.duration); - new_dtmf.duration = SWITCH_MAX_DTMF_DURATION; + new_dtmf.duration = switch_core_max_dtmf_duration(0); } else if (!new_dtmf.duration) { - new_dtmf.duration = SWITCH_DEFAULT_DTMF_DURATION; + new_dtmf.duration = switch_core_default_dtmf_duration(0); } switch_zmalloc(dt, sizeof(*dt)); @@ -259,7 +259,7 @@ SWITCH_DECLARE(switch_status_t) switch_channel_queue_dtmf_string(switch_channel_t *channel, const char *dtmf_string) { char *p; - switch_dtmf_t dtmf = {0, SWITCH_DEFAULT_DTMF_DURATION}; + switch_dtmf_t dtmf = {0, switch_core_default_dtmf_duration(0)}; int sent = 0, dur; char *string; int i, argc; @@ -273,8 +273,8 @@ argc = switch_separate_string(string, '+', argv, (sizeof(argv) / sizeof(argv[0]))); for(i = 0; i < argc; i++) { - dtmf.duration = SWITCH_DEFAULT_DTMF_DURATION; - dur = SWITCH_DEFAULT_DTMF_DURATION / 8; + dtmf.duration = switch_core_default_dtmf_duration(0); + dur = switch_core_default_dtmf_duration(0) / 8; if ((p = strchr(argv[i], '@'))) { *p++ = '\0'; if ((dur = atoi(p)) > 50) { @@ -282,11 +282,11 @@ } } - if (dtmf.duration > SWITCH_MAX_DTMF_DURATION) { + if (dtmf.duration > switch_core_max_dtmf_duration(0)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "EXECSSIVE DTMF DIGIT LEN %c %d\n", dtmf.digit, dtmf.duration); - dtmf.duration = SWITCH_MAX_DTMF_DURATION; + dtmf.duration = switch_core_max_dtmf_duration(0); } else if (!dtmf.duration) { - dtmf.duration = SWITCH_DEFAULT_DTMF_DURATION; + dtmf.duration = switch_core_default_dtmf_duration(0); } @@ -320,12 +320,12 @@ *dtmf = *dt; free(dt); - if (dtmf->duration > SWITCH_MAX_DTMF_DURATION) { + if (dtmf->duration > switch_core_max_dtmf_duration(0)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "%s EXECSSIVE DTMF DIGIT [%c] LEN [%d]\n", switch_channel_get_name(channel), dtmf->digit, dtmf->duration); - dtmf->duration = SWITCH_MAX_DTMF_DURATION; + dtmf->duration = switch_core_max_dtmf_duration(0); } else if (!dtmf->duration) { - dtmf->duration = SWITCH_DEFAULT_DTMF_DURATION; + dtmf->duration = switch_core_default_dtmf_duration(0); } status = SWITCH_STATUS_SUCCESS; Modified: freeswitch/trunk/src/switch_core.c ============================================================================== --- freeswitch/trunk/src/switch_core.c (original) +++ freeswitch/trunk/src/switch_core.c Fri Apr 18 13:03:34 2008 @@ -812,6 +812,28 @@ switch_mutex_unlock(runtime.global_mutex); } +SWITCH_DECLARE(uint32_t) switch_core_max_dtmf_duration(uint32_t duration) +{ + if (duration) { + if (duration > SWITCH_MAX_DTMF_DURATION) { + duration = SWITCH_MAX_DTMF_DURATION; + } + runtime.max_dtmf_duration = duration; + } + return runtime.max_dtmf_duration; +} + +SWITCH_DECLARE(uint32_t) switch_core_default_dtmf_duration(uint32_t duration) +{ + if (duration) { + if (duration < SWITCH_DEFAULT_DTMF_DURATION) { + duration = SWITCH_DEFAULT_DTMF_DURATION; + } + runtime.default_dtmf_duration = duration; + } + return runtime.default_dtmf_duration; +} + SWITCH_DECLARE(switch_status_t) switch_core_init(switch_core_flag_t flags, switch_bool_t console, const char **err) { switch_xml_t xml = NULL, cfg = NULL; @@ -824,6 +846,8 @@ runtime.hard_log_level = SWITCH_LOG_DEBUG; runtime.mailer_app = "sendmail"; runtime.mailer_app_args = "-t"; + runtime.max_dtmf_duration = SWITCH_MAX_DTMF_DURATION; + runtime.default_dtmf_duration = SWITCH_DEFAULT_DTMF_DURATION; /* INIT APR and Create the pool context */ if (apr_initialize() != SWITCH_STATUS_SUCCESS) { @@ -898,6 +922,16 @@ runtime.mailer_app_args = switch_core_strdup(runtime.memory_pool, val); } else if (!strcasecmp(var, "sessions-per-second")) { switch_core_sessions_per_second(atoi(val)); + } else if (!strcasecmp(var, "max_dtmf_duration")) { + int tmp = atoi(val); + if (tmp > 0) { + switch_core_max_dtmf_duration((uint32_t)tmp); + } + } else if (!strcasecmp(var, "default_dtmf_duration")) { + int tmp = atoi(val); + if (tmp > 0) { + switch_core_default_dtmf_duration((uint32_t)tmp); + } } else if (!strcasecmp(var, "disable-monotonic-timing")) { switch_time_set_monotonic(SWITCH_FALSE); } else if (!strcasecmp(var, "max-sessions")) { @@ -1137,6 +1171,12 @@ case SCSC_LAST_SPS: *val = runtime.sps_last; break; + case SCSC_MAX_DTMF_DURATION: + *val = switch_core_max_dtmf_duration(*val); + break; + case SCSC_DEFAULT_DTMF_DURATION: + *val = switch_core_default_dtmf_duration(*val); + break; case SCSC_SPS: switch_mutex_lock(runtime.throttle_mutex); if (*val > 0) { Modified: freeswitch/trunk/src/switch_core_io.c ============================================================================== --- freeswitch/trunk/src/switch_core_io.c (original) +++ freeswitch/trunk/src/switch_core_io.c Fri Apr 18 13:03:34 2008 @@ -952,12 +952,12 @@ new_dtmf = *dtmf; - if (new_dtmf.duration > SWITCH_MAX_DTMF_DURATION) { + if (new_dtmf.duration > switch_core_max_dtmf_duration(0)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "%s EXECSSIVE DTMF DIGIT [%c] LEN [%d]\n", switch_channel_get_name(session->channel), new_dtmf.digit, new_dtmf.duration); - new_dtmf.duration = SWITCH_MAX_DTMF_DURATION; + new_dtmf.duration = switch_core_max_dtmf_duration(0); } else if (!new_dtmf.duration) { - new_dtmf.duration = SWITCH_DEFAULT_DTMF_DURATION; + new_dtmf.duration = switch_core_default_dtmf_duration(0); } for (ptr = session->event_hooks.recv_dtmf; ptr; ptr = ptr->next) { @@ -982,12 +982,12 @@ new_dtmf = *dtmf; - if (new_dtmf.duration > SWITCH_MAX_DTMF_DURATION) { + if (new_dtmf.duration > switch_core_max_dtmf_duration(0)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "%s EXECSSIVE DTMF DIGIT [%c] LEN [%d]\n", switch_channel_get_name(session->channel), new_dtmf.digit, new_dtmf.duration); - new_dtmf.duration = SWITCH_MAX_DTMF_DURATION; + new_dtmf.duration = switch_core_max_dtmf_duration(0); } else if (!new_dtmf.duration) { - new_dtmf.duration = SWITCH_DEFAULT_DTMF_DURATION; + new_dtmf.duration = switch_core_default_dtmf_duration(0); } @@ -1012,7 +1012,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_send_dtmf_string(switch_core_session_t *session, const char *dtmf_string) { char *p; - switch_dtmf_t dtmf = {0, SWITCH_DEFAULT_DTMF_DURATION}; + switch_dtmf_t dtmf = {0, switch_core_default_dtmf_duration(0)}; int sent = 0, dur; char *string; int i, argc; @@ -1042,8 +1042,8 @@ } for(i = 0; i < argc; i++) { - dtmf.duration = SWITCH_DEFAULT_DTMF_DURATION; - dur = SWITCH_DEFAULT_DTMF_DURATION / 8; + dtmf.duration = switch_core_default_dtmf_duration(0); + dur = switch_core_default_dtmf_duration(0) / 8; if ((p = strchr(argv[i], '@'))) { *p++ = '\0'; if ((dur = atoi(p)) > 50) { @@ -1052,12 +1052,12 @@ } - if (dtmf.duration > SWITCH_MAX_DTMF_DURATION) { + if (dtmf.duration > switch_core_max_dtmf_duration(0)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "%s EXECSSIVE DTMF DIGIT [%c] LEN [%d]\n", switch_channel_get_name(session->channel), dtmf.digit, dtmf.duration); - dtmf.duration = SWITCH_MAX_DTMF_DURATION; + dtmf.duration = switch_core_max_dtmf_duration(0); } else if (!dtmf.duration) { - dtmf.duration = SWITCH_DEFAULT_DTMF_DURATION; + dtmf.duration = switch_core_default_dtmf_duration(0); } for (p = argv[i]; p && *p; p++) { Modified: freeswitch/trunk/src/switch_ivr_async.c ============================================================================== --- freeswitch/trunk/src/switch_ivr_async.c (original) +++ freeswitch/trunk/src/switch_ivr_async.c Fri Apr 18 13:03:34 2008 @@ -845,7 +845,7 @@ while(p && *p) { switch_dtmf_t dtmf; dtmf.digit = *p; - dtmf.duration = SWITCH_DEFAULT_DTMF_DURATION; + dtmf.duration = switch_core_default_dtmf_duration(0); switch_channel_queue_dtmf(channel, &dtmf); p++; } Modified: freeswitch/trunk/src/switch_rtp.c ============================================================================== --- freeswitch/trunk/src/switch_rtp.c (original) +++ freeswitch/trunk/src/switch_rtp.c Fri Apr 18 13:03:34 2008 @@ -1467,8 +1467,8 @@ if ((rdigit = malloc(sizeof(*rdigit))) != 0) { *rdigit = *dtmf; - if (rdigit->duration < SWITCH_DEFAULT_DTMF_DURATION) { - rdigit->duration = SWITCH_DEFAULT_DTMF_DURATION; + if (rdigit->duration < switch_core_default_dtmf_duration(0)) { + rdigit->duration = switch_core_default_dtmf_duration(0); } if ((switch_queue_trypush(rtp_session->dtmf_data.dtmf_queue, rdigit)) != SWITCH_STATUS_SUCCESS) { @@ -1492,8 +1492,8 @@ if ((rdigit = malloc(sizeof(*rdigit))) != 0) { *rdigit = *dtmf; - if (rdigit->duration < SWITCH_DEFAULT_DTMF_DURATION) { - rdigit->duration = SWITCH_DEFAULT_DTMF_DURATION; + if (rdigit->duration < switch_core_default_dtmf_duration(0)) { + rdigit->duration = switch_core_default_dtmf_duration(0); } if ((switch_queue_trypush(rtp_session->dtmf_data.dtmf_inqueue, rdigit)) != SWITCH_STATUS_SUCCESS) {