Merged revisions 175124 via svnmerge from
authorRussell Bryant <russell@russellbryant.com>
Thu, 12 Feb 2009 16:57:25 +0000 (16:57 +0000)
committerRussell Bryant <russell@russellbryant.com>
Thu, 12 Feb 2009 16:57:25 +0000 (16:57 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r175124 | russell | 2009-02-12 10:51:13 -0600 (Thu, 12 Feb 2009) | 27 lines

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/trunk@175125 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/rtp.c

index 14b9619..a39fc10 100644 (file)
@@ -1749,6 +1749,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.ptr = rtp->rawdata + hdrlen + AST_FRIENDLY_OFFSET;