From fa3c8f94e088036836d12a622b7f738d8dd48cc5 Mon Sep 17 00:00:00 2001 From: Kevin Harwell <kharwell@digium.com> Date: Wed, 8 Apr 2020 14:33:47 -0500 Subject: [PATCH] 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 --- channels/chan_pjsip.c | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c index 590843e611..5df39c3bd6 100644 --- a/channels/chan_pjsip.c +++ b/channels/chan_pjsip.c @@ -2163,20 +2163,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; } @@ -2191,13 +2194,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 { @@ -2284,7 +2286,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 */ @@ -2298,8 +2299,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); @@ -2337,28 +2339,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) -- GitLab