forked from Mirrors/freeswitch
FS-11380: [core] add new internal function
This commit is contained in:
parent
48aebd7365
commit
b4a64d4817
@ -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,
|
switch_input_callback_function_t dtmf_callback, void *session_data,
|
||||||
void *peer_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
|
\brief Bridge Signalling from one session to another
|
||||||
\param session one session
|
\param session one session
|
||||||
|
@ -1569,6 +1569,7 @@ typedef enum {
|
|||||||
CF_AWAITING_STREAM_CHANGE,
|
CF_AWAITING_STREAM_CHANGE,
|
||||||
CF_PROCESSING_STREAM_CHANGE,
|
CF_PROCESSING_STREAM_CHANGE,
|
||||||
CF_STREAM_CHANGED,
|
CF_STREAM_CHANGED,
|
||||||
|
CF_ARRANGED_BRIDGE,
|
||||||
/* WARNING: DO NOT ADD ANY FLAGS BELOW THIS LINE */
|
/* 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() */
|
/* 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
|
CF_FLAG_MAX
|
||||||
|
@ -1076,6 +1076,38 @@ static const switch_state_handler_table_t audio_bridge_peer_state_handlers = {
|
|||||||
/*.on_consume_media */ audio_bridge_on_consume_media,
|
/*.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_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_hibernate(switch_core_session_t *session);
|
||||||
static switch_status_t uuid_bridge_on_soft_execute(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;
|
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));
|
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_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);
|
audio_bridge_thread(NULL, (void *) a_leg);
|
||||||
|
|
||||||
switch_channel_clear_flag_recursive(caller_channel, CF_BRIDGE_ORIGINATOR);
|
switch_channel_clear_flag_recursive(caller_channel, CF_BRIDGE_ORIGINATOR);
|
||||||
|
Loading…
Reference in New Issue
Block a user