[asterisk-commits] alecdavis: branch 1.8 r374479 - in /branches/1.8: ./ configs/ main/

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Thu Oct 4 15:15:41 CDT 2012


Author: alecdavis
Date: Thu Oct  4 15:15:35 2012
New Revision: 374479

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=374479
Log:
dsp.c User Configurable DTMF_HITS_TO_BEGIN and DTMF_MISSES_TO_END

Instead of a recompile, allow values to be adjusted in dsp.conf

For binary distributions allows easy adjustment for wobbly GSM calls, and other reasons.

Defaults to DTMF_HITS_TO_BEGIN=2 and DTMF_MISSES_TO_END=3

(closes issue ASTERISK-17493)
Tested by: alecdavis
alecdavis (license 585)

Review https://reviewboard.asterisk.org/r/2144/

Modified:
    branches/1.8/CHANGES
    branches/1.8/configs/dsp.conf.sample
    branches/1.8/main/dsp.c

Modified: branches/1.8/CHANGES
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/CHANGES?view=diff&rev=374479&r1=374478&r2=374479
==============================================================================
--- branches/1.8/CHANGES (original)
+++ branches/1.8/CHANGES Thu Oct  4 15:15:35 2012
@@ -633,8 +633,9 @@
    rate changes during translation are now avoided unless absolutely necessary.
  * The addition of the res_stun_monitor module for monitoring and reacting to network
    changes while behind a NAT.
- * The DTMF Normal and Reverse Twist acceptance values can be set in dsp.conf.
-   This allows support for any Administration. Default is AT&T values.
+ * DTMF: Normal and Reverse Twist acceptance values can be set in dsp.conf.
+   DTMF Valid/Invalid number of hits/misses can be set in dsp.conf.
+   These allow support for any Administration. Default is AT&T values.
 
 CLI Changes
 -----------

Modified: branches/1.8/configs/dsp.conf.sample
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/configs/dsp.conf.sample?view=diff&rev=374479&r1=374478&r2=374479
==============================================================================
--- branches/1.8/configs/dsp.conf.sample (original)
+++ branches/1.8/configs/dsp.conf.sample Thu Oct  4 15:15:35 2012
@@ -36,3 +36,8 @@
 ;dtmf_reverse_twist=2.51
 ;relax_dtmf_normal_twist=6.31
 ;relax_dtmf_reverse_twist=3.98
+
+;successive number hits/misses of 12.75ms before a digit/nodigit is considered valid
+;dtmf_hits_to_begin=2
+;dtmf_misses_to_end=3
+

Modified: branches/1.8/main/dsp.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/main/dsp.c?view=diff&rev=374479&r1=374478&r2=374479
==============================================================================
--- branches/1.8/main/dsp.c (original)
+++ branches/1.8/main/dsp.c Thu Oct  4 15:15:35 2012
@@ -218,10 +218,15 @@
 /* DTMF goertzel size */
 #define DTMF_GSIZE		102
 
-/* How many successive hits needed to consider begin of a digit */
-#define DTMF_HITS_TO_BEGIN	2
-/* How many successive misses needed to consider end of a digit */
-#define DTMF_MISSES_TO_END	3
+/* How many successive hits needed to consider begin of a digit
+ * IE. Override with dtmf_hits_to_begin=4 in dsp.conf
+ */
+#define DEF_DTMF_HITS_TO_BEGIN	2
+
+/* How many successive misses needed to consider end of a digit
+ * IE. Override with dtmf_misses_to_end=4 in dsp.conf
+ */
+#define DEF_DTMF_MISSES_TO_END	3
 
 /*!
  * \brief The default silence threshold we will use if an alternate
@@ -266,8 +271,6 @@
 {
 	goertzel_state_t row_out[4];
 	goertzel_state_t col_out[4];
-	int hits_to_begin;		/* How many successive hits needed to consider begin of a digit */
-	int misses_to_end;		/* How many successive misses needed to consider end of a digit */
 	int hits;			/* How many successive hits we have seen already */
 	int misses;			/* How many successive misses we have seen already */
 	int lasthit;
@@ -316,6 +319,8 @@
 static float dtmf_reverse_twist;	/* AT&T = 4dB */
 static float relax_dtmf_normal_twist;	/* AT&T = 8dB */
 static float relax_dtmf_reverse_twist;	/* AT&T = 6dB */
+static int dtmf_hits_to_begin;		/* How many successive hits needed to consider begin of a digit */
+static int dtmf_misses_to_end;		/* How many successive misses needed to consider end of a digit */
 
 static inline void goertzel_sample(goertzel_state_t *s, short sample)
 {
@@ -504,9 +509,6 @@
 	s->current_sample = 0;
 	s->hits = 0;
 	s->misses = 0;
-
-	s->hits_to_begin = DTMF_HITS_TO_BEGIN;
-	s->misses_to_end = DTMF_MISSES_TO_END;
 }
 
 static void ast_mf_detect_init (mf_detect_state_t *s)
@@ -796,7 +798,7 @@
 			/* We are in the middle of a digit already */
 			if (hit != s->td.dtmf.current_hit) {
 				s->td.dtmf.misses++;
-				if (s->td.dtmf.misses == s->td.dtmf.misses_to_end) {
+				if (s->td.dtmf.misses == dtmf_misses_to_end) {
 					/* There were enough misses to consider digit ended */
 					s->td.dtmf.current_hit = 0;
 				}
@@ -817,9 +819,9 @@
 		}
 		if (hit && hit != s->td.dtmf.current_hit) {
 			s->td.dtmf.hits++;
-			if (s->td.dtmf.hits == s->td.dtmf.hits_to_begin) {
+			if (s->td.dtmf.hits == dtmf_hits_to_begin) {
 				store_digit(s, hit);
-				s->digitlen[s->current_digits - 1] = s->td.dtmf.hits_to_begin * DTMF_GSIZE;
+				s->digitlen[s->current_digits - 1] = dtmf_hits_to_begin * DTMF_GSIZE;
 				s->td.dtmf.current_hit = hit;
 				s->td.dtmf.misses = 0;
 			}
@@ -1760,6 +1762,8 @@
 	dtmf_reverse_twist = DEF_DTMF_REVERSE_TWIST;
 	relax_dtmf_normal_twist = DEF_RELAX_DTMF_NORMAL_TWIST;
 	relax_dtmf_reverse_twist = DEF_RELAX_DTMF_REVERSE_TWIST;
+        dtmf_hits_to_begin = DEF_DTMF_HITS_TO_BEGIN;
+        dtmf_misses_to_end = DEF_DTMF_MISSES_TO_END;
 
 	if (cfg == CONFIG_STATUS_FILEMISSING || cfg == CONFIG_STATUS_FILEINVALID) {
 		return 0;
@@ -1806,6 +1810,22 @@
 			} else {
 				relax_dtmf_reverse_twist = cfg_twist;
 			}
+		} else if (!strcasecmp(v->name, "dtmf_hits_to_begin")) {
+			if (sscanf(v->value, "%30d", &cfg_threshold) < 1) {
+				ast_log(LOG_WARNING, "Unable to convert '%s' to a numeric value.\n", v->value);
+			} else if (cfg_threshold < 1) {		/* must be 1 or greater */
+				ast_log(LOG_WARNING, "Invalid dtmf_hits_to_begin value '%d' specified, using default of %d\n", cfg_threshold, dtmf_hits_to_begin);
+			} else {
+				dtmf_hits_to_begin = cfg_threshold;
+			}
+		} else if (!strcasecmp(v->name, "dtmf_misses_to_end")) {
+			if (sscanf(v->value, "%30d", &cfg_threshold) < 1) {
+				ast_log(LOG_WARNING, "Unable to convert '%s' to a numeric value.\n", v->value);
+			} else if (cfg_threshold < 1) {		/* must be 1 or greater */
+				ast_log(LOG_WARNING, "Invalid dtmf_misses_to_end value '%d' specified, using default of %d\n", cfg_threshold, dtmf_misses_to_end);
+			} else {
+				dtmf_misses_to_end = cfg_threshold;
+			}
 		}
 	}
 	ast_config_destroy(cfg);




More information about the asterisk-commits mailing list