aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlmadsen <lmadsen@f38db490-d61c-443f-a65b-d21fe96a405b>2010-06-07 15:34:16 +0000
committerlmadsen <lmadsen@f38db490-d61c-443f-a65b-d21fe96a405b>2010-06-07 15:34:16 +0000
commitfd2ae416146a71c26db0077bf1e8ad1ef5e4fe00 (patch)
tree8f121510451022d75fe6313f31a04a2b662b3ceb
parent981ddca2f0f8c85a17d9e08dbefaca8aabe0f159 (diff)
Update ChangeLog and merge revision 268457 from the 1.6.2 branch.v1.6.2.9-rc2
git-svn-id: http://svn.digium.com/svn/asterisk/tags/1.6.2.9-rc2@268577 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--.version2
-rw-r--r--ChangeLog21
-rw-r--r--main/dsp.c13
3 files changed, 26 insertions, 10 deletions
diff --git a/.version b/.version
index 686fa1eb0..0c7e5461a 100644
--- a/.version
+++ b/.version
@@ -1 +1 @@
-1.6.2.9-rc1
+1.6.2.9-rc2
diff --git a/ChangeLog b/ChangeLog
index 67278177d..5b181e622 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,24 @@
+2010-06-07 Leif Madsen <lmadsen@digium.com>
+
+ * Asterisk 1.6.2.9-rc2 Released.
+
+2010-06-07 Tilghman Lesher <tlesher@digium.com>
+
+ * 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 0017371)
+ Reported by: alecdavis
+
+ (closes issue 0017474)
+ Reported by: kenner
+
2010-06-01 Leif Madsen <lmadsen@digium.com>
* Asterisk 1.6.2.9-rc1 Released.
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) {