]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: support for dtmf_on_start
authorDavid Yat Sin <dyatsin@sangoma.com>
Tue, 7 Feb 2012 19:28:47 +0000 (14:28 -0500)
committerDavid Yat Sin <dyatsin@sangoma.com>
Tue, 7 Feb 2012 19:28:47 +0000 (14:28 -0500)
libs/freetdm/src/ftdm_io.c
libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c
libs/freetdm/src/include/freetdm.h
libs/freetdm/src/include/private/ftdm_core.h

index 07def3303493e49238ca231782b41308e1502546..2d8ca003809f09a39a2dd562905f25165c7673c4 100644 (file)
@@ -4610,6 +4610,9 @@ FT_DECLARE(ftdm_status_t) ftdm_configure_span_channels(ftdm_span_t *span, const
                }
 
                span->channels[chan_index]->dtmfdetect.duration_ms = chan_config->dtmfdetect_ms;
+               if (chan_config->dtmf_on_start) {
+                       span->channels[chan_index]->dtmfdetect.trigger_on_start = 1;
+               }
        }
 
        return FTDM_SUCCESS;
@@ -4808,9 +4811,23 @@ static ftdm_status_t load_config(void)
                                chan_config.debugdtmf = ftdm_true(val);
                                ftdm_log(FTDM_LOG_DEBUG, "Setting debugdtmf to '%s'\n", chan_config.debugdtmf ? "yes" : "no");
                        } else if (!strncasecmp(var, "dtmfdetect_ms", sizeof("dtmfdetect_ms")-1)) {
+                               if (chan_config.dtmf_on_start == FTDM_TRUE) {
+                                       chan_config.dtmf_on_start = FTDM_FALSE;
+                                       ftdm_log(FTDM_LOG_WARNING, "dtmf_on_start parameter disabled because dtmfdetect_ms specified\n");
+                               }
                                if (sscanf(val, "%d", &(chan_config.dtmfdetect_ms)) != 1) {
                                        ftdm_log(FTDM_LOG_ERROR, "invalid dtmfdetect_ms: '%s'\n", val);
                                }
+                       } else if (!strncasecmp(var, "dtmf_on_start", sizeof("dtmf_on_start")-1)) {
+                               if (chan_config.dtmfdetect_ms) {
+                                       ftdm_log(FTDM_LOG_WARNING, "dtmf_on_start parameter ignored because dtmf_detect_ms specified\n");
+                               } else {
+                                       if (ftdm_true(val)) {
+                                               chan_config.dtmf_on_start = FTDM_TRUE;
+                                       } else {
+                                               chan_config.dtmf_on_start = FTDM_FALSE;
+                                       }
+                               }
                        } else if (!strncasecmp(var, "iostats", sizeof("iostats")-1)) {
                                if (ftdm_true(val)) {
                                        chan_config.iostats = FTDM_TRUE;
index 3c53b0edbc9436f9286839167198fd582982896b..a6c6e8cd5a12cac0569d5b1804756ef3826251e7 100644 (file)
@@ -1476,20 +1476,29 @@ static __inline__ ftdm_status_t wanpipe_channel_process_event(ftdm_channel_t *fc
 
                        if (tdm_api->wp_tdm_cmd.event.wp_tdm_api_event_dtmf_type == WAN_EC_TONE_PRESENT) {
                                ftdm_set_flag(fchan, FTDM_CHANNEL_MUTE);
-                               //fchan->dtmfdetect.start_time = ftdm_current_time_in_ms();
+                               if (fchan->dtmfdetect.duration_ms) {
+                                       fchan->dtmfdetect.start_time = ftdm_current_time_in_ms();
+                               } else if (fchan->dtmfdetect.trigger_on_start) {
+                                       ftdm_log_chan(fchan, FTDM_LOG_DEBUG, "Queuing wanpipe DTMF: %c\n", tmp_dtmf[0]);
+                                       ftdm_channel_queue_dtmf(fchan, tmp_dtmf);
+                               }
                        }
 
                        if (tdm_api->wp_tdm_cmd.event.wp_tdm_api_event_dtmf_type == WAN_EC_TONE_STOP) {
                                ftdm_clear_flag(fchan, FTDM_CHANNEL_MUTE);
                                if (ftdm_test_flag(fchan, FTDM_CHANNEL_INUSE)) {
-                                       //ftdm_time_t diff = ftdm_current_time_in_ms() - fchan->dtmfdetect.start_time;
-                                       //if (diff > fchan->dtmfdetect.duration_ms) {
-                                       //ftdm_log_chan(fchan, FTDM_LOG_DEBUG, "Queuing wanpipe DTMF: %c (duration:%d min:%d)\n", tmp_dtmf[0], diff, fchan->dtmfdetect.duration_ms);
-                                       ftdm_log_chan(fchan, FTDM_LOG_DEBUG, "Queuing wanpipe DTMF: %c\n", tmp_dtmf[0]);
+                                       if (fchan->dtmfdetect.duration_ms) {
+                                               ftdm_time_t diff = ftdm_current_time_in_ms() - fchan->dtmfdetect.start_time;
+                                               if (diff > fchan->dtmfdetect.duration_ms) {
+                                                       ftdm_log_chan(fchan, FTDM_LOG_DEBUG, "Queuing wanpipe DTMF: %c (duration:%d min:%d)\n", tmp_dtmf[0], diff, fchan->dtmfdetect.duration_ms);
+                                                       ftdm_channel_queue_dtmf(fchan, tmp_dtmf);
+                                               } else {
+                                                       ftdm_log_chan(fchan, FTDM_LOG_DEBUG, "Ignoring wanpipe DTMF: %c (duration:%d min:%d)\n", tmp_dtmf[0], diff, fchan->dtmfdetect.duration_ms);
+                                               }
+                                       } else if (!fchan->dtmfdetect.trigger_on_start) {
+                                               ftdm_log_chan(fchan, FTDM_LOG_DEBUG, "Queuing wanpipe DTMF: %c\n", tmp_dtmf[0]);
                                                ftdm_channel_queue_dtmf(fchan, tmp_dtmf);
-                                               //} else {
-                                               //ftdm_log_chan(fchan, FTDM_LOG_DEBUG, "Ignoring wanpipe DTMF: %c (duration:%d min:%d)\n", tmp_dtmf[0], diff, fchan->dtmfdetect.duration_ms);
-                                               //}
+                                       }
                                }
                        } 
                }
index c7be3cb4a820795eee40b2a95bc4e28b3ae0e7ea..0fbc4bf29b08e1e2690ba1806bded00730895cb8 100755 (executable)
@@ -487,6 +487,7 @@ typedef struct ftdm_channel_config {
        float rxgain;
        float txgain;
        uint8_t debugdtmf;
+       uint8_t dtmf_on_start;
        uint32_t dtmfdetect_ms;
        uint8_t iostats;
 } ftdm_channel_config_t;
index fb1a2c71b78879a8adb266c624965d58e6c2e541..d27bac345beebda00cb37e1019207d176bc8bd37 100644 (file)
@@ -362,6 +362,8 @@ typedef struct {
 typedef struct {
        uint32_t duration_ms;
        ftdm_time_t start_time;
+       /* If set to 1, we will send DTMF event the the tone starts, instead of waiting for end */
+       uint8_t trigger_on_start; 
 } ftdm_dtmf_detect_t;
 
 /* 2^8 table size, one for each byte (sample) value */