[commit] r11738 - in freeswitch/trunk: build libs/libteletone/src src
Author: anthm Date: Tue Feb 10 18:16:36 2009 New Revision: 11738 Log: clean up tone_detect Modified: freeswitch/trunk/build/turbo_build.sh freeswitch/trunk/libs/libteletone/src/libteletone_detect.c freeswitch/trunk/src/switch_ivr_async.c freeswitch/trunk/src/switch_ivr_originate.c Modified: freeswitch/trunk/build/turbo_build.sh ============================================================================== --- freeswitch/trunk/build/turbo_build.sh (original) +++ freeswitch/trunk/build/turbo_build.sh Tue Feb 10 18:16:36 2009 @@ -34,6 +34,7 @@ $MAKE install_core 2>&1 > /dev/null mods=`find src/mod -name \*.so | grep .libs` /bin/cp -fp $mods $prefix/mod + mods=`find $prefix/mod -name \*.so` echo installed core and $mods exit; fi Modified: freeswitch/trunk/libs/libteletone/src/libteletone_detect.c ============================================================================== --- freeswitch/trunk/libs/libteletone/src/libteletone_detect.c (original) +++ freeswitch/trunk/libs/libteletone/src/libteletone_detect.c Tue Feb 10 18:16:36 2009 @@ -174,10 +174,16 @@ float theta = 0; int x = 0; - if(!mt->min_samples) { + if (!mt->sample_rate) { + mt->sample_rate = 8000; + } + + if (!mt->min_samples) { mt->min_samples = 102; } + mt->min_samples *= (mt->sample_rate / 8000); + if (!mt->positive_factor) { mt->positive_factor = 2; } @@ -190,10 +196,6 @@ mt->hit_factor = 2; } - if (!mt->sample_rate) { - mt->sample_rate = 8000; - } - for(x = 0; x < TELETONE_MAX_TONES; x++) { if ((int) map->freqs[x] == 0) { break; Modified: freeswitch/trunk/src/switch_ivr_async.c ============================================================================== --- freeswitch/trunk/src/switch_ivr_async.c (original) +++ freeswitch/trunk/src/switch_ivr_async.c Tue Feb 10 18:16:36 2009 @@ -1228,6 +1228,7 @@ int index; switch_media_bug_t *bug; switch_core_session_t *session; + int bug_running; } switch_tone_container_t; static switch_bool_t tone_detect_callback(switch_media_bug_t *bug, void *user_data, switch_abc_type_t type) @@ -1239,6 +1240,9 @@ switch (type) { case SWITCH_ABC_TYPE_INIT: + if (cont) { + cont->bug_running = 1; + } break; case SWITCH_ABC_TYPE_CLOSE: break; @@ -1252,9 +1256,7 @@ } else { frame = switch_core_media_bug_get_write_replace_frame(bug); } - - - + for (i = 0; i < cont->index; i++) { if (cont->list[i].sleep) { @@ -1274,9 +1276,9 @@ } if (!cont->list[i].up) skip = 1; - - if (skip) return SWITCH_TRUE; + if (skip) return SWITCH_TRUE; + if (teletone_multi_tone_detect(&cont->list[i].mt, frame->data, frame->samples)) { switch_event_t *event; cont->list[i].hits++; @@ -1289,12 +1291,15 @@ if (cont->list[i].hits >= cont->list[i].total_hits) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "TONE %s DETECTED\n", cont->list[i].key); cont->list[i].up = 0; - if (cont->list[i].once) { - rval = SWITCH_FALSE; - } - + if (cont->list[i].callback) { - rval = cont->list[i].callback(cont->session, cont->list[i].app, cont->list[i].data); + if ((rval = cont->list[i].callback(cont->session, cont->list[i].app, cont->list[i].data)) == SWITCH_TRUE) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Re-enabling %s\n", cont->list[i].key); + cont->list[i].up = 1; + cont->list[i].hits = 0; + cont->list[i].sleep = 0; + cont->list[i].expires = 0; + } } else if (cont->list[i].app) { if (switch_event_create(&event, SWITCH_EVENT_COMMAND) == SWITCH_STATUS_SUCCESS) { switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "call-command", "execute"); @@ -1305,6 +1310,10 @@ } } + if (cont->list[i].once) { + rval = SWITCH_FALSE; + } + if (switch_event_create(&event, SWITCH_EVENT_DETECTED_TONE) == SWITCH_STATUS_SUCCESS) { switch_event_t *dup; switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Detected-Tone", cont->list[i].key); @@ -1328,6 +1337,11 @@ default: break; } + + if (rval == SWITCH_FALSE) { + cont->bug_running = 0; + } + return rval; } @@ -1335,9 +1349,13 @@ { switch_channel_t *channel = switch_core_session_get_channel(session); switch_tone_container_t *cont = switch_channel_get_private(channel, "_tone_detect_"); + int i = 0; if (cont) { switch_channel_set_private(channel, "_tone_detect_", NULL); + for (i = 0; i < cont->index; i++) { + cont->list[i].up = 0; + } switch_core_media_bug_remove(session, &cont->bug); return SWITCH_STATUS_SUCCESS; } @@ -1347,7 +1365,8 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_tone_detect_session(switch_core_session_t *session, const char *key, const char *tone_spec, const char *flags, time_t timeout, - int hits, const char *app, const char *data, + int hits, + const char *app, const char *data, switch_tone_detect_callback_t callback) { switch_channel_t *channel = switch_core_session_get_channel(session); @@ -1360,7 +1379,7 @@ switch_codec_implementation_t read_impl = {0}; switch_core_session_get_read_impl(session, &read_impl); - + if (switch_strlen_zero(key)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No Key Specified!\n"); return SWITCH_STATUS_FALSE; @@ -1373,9 +1392,9 @@ } for (i = 0; i < cont->index; i++) { - if (!switch_strlen_zero(cont->list[cont->index].key) && !strcasecmp(key, cont->list[cont->index].key)) { + if (!switch_strlen_zero(cont->list[i].key) && !strcasecmp(key, cont->list[i].key)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Re-enabling %s\n", key); - cont->list[cont->index].up = 1; + cont->list[i].up = 1; cont->list[i].hits = 0; cont->list[i].sleep = 0; cont->list[i].expires = 0; @@ -1436,6 +1455,7 @@ cont->list[cont->index].total_hits = hits; cont->list[cont->index].up = 1; + memset(&cont->list[cont->index].mt, 0, sizeof(cont->list[cont->index].mt)); cont->list[cont->index].mt.sample_rate = read_impl.actual_samples_per_second; teletone_multi_tone_init(&cont->list[cont->index].mt, &cont->list[cont->index].map); cont->session = session; @@ -1468,7 +1488,7 @@ if (strchr(flags, 'o')) { cont->list[cont->index].once = 1; } - + if (strchr(flags, 'r')) { bflags |= SMBF_READ_REPLACE; } else if (strchr(flags, 'w')) { @@ -1476,11 +1496,18 @@ } } - if ((status = switch_core_media_bug_add(session, tone_detect_callback, cont, timeout, bflags, &cont->bug)) != SWITCH_STATUS_SUCCESS) { - return status; + if (cont->bug_running) { + status = SWITCH_STATUS_SUCCESS; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s bug already running\n", switch_channel_get_name(channel)); + } else { + cont->bug_running = 1; + if ((status = switch_core_media_bug_add(session, tone_detect_callback, cont, timeout, bflags, &cont->bug)) != SWITCH_STATUS_SUCCESS) { + cont->bug_running = 0; + return status; + } + switch_channel_set_private(channel, "_tone_detect_", cont); } - switch_channel_set_private(channel, "_tone_detect_", cont); cont->index++; return SWITCH_STATUS_SUCCESS; Modified: freeswitch/trunk/src/switch_ivr_originate.c ============================================================================== --- freeswitch/trunk/src/switch_ivr_originate.c (original) +++ freeswitch/trunk/src/switch_ivr_originate.c Tue Feb 10 18:16:36 2009 @@ -101,6 +101,8 @@ uint8_t progress; uint8_t return_ring_ready; uint8_t monitor_early_media_ring; + uint8_t monitor_early_media_ring_total; + uint8_t monitor_early_media_ring_count; uint8_t monitor_early_media_fail; uint8_t gen_ringback; uint8_t ignore_early_media; @@ -264,9 +266,14 @@ bd = "monitor_early_media_ring"; } switch_channel_set_variable(channel, "originate_disposition", bd); - + if (oglobals) { - + if (oglobals->monitor_early_media_ring_total && ++oglobals->monitor_early_media_ring_count < oglobals->monitor_early_media_ring_total) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Ring %d/%d\n", + oglobals->monitor_early_media_ring_count, oglobals->monitor_early_media_ring_total); + return SWITCH_TRUE; + } + switch_channel_set_private(channel, "_oglobals_", NULL); if (!oglobals->progress) { @@ -296,6 +303,7 @@ int pindex = -1; oglobals->hups = 0; oglobals->idx = IDX_NADA; + char bug_key[256] = ""; if (oglobals->session) { caller_channel = switch_core_session_get_channel(oglobals->session); @@ -304,7 +312,7 @@ for (i = 0; i < len; i++) { switch_channel_state_t state; - if (!originate_status[i].peer_channel) { + if (!(originate_status[i].peer_channel && originate_status[i].peer_session)) { continue; } @@ -332,7 +340,8 @@ int fail_count = 0; char *fail_data = strdup(var); int fx; - + int y = 0; + switch_assert(fail_data); fail_count = switch_separate_string(fail_data, '!', fail_array, (sizeof(fail_array) / sizeof(fail_array[0]))); @@ -375,10 +384,13 @@ *q = ','; } } - + switch_snprintf(bug_key, sizeof(bug_key), "monitor_early_media_fail_%d", ++y); switch_ivr_tone_detect_session(originate_status[i].peer_session, - "monitor_early_media_fail", - p, "r", 0, hits, "fail", cause, monitor_callback); + bug_key, + p, "r", 0, + hits, + "fail", + cause, monitor_callback); } @@ -389,12 +401,14 @@ if (oglobals->monitor_early_media_ring) { const char *var = switch_channel_get_variable(originate_status[i].peer_channel, "monitor_early_media_ring"); + const char *var_total = switch_channel_get_variable(originate_status[i].peer_channel, "monitor_early_media_ring_total"); if (!switch_strlen_zero(var)) { char *ring_array[128] = {0}; int ring_count = 0; char *ring_data = strdup(var); int fx; - + int y = 0; + switch_assert(ring_data); ring_count = switch_separate_string(ring_data, '!', ring_array, (sizeof(ring_array) / sizeof(ring_array[0]))); @@ -429,12 +443,22 @@ } switch_channel_set_private(originate_status[i].peer_channel, "_oglobals_", oglobals); + switch_snprintf(bug_key, sizeof(bug_key), "monitor_early_media_ring_%d", ++y); switch_ivr_tone_detect_session(originate_status[i].peer_session, - "monitor_early_media_ring", + bug_key, p, "r", 0, hits, "ring", NULL, monitor_callback); } + if (var_total) { + int tmp = atoi(var_total); + if (tmp > 0 && tmp < 100) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s setting ring total to %d\n", + switch_channel_get_name(originate_status[i].peer_channel), tmp); + oglobals->monitor_early_media_ring_total = tmp; + } + } + switch_safe_free(ring_data); } @@ -992,6 +1016,8 @@ ok = 1; } else if (!strcasecmp((char *) hi->name, "monitor_early_media_ring")) { ok = 1; + } else if (!strcasecmp((char *) hi->name, "monitor_early_media_ring_total")) { + ok = 1; } else if (!strcasecmp((char *) hi->name, "monitor_early_media_fail")) { ok = 1; } else if (!strcasecmp((char *) hi->name, "return_ring_ready")) { @@ -1269,7 +1295,7 @@ char *vdata; end = NULL; chan_type = peer_names[i]; - + while (chan_type && *chan_type && *chan_type == ' ') { chan_type++; }
participants (1)
-
FreeSWITCH SVN