aboutsummaryrefslogtreecommitdiffstats
path: root/main
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 /main
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
Diffstat (limited to 'main')
-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;