]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
chan_pjsip: digit_begin - constant DTMF tone if RTP is not setup yet
authorKevin Harwell <kharwell@digium.com>
Wed, 8 Apr 2020 19:01:55 +0000 (14:01 -0500)
committerFriendly Automation <jenkins2@gerrit.asterisk.org>
Mon, 13 Apr 2020 15:54:07 +0000 (10:54 -0500)
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

index 33c023de9bbf23e36e606026e5a6be4591ddae1f..79e7c6e131471c67fa9719aadbc5bbf6d13f8457 100644 (file)
@@ -1816,18 +1816,21 @@ static int chan_pjsip_digit_begin(struct ast_channel *chan, char digit)
        struct ast_sip_channel_pvt *channel = ast_channel_tech_pvt(chan);
        struct chan_pjsip_pvt *pvt = channel->pvt;
        struct ast_sip_session_media *media = pvt->media[SIP_MEDIA_AUDIO];
-       int res = 0;
 
        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;
                }
 
@@ -1842,13 +1845,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 {
@@ -1936,7 +1938,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 chan_pjsip_pvt *pvt = channel->pvt;
        struct ast_sip_session_media *media = pvt->media[SIP_MEDIA_AUDIO];
-       int res = 0;
 
        if (!channel || !channel->session) {
                /* This happens when the channel is hungup while a DTMF digit is playing. See ASTERISK-28086 */
@@ -1948,8 +1949,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);
@@ -1987,28 +1989,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)