]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-11380: [core] add new internal function
authorAnthony Minessale <anthm@freeswitch.org>
Sun, 2 Sep 2018 21:47:30 +0000 (16:47 -0500)
committerMike Jerris <mike@signalwire.com>
Wed, 5 Sep 2018 22:20:54 +0000 (18:20 -0400)
src/include/switch_ivr.h
src/include/switch_types.h
src/switch_ivr_bridge.c

index 00cbc3438bc6acd828aa4ae5b4f48494a1c2ba54..1ebd7a0e13dc38a7fabe25f4f09dc8c6bc3ff8bd 100644 (file)
@@ -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
index 25c3b97c856cf54b3c3f05a3d3ba582af70163dd..7ad71768f4f9074d0912da75e648f2298611daa7 100644 (file)
@@ -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
index 82f23cc3d3b78b07a4d649e73534728f164a6d0d..0ab870c6a59ffb228071c888e1d9f1c5c1e8801a 100644 (file)
@@ -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);