]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Fix infinite DTMF when a BEGIN is received without an END.
authorRussell Bryant <russell@russellbryant.com>
Mon, 23 Feb 2009 23:09:01 +0000 (23:09 +0000)
committerRussell Bryant <russell@russellbryant.com>
Mon, 23 Feb 2009 23:09:01 +0000 (23:09 +0000)
This commit is related to rev 175124 of 1.4 where a previous attempt was made
to fix this problem.  The problem with the previous patch was that the inserted
code needed to go _before_ setting the lastrxts to the current timestamp.
Because those were the same, the dtmfcount variable was never decremented, and
so the END was never sent.

In passing, I removed the dtmfsamples variable which was completed unused.  I
also removed a redundant setting of the lastrxts variable.

(closes issue #14460)
Reported by: moliveras

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@178141 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/rtp.c

index b394cf2855b185063dc94fa54308e99d3b516c3e..8ac8d832dadb8c5e224348f87fdda9d553223ed1 100644 (file)
@@ -140,7 +140,6 @@ struct ast_rtp {
        char resp;
        unsigned int lastevent;
        int dtmfcount;
-       unsigned int dtmfsamples;
        /* DTMF Transmission Variables */
        unsigned int lastdigitts;
        char sending_digit;     /*!< boolean - are we sending digits */
@@ -620,7 +619,6 @@ static struct ast_frame *send_dtmf(struct ast_rtp *rtp, enum ast_frame_type type
                if (option_debug)
                        ast_log(LOG_DEBUG, "Ignore potential DTMF echo from '%s'\n", ast_inet_ntoa(rtp->them.sin_addr));
                rtp->resp = 0;
-               rtp->dtmfsamples = 0;
                return &ast_null_frame;
        }
        if (option_debug)
@@ -764,7 +762,6 @@ static struct ast_frame *process_rfc2833(struct ast_rtp *rtp, unsigned char *dat
        }
 
        rtp->dtmfcount = dtmftimeout;
-       rtp->dtmfsamples = samples;
 
        return f;
 }
@@ -1291,14 +1288,8 @@ struct ast_frame *ast_rtp_read(struct ast_rtp *rtp)
        rtp->lastrxformat = rtp->f.subclass = rtpPT.code;
        rtp->f.frametype = (rtp->f.subclass < AST_FORMAT_MAX_AUDIO) ? AST_FRAME_VOICE : AST_FRAME_VIDEO;
 
-       if (!rtp->lastrxts)
-               rtp->lastrxts = timestamp;
-
        rtp->rxseqno = seqno;
 
-       /* Record received timestamp as last received now */
-       rtp->lastrxts = timestamp;
-
        if (rtp->dtmfcount) {
                rtp->dtmfcount -= (timestamp - rtp->lastrxts);
 
@@ -1314,6 +1305,9 @@ struct ast_frame *ast_rtp_read(struct ast_rtp *rtp)
                }
        }
 
+       /* Record received timestamp as last received now */
+       rtp->lastrxts = timestamp;
+
        rtp->f.mallocd = 0;
        rtp->f.datalen = res - hdrlen;
        rtp->f.data = rtp->rawdata + hdrlen + AST_FRIENDLY_OFFSET;
@@ -2092,7 +2086,6 @@ void ast_rtp_reset(struct ast_rtp *rtp)
        rtp->lasttxformat = 0;
        rtp->lastrxformat = 0;
        rtp->dtmfcount = 0;
-       rtp->dtmfsamples = 0;
        rtp->seqno = 0;
        rtp->rxseqno = 0;
 }