From: Kevin Harwell Date: Wed, 8 Apr 2020 19:33:47 +0000 (-0500) Subject: chan_pjsip: digit_begin - constant DTMF tone if RTP is not setup yet X-Git-Tag: 17.4.0-rc1~30 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d38839067b2fc90f51359528b0e9d084024ca240;p=thirdparty%2Fasterisk.git 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 --- 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)