mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-18 07:48:14 +00:00
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:
committed by
Friendly Automation
parent
9b259c6514
commit
b2e7fc6972
@@ -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 ast_sip_channel_pvt *channel = ast_channel_tech_pvt(chan);
|
||||||
struct chan_pjsip_pvt *pvt = channel->pvt;
|
struct chan_pjsip_pvt *pvt = channel->pvt;
|
||||||
struct ast_sip_session_media *media = pvt->media[SIP_MEDIA_AUDIO];
|
struct ast_sip_session_media *media = pvt->media[SIP_MEDIA_AUDIO];
|
||||||
int res = 0;
|
|
||||||
|
|
||||||
switch (channel->session->dtmf) {
|
switch (channel->session->dtmf) {
|
||||||
case AST_SIP_DTMF_RFC_4733:
|
case AST_SIP_DTMF_RFC_4733:
|
||||||
if (!media || !media->rtp) {
|
if (!media || !media->rtp) {
|
||||||
return -1;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ast_rtp_instance_dtmf_begin(media->rtp, digit);
|
ast_rtp_instance_dtmf_begin(media->rtp, digit);
|
||||||
break;
|
break;
|
||||||
case AST_SIP_DTMF_AUTO:
|
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;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1842,13 +1845,12 @@ static int chan_pjsip_digit_begin(struct ast_channel *chan, char digit)
|
|||||||
case AST_SIP_DTMF_NONE:
|
case AST_SIP_DTMF_NONE:
|
||||||
break;
|
break;
|
||||||
case AST_SIP_DTMF_INBAND:
|
case AST_SIP_DTMF_INBAND:
|
||||||
res = -1;
|
return -1;
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct info_dtmf_data {
|
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 ast_sip_channel_pvt *channel = ast_channel_tech_pvt(ast);
|
||||||
struct chan_pjsip_pvt *pvt = channel->pvt;
|
struct chan_pjsip_pvt *pvt = channel->pvt;
|
||||||
struct ast_sip_session_media *media = pvt->media[SIP_MEDIA_AUDIO];
|
struct ast_sip_session_media *media = pvt->media[SIP_MEDIA_AUDIO];
|
||||||
int res = 0;
|
|
||||||
|
|
||||||
if (!channel || !channel->session) {
|
if (!channel || !channel->session) {
|
||||||
/* This happens when the channel is hungup while a DTMF digit is playing. See ASTERISK-28086 */
|
/* 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:
|
case AST_SIP_DTMF_AUTO_INFO:
|
||||||
{
|
{
|
||||||
if (!media || !media->rtp) {
|
if (!media || !media->rtp) {
|
||||||
return -1;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ast_rtp_instance_dtmf_mode_get(media->rtp) != AST_RTP_DTMF_MODE_NONE) {
|
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_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);
|
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:
|
case AST_SIP_DTMF_RFC_4733:
|
||||||
if (!media || !media->rtp) {
|
if (!media || !media->rtp) {
|
||||||
return -1;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ast_rtp_instance_dtmf_end_with_duration(media->rtp, digit, duration);
|
ast_rtp_instance_dtmf_end_with_duration(media->rtp, digit, duration);
|
||||||
break;
|
break;
|
||||||
case AST_SIP_DTMF_AUTO:
|
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;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ast_rtp_instance_dtmf_end_with_duration(media->rtp, digit, duration);
|
ast_rtp_instance_dtmf_end_with_duration(media->rtp, digit, duration);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
case AST_SIP_DTMF_NONE:
|
case AST_SIP_DTMF_NONE:
|
||||||
break;
|
break;
|
||||||
case AST_SIP_DTMF_INBAND:
|
case AST_SIP_DTMF_INBAND:
|
||||||
res = -1;
|
return -1;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void update_initial_connected_line(struct ast_sip_session *session)
|
static void update_initial_connected_line(struct ast_sip_session *session)
|
||||||
|
|||||||
Reference in New Issue
Block a user