chan_pjsip: digit_begin - constant DTMF tone if RTP is not setup yet

If chan_pjsip is configured for DTMF_RFC_4733, and the core triggers a
digit begin before media, or rtp has been setup then it's possible the
outgoing channel will hear a constant DTMF tone upon answering.

This happens because when there is no media, or rtp chan_pjsip notifies
the core to initiate inband DTMF. However, upon digit end if media, and
rtp become available then chan_pjsip does not notify the core to stop
inband DTMF. Thus the tone continues playing.

This patch makes it so chan_pjsip only notifies the core to start
inband DTMF in only the required cases. Now if there is no media, or
rtp availabe upon digit begin chan_pjsip does nothing, but tells the
core it handled it.

ASTERISK-28817 #close

Change-Id: I0dbea9fff444a2595fb18c64b89653e90d2f6eb5
This commit is contained in:
Kevin Harwell 2020-04-08 14:33:47 -05:00 committed by Friendly Automation
parent 375a578ef1
commit 48669ea81b
1 changed files with 18 additions and 15 deletions

View File

@ -2169,20 +2169,23 @@ static int chan_pjsip_digit_begin(struct ast_channel *chan, char digit)
{
struct ast_sip_channel_pvt *channel = ast_channel_tech_pvt(chan);
struct ast_sip_session_media *media;
int res = 0;
media = channel->session->active_media_state->default_session[AST_MEDIA_TYPE_AUDIO];
switch (channel->session->dtmf) {
case AST_SIP_DTMF_RFC_4733:
if (!media || !media->rtp) {
return -1;
return 0;
}
ast_rtp_instance_dtmf_begin(media->rtp, digit);
break;
case AST_SIP_DTMF_AUTO:
if (!media || !media->rtp || (ast_rtp_instance_dtmf_mode_get(media->rtp) == AST_RTP_DTMF_MODE_INBAND)) {
if (!media || !media->rtp) {
return 0;
}
if (ast_rtp_instance_dtmf_mode_get(media->rtp) == AST_RTP_DTMF_MODE_INBAND) {
return -1;
}
@ -2197,13 +2200,12 @@ static int chan_pjsip_digit_begin(struct ast_channel *chan, char digit)
case AST_SIP_DTMF_NONE:
break;
case AST_SIP_DTMF_INBAND:
res = -1;
break;
return -1;
default:
break;
}
return res;
return 0;
}
struct info_dtmf_data {
@ -2290,7 +2292,6 @@ static int chan_pjsip_digit_end(struct ast_channel *ast, char digit, unsigned in
{
struct ast_sip_channel_pvt *channel = ast_channel_tech_pvt(ast);
struct ast_sip_session_media *media;
int res = 0;
if (!channel || !channel->session) {
/* This happens when the channel is hungup while a DTMF digit is playing. See ASTERISK-28086 */
@ -2304,8 +2305,9 @@ static int chan_pjsip_digit_end(struct ast_channel *ast, char digit, unsigned in
case AST_SIP_DTMF_AUTO_INFO:
{
if (!media || !media->rtp) {
return -1;
return 0;
}
if (ast_rtp_instance_dtmf_mode_get(media->rtp) != AST_RTP_DTMF_MODE_NONE) {
ast_debug(3, "Told to send end of digit on Auto-Info channel %s RFC4733 negotiated so using it.\n", ast_channel_name(ast));
ast_rtp_instance_dtmf_end_with_duration(media->rtp, digit, duration);
@ -2343,28 +2345,29 @@ static int chan_pjsip_digit_end(struct ast_channel *ast, char digit, unsigned in
}
case AST_SIP_DTMF_RFC_4733:
if (!media || !media->rtp) {
return -1;
return 0;
}
ast_rtp_instance_dtmf_end_with_duration(media->rtp, digit, duration);
break;
case AST_SIP_DTMF_AUTO:
if (!media || !media->rtp || (ast_rtp_instance_dtmf_mode_get(media->rtp) == AST_RTP_DTMF_MODE_INBAND)) {
if (!media || !media->rtp) {
return 0;
}
if (ast_rtp_instance_dtmf_mode_get(media->rtp) == AST_RTP_DTMF_MODE_INBAND) {
return -1;
}
ast_rtp_instance_dtmf_end_with_duration(media->rtp, digit, duration);
break;
case AST_SIP_DTMF_NONE:
break;
case AST_SIP_DTMF_INBAND:
res = -1;
break;
return -1;
}
return res;
return 0;
}
static void update_initial_connected_line(struct ast_sip_session *session)