]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-2217 --resolve this looks ok and is probably useful
authorAnthony Minessale <anthm@freeswitch.org>
Thu, 25 Aug 2011 14:27:39 +0000 (09:27 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Thu, 25 Aug 2011 14:27:39 +0000 (09:27 -0500)
src/include/switch_types.h
src/mod/applications/mod_spandsp/mod_spandsp_dsp.c
src/mod/endpoints/mod_sofia/sofia.c
src/switch_channel.c
src/switch_ivr_async.c
src/switch_rtp.c

index 5ec7f2962995c96698eaf60c44e2cdac7c3b98be..b226b5555d5bbc448ff7f7fcbf14473275255e56 100644 (file)
@@ -202,6 +202,25 @@ SWITCH_BEGIN_EXTERN_C
 #define SWITCH_DTMF_LOG_LEN 1000
 typedef uint8_t switch_byte_t;
 
+/*!
+  \enum switch_dtmf_source_t
+  \brief DTMF sources
+<pre>
+    SWITCH_DTMF_UNKNOWN             - Unknown source
+    SWITCH_DTMF_INBAND_AUDIO        - From audio
+    SWITCH_DTMF_RTP                 - From RTP as a telephone event
+    SWITCH_DTMF_ENDPOINT            - From endpoint signaling
+    SWITCH_DTMF_APP                 - From application
+</pre>
+ */
+typedef enum {
+       SWITCH_DTMF_UNKNOWN,
+       SWITCH_DTMF_INBAND_AUDIO,
+       SWITCH_DTMF_RTP,
+       SWITCH_DTMF_ENDPOINT,
+       SWITCH_DTMF_APP
+} switch_dtmf_source_t;
+
 typedef enum {
        DTMF_FLAG_SKIP_PROCESS = (1 << 0)
 } dtmf_flag_t;
@@ -210,6 +229,7 @@ typedef struct {
        char digit;
        uint32_t duration;
        int32_t flags;
+       switch_dtmf_source_t source;
 } switch_dtmf_t;
 
 typedef enum {
index 75042c577e00e09de46748c4bb849244457878a5..8a31a9272d53081902d96e12c065164d59a12751 100644 (file)
@@ -57,6 +57,7 @@ static void spandsp_dtmf_rx_realtime_callback(void *user_data, int code, int lev
                        pvt->last_digit = digit;
                        dtmf.digit = digit;
                        dtmf.duration = switch_core_default_dtmf_duration(0);
+                       dtmf.source = SWITCH_DTMF_INBAND_AUDIO;
                        switch_channel_queue_dtmf(switch_core_session_get_channel(pvt->session), &dtmf);
                        pvt->digit_begin = pvt->samples;
                } else {
index 57331937436c69e466a50543b6bc34c1536468cc..9c453cbbf8990fe7310377c9729defdb6d1bd050 100644 (file)
@@ -6625,7 +6625,7 @@ void sofia_handle_sip_i_info(nua_t *nua, sofia_profile_t *profile, nua_handle_t
        const char *signal_ptr;
        const char *rec_header;
        const char *clientcode_header;
-       switch_dtmf_t dtmf = { 0, switch_core_default_dtmf_duration(0) };
+       switch_dtmf_t dtmf = { 0, switch_core_default_dtmf_duration(0), 0, SWITCH_DTMF_ENDPOINT };
        switch_event_t *event;
        private_object_t *tech_pvt = NULL;
 
index 755f140513e870fb318e242e72f45ba4208513c0..8fd174372c2f02b84cd76984d16955c7cde8a1a7 100644 (file)
@@ -419,7 +419,7 @@ SWITCH_DECLARE(switch_status_t) switch_channel_queue_dtmf(switch_channel_t *chan
 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_core_default_dtmf_duration(0), 0};
+       switch_dtmf_t dtmf = { 0, switch_core_default_dtmf_duration(0), 0, SWITCH_DTMF_APP };
        int sent = 0, dur;
        char *string;
        int i, argc;
index b55413f007840d5328c7a33e0febc425cf1aa4ef..7eeb1404e5e4524497159edb4f54fe2ddb7cbb26 100644 (file)
@@ -2137,6 +2137,7 @@ static switch_bool_t inband_dtmf_callback(switch_media_bug_t *bug, void *user_da
                                        switch_dtmf_t dtmf;
                                        dtmf.digit = *p;
                                        dtmf.duration = switch_core_default_dtmf_duration(0);
+                                       dtmf.source = SWITCH_DTMF_INBAND_AUDIO;
                                        switch_channel_queue_dtmf(channel, &dtmf);
                                        p++;
                                }
@@ -2327,18 +2328,20 @@ static switch_bool_t inband_dtmf_generate_callback(switch_media_bug_t *bug, void
                        if (!switch_buffer_inuse(pvt->audio_buffer)) {
                                if (switch_queue_trypop(pvt->digit_queue, &pop) == SWITCH_STATUS_SUCCESS) {
                                        switch_dtmf_t *dtmf = (switch_dtmf_t *) pop;
-                                       char buf[2] = "";
-                                       int duration = dtmf->duration;
-
-                                       buf[0] = dtmf->digit;
-                                       if (duration > 8000) {
-                                               duration = 4000;
-                                               switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(switch_core_media_bug_get_session(bug)),
+                                       if (dtmf->source != SWITCH_DTMF_INBAND_AUDIO) {
+                                               char buf[2] = "";
+                                               int duration = dtmf->duration;
+
+                                               buf[0] = dtmf->digit;
+                                               if (duration > 8000) {
+                                                       duration = 4000;
+                                                       switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(switch_core_media_bug_get_session(bug)),
                                                                                  SWITCH_LOG_WARNING, "%s Truncating ridiculous DTMF duration %d ms to 1/2 second.\n",
                                                                                  switch_channel_get_name(switch_core_session_get_channel(pvt->session)), dtmf->duration / 8);
+                                               }
+                                               pvt->ts.duration = duration;
+                                               teletone_run(&pvt->ts, buf);
                                        }
-                                       pvt->ts.duration = duration;
-                                       teletone_run(&pvt->ts, buf);
                                        free(pop);
                                }
                        }
@@ -3168,6 +3171,7 @@ static void *SWITCH_THREAD_FUNC speech_thread(switch_thread_t *thread, void *obj
                                                switch_dtmf_t dtmf;
                                                dtmf.digit = c;
                                                dtmf.duration = switch_core_default_dtmf_duration(0);
+                                               dtmf.source = SWITCH_DTMF_INBAND_AUDIO;
                                                switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_DEBUG, "Queue speech detected dtmf %c\n", c);
                                                switch_channel_queue_dtmf(channel, &dtmf);
                                        }
index d4a6c4d59e30670411820baed06f08c79be12bd2..44d8a219ed62ae68169e67be9d2ab0e4d02c9d2c 100644 (file)
@@ -344,7 +344,7 @@ static handle_rfc2833_result_t handle_rfc2833(switch_rtp_t *rtp_session, switch_
 
                        if (!rtp_session->dtmf_data.in_digit_queued && (rtp_session->rtp_bugs & RTP_BUG_IGNORE_DTMF_DURATION) &&
                                rtp_session->dtmf_data.in_digit_ts) {
-                               switch_dtmf_t dtmf = { key, switch_core_min_dtmf_duration(0) };
+                               switch_dtmf_t dtmf = { key, switch_core_min_dtmf_duration(0), 0, SWITCH_DTMF_RTP };
 #ifdef DEBUG_2833
                                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Early Queuing digit %c:%d\n", dtmf.digit, dtmf.duration / 8);
 #endif
@@ -373,7 +373,7 @@ static handle_rfc2833_result_t handle_rfc2833(switch_rtp_t *rtp_session, switch_
                                        rtp_session->dtmf_data.in_digit_sanity = 2000;
                                }
                                if (rtp_session->dtmf_data.in_digit_ts) {
-                                       switch_dtmf_t dtmf = { key, duration };
+                                       switch_dtmf_t dtmf = { key, duration, 0, SWITCH_DTMF_RTP };
 
                                        if (ts > rtp_session->dtmf_data.in_digit_ts) {
                                                dtmf.duration += (ts - rtp_session->dtmf_data.in_digit_ts);