diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 9f89289d86..903d083ccb 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -1510,7 +1510,8 @@ typedef enum { SMBF_STEREO_SWAP = (1 << 11), SMBF_LOCK = (1 << 12), SMBF_TAP_NATIVE_READ = (1 << 13), - SMBF_TAP_NATIVE_WRITE = (1 << 14) + SMBF_TAP_NATIVE_WRITE = (1 << 14), + SMBF_ONE_ONLY = (1 << 15) } switch_media_bug_flag_enum_t; typedef uint32_t switch_media_bug_flag_t; diff --git a/src/mod/applications/mod_spandsp/mod_spandsp_dsp.c b/src/mod/applications/mod_spandsp/mod_spandsp_dsp.c index 906d7787e6..eec68dce91 100644 --- a/src/mod/applications/mod_spandsp/mod_spandsp_dsp.c +++ b/src/mod/applications/mod_spandsp/mod_spandsp_dsp.c @@ -505,7 +505,7 @@ switch_status_t spandsp_inband_dtmf_session(switch_core_session_t *session) } if ((status = switch_core_media_bug_add(session, "spandsp_dtmf_detect", NULL, - inband_dtmf_callback, pvt, 0, SMBF_READ_REPLACE | SMBF_NO_PAUSE, &bug)) != SWITCH_STATUS_SUCCESS) { + inband_dtmf_callback, pvt, 0, SMBF_READ_REPLACE | SMBF_NO_PAUSE | SMBF_ONE_ONLY, &bug)) != SWITCH_STATUS_SUCCESS) { return status; } diff --git a/src/switch_core_media_bug.c b/src/switch_core_media_bug.c index 9999c644e7..c340b71e63 100644 --- a/src/switch_core_media_bug.c +++ b/src/switch_core_media_bug.c @@ -411,10 +411,28 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_bug_add(switch_core_session_t switch_media_bug_t *bug, *bp; switch_size_t bytes; switch_event_t *event; - int tap_only = 1; + int tap_only = 1, punt = 0; const char *p; + if (!zstr(function)) { + if ((flags & SMBF_ONE_ONLY)) { + switch_thread_rwlock_wrlock(session->bug_rwlock); + for (bp = session->bugs; bp; bp = bp->next) { + if (!zstr(bp->function) && !strcasecmp(function, bp->function)) { + punt = 1; + break; + } + } + switch_thread_rwlock_unlock(session->bug_rwlock); + } + } + + if (punt) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Only one bug of this type allowed!\n"); + } + + if (!switch_channel_media_ready(session->channel)) { if (switch_channel_pre_answer(session->channel) != SWITCH_STATUS_SUCCESS) { return SWITCH_STATUS_FALSE; diff --git a/src/switch_ivr_async.c b/src/switch_ivr_async.c index e2ef526af8..45d7711835 100644 --- a/src/switch_ivr_async.c +++ b/src/switch_ivr_async.c @@ -2588,7 +2588,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_inband_dtmf_session(switch_core_sessi } if ((status = switch_core_media_bug_add(session, "inband_dtmf", NULL, - inband_dtmf_callback, pvt, 0, SMBF_READ_REPLACE | SMBF_NO_PAUSE, &bug)) != SWITCH_STATUS_SUCCESS) { + inband_dtmf_callback, pvt, 0, SMBF_READ_REPLACE | SMBF_NO_PAUSE | SMBF_ONE_ONLY, &bug)) != SWITCH_STATUS_SUCCESS) { return status; }