aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormnicholson <mnicholson@f38db490-d61c-443f-a65b-d21fe96a405b>2010-07-16 17:29:57 +0000
committermnicholson <mnicholson@f38db490-d61c-443f-a65b-d21fe96a405b>2010-07-16 17:29:57 +0000
commite096011929341766ffd7389747ba82ba6eb8a469 (patch)
treecfacd995da60d306db6676bb138f01b2e0114dd5
parent1017bf9e1d1229b3f200558fc3861c85867a598e (diff)
For pass through DTMF tones, measure the actual duration between the begin and end packets on the wire. If it is detected to be less than AST_MIN_DTMF_DURATION, trigger dtmf emulation.
AST-362 git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@277247 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--main/channel.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/main/channel.c b/main/channel.c
index af501c146..5134cefc1 100644
--- a/main/channel.c
+++ b/main/channel.c
@@ -2406,6 +2406,19 @@ static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio)
ast_clear_flag(chan, AST_FLAG_IN_DTMF);
if (!f->len)
f->len = ast_tvdiff_ms(now, chan->dtmf_tv);
+
+ /* detect tones that were received on
+ * the wire with durations shorter than
+ * AST_MIN_DTMF_DURATION and set f->len
+ * to the actual duration of the DTMF
+ * frames on the wire. This will cause
+ * dtmf emulation to be triggered later
+ * on.
+ */
+ if (ast_tvdiff_ms(now, chan->dtmf_tv) < AST_MIN_DTMF_DURATION) {
+ f->len = ast_tvdiff_ms(now, chan->dtmf_tv);
+ ast_log(LOG_DTMF, "DTMF end '%c' detected to have actual duration %ld on the wire, emulation will be triggered on %s\n", f->subclass, f->len, chan->name);
+ }
} else if (!f->len) {
ast_log(LOG_DTMF, "DTMF end accepted without begin '%c' on %s\n", f->subclass, chan->name);
f->len = AST_MIN_DTMF_DURATION;