diff options
-rw-r--r-- | channels/chan_sip.c | 2 | ||||
-rw-r--r-- | include/asterisk/rtp.h | 1 | ||||
-rw-r--r-- | main/rtp.c | 16 |
3 files changed, 17 insertions, 2 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 843fa2dd6..109b46e83 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -4182,7 +4182,7 @@ static int sip_senddigit_end(struct ast_channel *ast, char digit, unsigned int d break; case SIP_DTMF_RFC2833: if (p->rtp) - ast_rtp_senddigit_end(p->rtp, digit); + ast_rtp_senddigit_end_with_duration(p->rtp, digit, duration); break; case SIP_DTMF_INBAND: res = -1; /* Tell Asterisk to stop inband indications */ diff --git a/include/asterisk/rtp.h b/include/asterisk/rtp.h index 14e4b8396..8c54ece6d 100644 --- a/include/asterisk/rtp.h +++ b/include/asterisk/rtp.h @@ -174,6 +174,7 @@ int ast_rtcp_fd(struct ast_rtp *rtp); int ast_rtp_senddigit_begin(struct ast_rtp *rtp, char digit); int ast_rtp_senddigit_end(struct ast_rtp *rtp, char digit); +int ast_rtp_senddigit_end_with_duration(struct ast_rtp *rtp, char digit, unsigned int duration); int ast_rtp_sendcng(struct ast_rtp *rtp, int level); diff --git a/main/rtp.c b/main/rtp.c index 5a1266a3c..3133de7d9 100644 --- a/main/rtp.c +++ b/main/rtp.c @@ -186,6 +186,7 @@ static int ast_rtcp_write_rr(const void *data); static unsigned int ast_rtcp_calc_interval(struct ast_rtp *rtp); static int ast_rtp_senddigit_continuation(struct ast_rtp *rtp); int ast_rtp_senddigit_end(struct ast_rtp *rtp, char digit); +int ast_rtp_senddigit_end_with_duration(struct ast_rtp *rtp, char digit, unsigned int duration); #define FLAG_3389_WARNING (1 << 0) #define FLAG_NAT_ACTIVE (3 << 1) @@ -2421,12 +2422,18 @@ static int ast_rtp_senddigit_continuation(struct ast_rtp *rtp) return 0; } -/*! \brief Send end packets for DTMF */ int ast_rtp_senddigit_end(struct ast_rtp *rtp, char digit) { + return ast_rtp_senddigit_end_with_duration(rtp, digit, 0); +} + +/*! \brief Send end packets for DTMF */ +int ast_rtp_senddigit_end_with_duration(struct ast_rtp *rtp, char digit, unsigned int duration) +{ unsigned int *rtpheader; int hdrlen = 12, res = 0, i = 0; char data[256]; + unsigned int measured_samples; /* If no address, then bail out */ if (!rtp->them.sin_addr.s_addr || !rtp->them.sin_port) @@ -2449,6 +2456,13 @@ int ast_rtp_senddigit_end(struct ast_rtp *rtp, char digit) rtp->dtmfmute = ast_tvadd(ast_tvnow(), ast_tv(0, 500000)); + if (duration > 0 && (measured_samples = duration * rtp_get_rate(rtp->f.subclass) / 1000) > rtp->send_duration) { + if (option_debug > 1) { + ast_log(LOG_DEBUG, "Adjusting final end duration from %u to %u\n", rtp->send_duration, measured_samples); + } + rtp->send_duration = measured_samples; + } + rtpheader = (unsigned int *)data; rtpheader[1] = htonl(rtp->lastdigitts); rtpheader[2] = htonl(rtp->ssrc); |