diff options
-rwxr-xr-x | rtp.c | 11 |
1 files changed, 9 insertions, 2 deletions
@@ -85,6 +85,7 @@ struct ast_rtp { int dtmfcount; unsigned int dtmfduration; int nat; + int digitssent; int flags; struct sockaddr_in us; struct sockaddr_in them; @@ -1010,6 +1011,7 @@ void ast_rtp_reset(struct ast_rtp *rtp) memset(&rtp->dtmfmute, 0, sizeof(rtp->dtmfmute)); rtp->lastts = 0; rtp->lastrxts = 0; + rtp->digitssent = 0; rtp->lastividtimestamp = 0; rtp->lastovidtimestamp = 0; rtp->lasteventseqn = 0; @@ -1101,10 +1103,14 @@ int ast_rtp_senddigit(struct ast_rtp *rtp, char digit) /* Get a pointer to the header */ rtpheader = (unsigned int *)data; - rtpheader[0] = htonl((2 << 30) | (1 << 23) | (payload << 16) | (rtp->seqno++)); - rtpheader[1] = htonl(rtp->lastts); + rtpheader[0] = htonl((2 << 30) | (1 << 23) | (payload << 16) | rtp->seqno); + rtpheader[1] = htonl(rtp->lastts + (rtp->digitssent * 160)); rtpheader[2] = htonl(rtp->ssrc); rtpheader[3] = htonl((digit << 24) | (0xa << 16) | (0)); + + rtp->seqno++; + rtp->digitssent++; + for (x=0;x<6;x++) { if (rtp->them.sin_port && rtp->them.sin_addr.s_addr) { res = sendto(rtp->s, (void *)rtpheader, hdrlen + 4, 0, (struct sockaddr *)&rtp->them, sizeof(rtp->them)); @@ -1272,6 +1278,7 @@ static int ast_rtp_raw_write(struct ast_rtp *rtp, struct ast_frame *f, int codec put_uint32(rtpheader + 4, htonl(rtp->lastts)); put_uint32(rtpheader + 8, htonl(rtp->ssrc)); + rtp->digitssent = 0; rtp->seqno++; if (rtp->them.sin_port && rtp->them.sin_addr.s_addr) { |