clean up tone_detect
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@11738 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
parent
7dd39a1309
commit
ba77f23278
|
@ -34,6 +34,7 @@ if [ -z $arg ] ; then
|
|||
$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
|
||||
|
|
|
@ -174,10 +174,16 @@ void teletone_multi_tone_init(teletone_multi_tone_t *mt, teletone_tone_map_t *ma
|
|||
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 @@ void teletone_multi_tone_init(teletone_multi_tone_t *mt, teletone_tone_map_t *ma
|
|||
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;
|
||||
|
|
|
@ -1228,6 +1228,7 @@ typedef struct {
|
|||
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 @@ static switch_bool_t tone_detect_callback(switch_media_bug_t *bug, void *user_da
|
|||
|
||||
switch (type) {
|
||||
case SWITCH_ABC_TYPE_INIT:
|
||||
if (cont) {
|
||||
cont->bug_running = 1;
|
||||
}
|
||||
break;
|
||||
case SWITCH_ABC_TYPE_CLOSE:
|
||||
break;
|
||||
|
@ -1252,9 +1256,7 @@ static switch_bool_t tone_detect_callback(switch_media_bug_t *bug, void *user_da
|
|||
} 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 @@ static switch_bool_t tone_detect_callback(switch_media_bug_t *bug, void *user_da
|
|||
}
|
||||
|
||||
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 @@ static switch_bool_t tone_detect_callback(switch_media_bug_t *bug, void *user_da
|
|||
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 @@ static switch_bool_t tone_detect_callback(switch_media_bug_t *bug, void *user_da
|
|||
}
|
||||
}
|
||||
|
||||
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 @@ static switch_bool_t tone_detect_callback(switch_media_bug_t *bug, void *user_da
|
|||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (rval == SWITCH_FALSE) {
|
||||
cont->bug_running = 0;
|
||||
}
|
||||
|
||||
return rval;
|
||||
}
|
||||
|
||||
|
@ -1335,9 +1349,13 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_stop_tone_detect_session(switch_core_
|
|||
{
|
||||
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_stop_tone_detect_session(switch_core_
|
|||
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_DECLARE(switch_status_t) switch_ivr_tone_detect_session(switch_core_sessi
|
|||
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 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_tone_detect_session(switch_core_sessi
|
|||
}
|
||||
|
||||
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 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_tone_detect_session(switch_core_sessi
|
|||
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 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_tone_detect_session(switch_core_sessi
|
|||
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 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_tone_detect_session(switch_core_sessi
|
|||
}
|
||||
}
|
||||
|
||||
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;
|
||||
|
|
|
@ -101,6 +101,8 @@ typedef struct {
|
|||
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 @@ static switch_bool_t monitor_callback(switch_core_session_t *session, const char
|
|||
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 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
|
|||
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 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
|
|||
|
||||
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 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
|
|||
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 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
|
|||
*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 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
|
|||
|
||||
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 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
|
|||
}
|
||||
|
||||
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 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
|
|||
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 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
|
|||
char *vdata;
|
||||
end = NULL;
|
||||
chan_type = peer_names[i];
|
||||
|
||||
|
||||
while (chan_type && *chan_type && *chan_type == ' ') {
|
||||
chan_type++;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue