提交 61ab8439 authored 作者: Anthony Minessale's avatar Anthony Minessale

add new channel cap flag to indicate you can support queueable dtmf delay aka…

add new channel cap flag to indicate you can support queueable dtmf delay aka parsing w and W and implement it in the RTP stack and sofia endpoint
上级 c3ceebf0
...@@ -1087,6 +1087,7 @@ typedef enum { ...@@ -1087,6 +1087,7 @@ typedef enum {
CC_PROXY_MEDIA, CC_PROXY_MEDIA,
CC_JITTERBUFFER, CC_JITTERBUFFER,
CC_FS_RTP, CC_FS_RTP,
CC_QUEUEABLE_DTMF_DELAY,
/* WARNING: DO NOT ADD ANY FLAGS BELOW THIS LINE */ /* WARNING: DO NOT ADD ANY FLAGS BELOW THIS LINE */
CC_FLAG_MAX CC_FLAG_MAX
} switch_channel_cap_t; } switch_channel_cap_t;
......
...@@ -876,6 +876,7 @@ void sofia_glue_attach_private(switch_core_session_t *session, sofia_profile_t * ...@@ -876,6 +876,7 @@ void sofia_glue_attach_private(switch_core_session_t *session, sofia_profile_t *
switch_channel_set_cap(tech_pvt->channel, CC_PROXY_MEDIA); switch_channel_set_cap(tech_pvt->channel, CC_PROXY_MEDIA);
switch_channel_set_cap(tech_pvt->channel, CC_JITTERBUFFER); switch_channel_set_cap(tech_pvt->channel, CC_JITTERBUFFER);
switch_channel_set_cap(tech_pvt->channel, CC_FS_RTP); switch_channel_set_cap(tech_pvt->channel, CC_FS_RTP);
switch_channel_set_cap(tech_pvt->channel, CC_QUEUEABLE_DTMF_DELAY);
switch_core_session_set_private(session, tech_pvt); switch_core_session_set_private(session, tech_pvt);
......
...@@ -1345,11 +1345,22 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_send_dtmf(switch_core_sessio ...@@ -1345,11 +1345,22 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_send_dtmf(switch_core_sessio
} }
if (session->endpoint_interface->io_routines->send_dtmf) { if (session->endpoint_interface->io_routines->send_dtmf) {
if (dtmf->digit == 'w') { int send = 0;
switch_yield(500000); status = SWITCH_STATUS_SUCCESS;
} else if (dtmf->digit == 'W') {
switch_yield(1000000); if (switch_channel_test_cap(session->channel, CC_QUEUEABLE_DTMF_DELAY) && (dtmf->digit == 'w' || dtmf->digit == 'W')) {
send = 1;
} else { } else {
if (dtmf->digit == 'w') {
switch_yield(500000);
} else if (dtmf->digit == 'W') {
switch_yield(1000000);
} else {
send = 1;
}
}
if (send) {
status = session->endpoint_interface->io_routines->send_dtmf(session, &new_dtmf); status = session->endpoint_interface->io_routines->send_dtmf(session, &new_dtmf);
} }
} }
......
...@@ -2233,6 +2233,21 @@ SWITCH_DECLARE(void) switch_rtp_clear_flag(switch_rtp_t *rtp_session, switch_rtp ...@@ -2233,6 +2233,21 @@ SWITCH_DECLARE(void) switch_rtp_clear_flag(switch_rtp_t *rtp_session, switch_rtp
} }
} }
static void set_dtmf_delay(switch_rtp_t *rtp_session, uint32_t ms)
{
int mspp = 20;
if (rtp_session->ms_per_packet) {
if (!(mspp = (int) (rtp_session->ms_per_packet / 1000))) {
mspp = 20;
}
}
rtp_session->dtmf_data.out_digit_delay += (ms / mspp);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Queue digit delay of %dms\n", ms);
}
static void do_2833(switch_rtp_t *rtp_session, switch_core_session_t *session) static void do_2833(switch_rtp_t *rtp_session, switch_core_session_t *session)
{ {
switch_frame_flag_t flags = 0; switch_frame_flag_t flags = 0;
...@@ -2310,6 +2325,19 @@ static void do_2833(switch_rtp_t *rtp_session, switch_core_session_t *session) ...@@ -2310,6 +2325,19 @@ static void do_2833(switch_rtp_t *rtp_session, switch_core_session_t *session)
switch_dtmf_t *rdigit = pop; switch_dtmf_t *rdigit = pop;
int64_t offset; int64_t offset;
switch_size_t wrote; switch_size_t wrote;
if (rdigit->digit == 'w') {
set_dtmf_delay(rtp_session, 500);
free(rdigit);
return;
}
if (rdigit->digit == 'W') {
set_dtmf_delay(rtp_session, 1000);
free(rdigit);
return;
}
rtp_session->sending_dtmf = 1; rtp_session->sending_dtmf = 1;
memset(rtp_session->dtmf_data.out_digit_packet, 0, 4); memset(rtp_session->dtmf_data.out_digit_packet, 0, 4);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论