From: Tilghman Lesher Date: Wed, 19 May 2010 16:44:06 +0000 (+0000) Subject: Merged revisions 264204 via svnmerge from X-Git-Tag: 1.6.2.9-rc1~2^2~34 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cd48e36e76d58a5ef4858d81e90f7b7ca126da5e;p=thirdparty%2Fasterisk.git Merged revisions 264204 via svnmerge from https://origsvn.digium.com/svn/asterisk/trunk ........ r264204 | tilghman | 2010-05-19 11:42:20 -0500 (Wed, 19 May 2010) | 9 lines Keep track of digit duration, when we're decoding inband to pass DTMF frames. (closes issue #17235) Reported by: frawd Patches: new_dtmf_dsp_len.patch uploaded by frawd (license 610) 20100518__issue17235.diff.txt uploaded by tilghman (license 14) Tested by: frawd ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.2@264205 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/main/dsp.c b/main/dsp.c index 1a8892289b..9bb926a82b 100644 --- a/main/dsp.c +++ b/main/dsp.c @@ -274,6 +274,10 @@ 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 detected_digits; int lost_digits; @@ -511,6 +515,7 @@ 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'; @@ -630,6 +635,7 @@ static void store_digit(digit_detect_state_t *s, char digit) { s->detected_digits++; if (s->current_digits < MAX_DTMF_DIGITS) { + s->digitlen[s->current_digits] = 0; s->digits[s->current_digits++] = digit; s->digits[s->current_digits] = '\0'; } else { @@ -733,6 +739,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; } } @@ -1395,7 +1403,7 @@ struct ast_frame *ast_dsp_process(struct ast_channel *chan, struct ast_dsp *dsp, digit = dtmf_detect(dsp, &dsp->digit_state, shortdata, len, (dsp->digitmode & DSP_DIGITMODE_NOQUELCH) == 0, (dsp->digitmode & DSP_DIGITMODE_RELAXDTMF)); if (dsp->digit_state.current_digits) { - int event = 0; + int event = 0, event_len = 0; char event_digit = 0; if (!dsp->dtmf_began) { @@ -1412,9 +1420,12 @@ struct ast_frame *ast_dsp_process(struct ast_channel *chan, struct ast_dsp *dsp, if (dsp->features & DSP_FEATURE_DIGIT_DETECT) { event = AST_FRAME_DTMF_END; event_digit = dsp->digit_state.digits[0]; + event_len = dsp->digit_state.digitlen[0] * 1000 / SAMPLE_RATE; } - memmove(dsp->digit_state.digits, dsp->digit_state.digits + 1, dsp->digit_state.current_digits); + memmove(&dsp->digit_state.digits[0], &dsp->digit_state.digits[1], dsp->digit_state.current_digits); 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) { @@ -1429,6 +1440,7 @@ struct ast_frame *ast_dsp_process(struct ast_channel *chan, struct ast_dsp *dsp, memset(&dsp->f, 0, sizeof(dsp->f)); dsp->f.frametype = event; dsp->f.subclass = event_digit; + dsp->f.len = event_len; outf = &dsp->f; goto done; }