aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--channels/chan_sip.c2
-rw-r--r--include/asterisk/rtp.h1
-rw-r--r--main/rtp.c16
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);