From b4a64d48176b7dad3321d3690f666837f2bbd2ec Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Sun, 2 Sep 2018 16:47:30 -0500 Subject: [PATCH] FS-11380: [core] add new internal function --- src/include/switch_ivr.h | 8 +++++++ src/include/switch_types.h | 1 + src/switch_ivr_bridge.c | 44 +++++++++++++++++++++++++++++++++++--- 3 files changed, 50 insertions(+), 3 deletions(-) diff --git a/src/include/switch_ivr.h b/src/include/switch_ivr.h index 00cbc3438b..1ebd7a0e13 100644 --- a/src/include/switch_ivr.h +++ b/src/include/switch_ivr.h @@ -542,6 +542,14 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_multi_threaded_bridge(_In_ switch_cor switch_input_callback_function_t dtmf_callback, void *session_data, void *peer_session_data); +/*! + \brief Bridge leaving b-leg in the control of another thread. Call from b-leg first then call switch_ivr_multi_threaded_bridge on a-leg and b-leg. + \param session b-leg session + \return SWITCH_STATUS_SUCCESS if all is well +*/ +SWITCH_DECLARE(switch_status_t) switch_ivr_bridge_bleg(switch_core_session_t *session, switch_core_session_t *peer_session, uint32_t max_wait_ms); + + /*! \brief Bridge Signalling from one session to another \param session one session diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 25c3b97c85..7ad71768f4 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -1569,6 +1569,7 @@ typedef enum { CF_AWAITING_STREAM_CHANGE, CF_PROCESSING_STREAM_CHANGE, CF_STREAM_CHANGED, + CF_ARRANGED_BRIDGE, /* WARNING: DO NOT ADD ANY FLAGS BELOW THIS LINE */ /* IF YOU ADD NEW ONES CHECK IF THEY SHOULD PERSIST OR ZERO THEM IN switch_core_session.c switch_core_session_request_xml() */ CF_FLAG_MAX diff --git a/src/switch_ivr_bridge.c b/src/switch_ivr_bridge.c index 82f23cc3d3..0ab870c6a5 100644 --- a/src/switch_ivr_bridge.c +++ b/src/switch_ivr_bridge.c @@ -1076,6 +1076,38 @@ static const switch_state_handler_table_t audio_bridge_peer_state_handlers = { /*.on_consume_media */ audio_bridge_on_consume_media, }; + +SWITCH_DECLARE(switch_status_t) switch_ivr_bridge_bleg(switch_core_session_t *session, switch_core_session_t *peer_session, uint32_t max_wait_ms) +{ + switch_channel_t *channel; + switch_channel_t *peer_channel = NULL; + switch_status_t status = SWITCH_STATUS_SUCCESS; + + switch_assert(session); + channel = switch_core_session_get_channel(session); + + switch_channel_set_flag(channel, CF_ARRANGED_BRIDGE); + + if (peer_session) { + peer_channel = switch_core_session_get_channel(peer_session); + } + + status = switch_channel_wait_for_flag(channel, CF_ARRANGED_BRIDGE, SWITCH_FALSE, max_wait_ms, peer_channel); + + if (status == SWITCH_STATUS_FALSE) return status; + + if (switch_channel_test_flag(channel, CF_ARRANGED_BRIDGE)) { + switch_channel_clear_flag(channel, CF_ARRANGED_BRIDGE); + return SWITCH_STATUS_FALSE; + } else { + audio_bridge_on_exchange_media(session); + } + + return SWITCH_STATUS_SUCCESS; +} + + + static switch_status_t uuid_bridge_on_reset(switch_core_session_t *session); static switch_status_t uuid_bridge_on_hibernate(switch_core_session_t *session); static switch_status_t uuid_bridge_on_soft_execute(switch_core_session_t *session); @@ -1636,7 +1668,9 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_multi_threaded_bridge(switch_core_ses goto done; } - switch_channel_set_state(peer_channel, CS_CONSUME_MEDIA); + if (!switch_channel_test_flag(peer_channel, CF_ARRANGED_BRIDGE)) { + switch_channel_set_state(peer_channel, CS_CONSUME_MEDIA); + } switch_channel_set_variable(peer_channel, "call_uuid", switch_core_session_get_uuid(session)); @@ -1741,9 +1775,13 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_multi_threaded_bridge(switch_core_ses } switch_channel_set_private(peer_channel, "_bridge_", b_leg); - switch_channel_set_state(peer_channel, CS_EXCHANGE_MEDIA); - + if (switch_channel_test_flag(peer_channel, CF_ARRANGED_BRIDGE)) { + switch_channel_clear_flag(peer_channel, CF_ARRANGED_BRIDGE); + } else { + switch_channel_set_state(peer_channel, CS_EXCHANGE_MEDIA); + } + audio_bridge_thread(NULL, (void *) a_leg); switch_channel_clear_flag_recursive(caller_channel, CF_BRIDGE_ORIGINATOR);