From c7c528cd7c8104622df97a1f4e7fdc59ba6a930e Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Mon, 26 Nov 2012 13:52:06 -0600 Subject: [PATCH] FS-4867 --resolve --- src/include/switch_channel.h | 4 ++++ src/switch_channel.c | 15 +++++++++++++++ src/switch_core_io.c | 5 ++++- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/include/switch_channel.h b/src/include/switch_channel.h index cd8cbb47f0..4225a9bd88 100644 --- a/src/include/switch_channel.h +++ b/src/include/switch_channel.h @@ -541,6 +541,10 @@ SWITCH_DECLARE(switch_channel_state_t) switch_channel_perform_hangup(switch_chan \return number of digits in the queue */ SWITCH_DECLARE(switch_size_t) switch_channel_has_dtmf(_In_ switch_channel_t *channel); +SWITCH_DECLARE(switch_status_t) switch_channel_dtmf_lock(switch_channel_t *channel); +SWITCH_DECLARE(switch_status_t) switch_channel_try_dtmf_lock(switch_channel_t *channel); +SWITCH_DECLARE(switch_status_t) switch_channel_dtmf_unlock(switch_channel_t *channel); + /*! \brief Queue DTMF on a given channel diff --git a/src/switch_channel.c b/src/switch_channel.c index 5fa30564d2..903bb6be76 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -363,6 +363,21 @@ SWITCH_DECLARE(switch_status_t) switch_channel_alloc(switch_channel_t **channel, return SWITCH_STATUS_SUCCESS; } +SWITCH_DECLARE(switch_status_t) switch_channel_dtmf_lock(switch_channel_t *channel) +{ + return switch_mutex_lock(channel->dtmf_mutex); +} + +SWITCH_DECLARE(switch_status_t) switch_channel_try_dtmf_lock(switch_channel_t *channel) +{ + return switch_mutex_trylock(channel->dtmf_mutex); +} + +SWITCH_DECLARE(switch_status_t) switch_channel_dtmf_unlock(switch_channel_t *channel) +{ + return switch_mutex_unlock(channel->dtmf_mutex); +} + SWITCH_DECLARE(switch_size_t) switch_channel_has_dtmf(switch_channel_t *channel) { switch_size_t has; diff --git a/src/switch_core_io.c b/src/switch_core_io.c index ba4874d81f..8e99fcd472 100644 --- a/src/switch_core_io.c +++ b/src/switch_core_io.c @@ -151,7 +151,10 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi for(i = 0; i < 2; i++) { if (session->dmachine[i] && !switch_channel_test_flag(session->channel, CF_BROADCAST)) { - switch_ivr_dmachine_ping(session->dmachine[i], NULL); + if (switch_channel_try_dtmf_lock(session->channel) == SWITCH_STATUS_SUCCESS) { + switch_ivr_dmachine_ping(session->dmachine[i], NULL); + switch_channel_dtmf_unlock(session->channel); + } } }