From bfaa341f58b2f4c96f670066fbc54dc843b10104 Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Thu, 12 Feb 2009 16:51:13 +0000 Subject: [PATCH] Don't send DTMF for infinite time if we do not receive an END event. I thought that this was going to end up being a pretty gnarly fix, but it turns out that there was actually already a configuration option in rtp.conf, dtmftimeout, that was intended to handle this situation. However, in between Asterisk 1.2 and Asterisk 1.4, the code that processed the option got lost. So, this commit brings it back to life. The default timeout is 3 seconds. However, it is worth noting that having this be configurable at all is not really the recommended behavior in RFC 2833. From Section 3.5 of RFC 2833: Limiting the time period of extending the tone is necessary to avoid that a tone "gets stuck". Regardless of the algorithm used, the tone SHOULD NOT be extended by more than three packet interarrival times. A slight extension of tone durations and shortening of pauses is generally harmless. Three seconds will pretty much _always_ be far more than three packet interarrival times. However, that behavior is not required, so I'm going to leave it with our legacy behavior for now. Code from svn/asterisk/team/russell/issue_14460 (closes issue #14460) Reported by: moliveras git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@175124 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- main/rtp.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/main/rtp.c b/main/rtp.c index 5165ade83c..b394cf2855 100644 --- a/main/rtp.c +++ b/main/rtp.c @@ -1299,6 +1299,21 @@ struct ast_frame *ast_rtp_read(struct ast_rtp *rtp) /* Record received timestamp as last received now */ rtp->lastrxts = timestamp; + if (rtp->dtmfcount) { + rtp->dtmfcount -= (timestamp - rtp->lastrxts); + + if (rtp->dtmfcount < 0) { + rtp->dtmfcount = 0; + } + + if (rtp->resp && !rtp->dtmfcount) { + struct ast_frame *f; + f = send_dtmf(rtp, AST_FRAME_DTMF_END); + rtp->resp = 0; + return f; + } + } + rtp->f.mallocd = 0; rtp->f.datalen = res - hdrlen; rtp->f.data = rtp->rawdata + hdrlen + AST_FRIENDLY_OFFSET;