diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 117e5342ee..b87d32b04f 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -6441,7 +6441,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 aa38ee0fa1..acd40d3ec6 100644 --- a/include/asterisk/rtp.h +++ b/include/asterisk/rtp.h @@ -211,6 +211,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 2ed6777697..7d60ad0bd2 100644 --- a/main/rtp.c +++ b/main/rtp.c @@ -206,6 +206,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) @@ -3285,12 +3286,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) @@ -3313,6 +3320,11 @@ 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) { + ast_debug(2, "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);