aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2010-06-05 17:56:55 +0000
committertilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2010-06-05 17:56:55 +0000
commitbe0b2231437c0ffce05a9a6504250a5ee3a9ebe2 (patch)
treef0992e7de0cf4c28efcd7594bc2289ecd49c69da
parent49c376ba09b14e8d802f3374a51a1a90d8553c37 (diff)
Merged revisions 268456 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ........ r268456 | tilghman | 2010-06-05 12:55:28 -0500 (Sat, 05 Jun 2010) | 14 lines 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 ........ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.2@268457 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--main/dsp.c13
1 files changed, 4 insertions, 9 deletions
diff --git a/main/dsp.c b/main/dsp.c
index 9bb926a82..65778890f 100644
--- a/main/dsp.c
+++ b/main/dsp.c
@@ -273,11 +273,8 @@ typedef struct
typedef struct
{
char digits[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 current_digits;
int detected_digits;
int lost_digits;
@@ -515,7 +512,6 @@ static void ast_mf_detect_init (mf_detect_state_t *s)
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';
@@ -739,8 +735,8 @@ static int dtmf_detect(struct ast_dsp *dsp, digit_detect_state_t *s, int16_t amp
}
} 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;
}
}
@@ -1423,9 +1419,8 @@ struct ast_frame *ast_dsp_process(struct ast_channel *chan, struct ast_dsp *dsp,
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) {