[svn-commits] tilghman: trunk r268456 - /trunk/main/dsp.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Sat Jun 5 12:55:35 CDT 2010


Author: tilghman
Date: Sat Jun  5 12:55:28 2010
New Revision: 268456

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=268456
Log:
Fix crash in DTMF detection.

What I did not originally see in my previous commit was that even though the
next digit could be detected before the previous was considered ended, the
detection of the next digit effectively ends the detection of the previous.
Therefore, the length moves in lockstep with the digit, and no separate counter
is needed for the length alone.

(closes issue #17371)
 Reported by: alecdavis

(closes issue #17474)
 Reported by: kenner

Modified:
    trunk/main/dsp.c

Modified: trunk/main/dsp.c
URL: http://svnview.digium.com/svn/asterisk/trunk/main/dsp.c?view=diff&rev=268456&r1=268455&r2=268456
==============================================================================
--- trunk/main/dsp.c (original)
+++ trunk/main/dsp.c Sat Jun  5 12:55:28 2010
@@ -273,11 +273,8 @@
 typedef struct
 {
 	char digits[MAX_DTMF_DIGITS + 1];
+	int digitlen[MAX_DTMF_DIGITS + 1];
 	int current_digits;
-	/* Store lengths separately, because next digit may begin before last has
-	 * ended (because hits_to_begin may be less than misses_to_end). */
-	int digitlen[MAX_DTMF_DIGITS + 1];
-	int current_len;
 	int detected_digits;
 	int lost_digits;
 
@@ -507,7 +504,6 @@
 static void ast_digit_detect_init(digit_detect_state_t *s, int mf)
 {
 	s->current_digits = 0;
-	s->current_len = 0;
 	s->detected_digits = 0;
 	s->lost_digits = 0;
 	s->digits[0] = '\0';
@@ -731,8 +727,8 @@
 				}
 			} else {
 				s->td.dtmf.misses = 0;
-				/* Current hit was same as last, so increment digit duration */
-				s->digitlen[s->current_len] += DTMF_GSIZE;
+				/* Current hit was same as last, so increment digit duration (of last digit) */
+				s->digitlen[s->current_digits - 1] += DTMF_GSIZE;
 			}
 		}
 
@@ -1414,9 +1410,8 @@
 					event_len = dsp->digit_state.digitlen[0] * 1000 / SAMPLE_RATE;
 				}
 				memmove(&dsp->digit_state.digits[0], &dsp->digit_state.digits[1], dsp->digit_state.current_digits);
+				memmove(&dsp->digit_state.digitlen[0], &dsp->digit_state.digitlen[1], dsp->digit_state.current_digits * sizeof(dsp->digit_state.digitlen[0]));
 				dsp->digit_state.current_digits--;
-				memmove(&dsp->digit_state.digitlen[0], &dsp->digit_state.digitlen[1], dsp->digit_state.current_len * sizeof(dsp->digit_state.digitlen[0]));
-				dsp->digit_state.current_len--;
 				dsp->dtmf_began = 0;
 
 				if (dsp->features & DSP_FEATURE_BUSY_DETECT) {




More information about the svn-commits mailing list