[Freeswitch-svn] [commit] r8487 - freeswitch/trunk/src

Freeswitch SVN anthm at freeswitch.org
Tue May 20 11:40:28 EDT 2008


Author: anthm
Date: Tue May 20 11:40:27 2008
New Revision: 8487

Modified:
   freeswitch/trunk/src/switch_ivr_bridge.c

Log:
update

Modified: freeswitch/trunk/src/switch_ivr_bridge.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr_bridge.c	(original)
+++ freeswitch/trunk/src/switch_ivr_bridge.c	Tue May 20 11:40:27 2008
@@ -99,7 +99,7 @@
 	uint32_t loop_count = 0;
 	const char *app_name = NULL, *app_arg = NULL;
 	const char *hook_var = NULL;
-	int nosuspend  = 0;
+	int inner_bridge  = 0;
 #ifdef SWITCH_VIDEO_IN_THREADS
     struct vid_helper vh = { 0 };
 	uint32_t vid_launch = 0;
@@ -123,16 +123,24 @@
 		ans_b = switch_channel_test_flag(chan_b, CF_ANSWERED);
 	}
 
-	switch_channel_set_flag(chan_a, CF_BRIDGED);
-	
-	nosuspend = switch_channel_test_flag(chan_a, CF_INNER_BRIDGE);
+	inner_bridge = switch_channel_test_flag(chan_a, CF_INNER_BRIDGE);
 	
+
+	switch_channel_set_flag(chan_a, CF_BRIDGED);
+
+
+	switch_channel_wait_for_flag(chan_b, CF_BRIDGED, SWITCH_TRUE, 1000000);
+
 	for (;;) {
 		switch_channel_state_t b_state;
 		switch_status_t status;
 		switch_event_t *event;
 		loop_count++;
 
+		if (!switch_channel_test_flag(chan_b, CF_BRIDGED)) {
+			goto end_of_bridge_loop;
+		}
+
 		if (!switch_channel_ready(chan_a)) {
 			goto end_of_bridge_loop;
 		}
@@ -160,7 +168,7 @@
 			switch_core_session_kill_channel(session_b, SWITCH_SIG_BREAK);
 		}
 
-		if (!nosuspend && (switch_channel_test_flag(chan_a, CF_SUSPEND) || switch_channel_test_flag(chan_b, CF_SUSPEND))) {
+		if (!inner_bridge && (switch_channel_test_flag(chan_a, CF_SUSPEND) || switch_channel_test_flag(chan_b, CF_SUSPEND))) {
 			status = switch_core_session_read_frame(session_a, &read_frame, SWITCH_IO_FLAG_NONE, stream_id);
 			
 			if (!SWITCH_READ_ACCEPTABLE(status)) {
@@ -290,7 +298,7 @@
     }
 #endif
 
-	if (!nosuspend) {
+	if (!inner_bridge) {
 		hook_var = switch_channel_get_variable(chan_a, SWITCH_API_BRIDGE_END_VARIABLE);
 	}
 
@@ -319,7 +327,7 @@
 	msg.from = __FILE__;
 	switch_core_session_receive_message(session_a, &msg);
 	
-	if (!nosuspend && switch_channel_get_state(chan_a) < CS_HANGUP) {
+	if (!inner_bridge && switch_channel_get_state(chan_a) < CS_HANGUP) {
 		if ((app_name = switch_channel_get_variable(chan_a, SWITCH_EXEC_AFTER_BRIDGE_APP_VARIABLE))) {
 			switch_caller_extension_t *extension = NULL;
 			if ((extension = switch_caller_extension_new(session_a, app_name, app_name)) == 0) {
@@ -345,7 +353,9 @@
 	switch_core_session_reset(session_a, SWITCH_TRUE);
 	switch_channel_set_variable(chan_a, SWITCH_BRIDGE_VARIABLE, NULL);
 	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "BRIDGE THREAD DONE [%s]\n", switch_channel_get_name(chan_a));
-	switch_channel_clear_flag(chan_a, CF_BRIDGED);
+	if (!inner_bridge) {
+		switch_channel_clear_flag(chan_a, CF_BRIDGED);
+	}
 	switch_core_session_rwunlock(session_b);
 	return NULL;
 }
@@ -648,7 +658,7 @@
 	switch_channel_state_t state;
 	switch_event_t *event;
 	int br = 0;
-	int nosuspend = switch_channel_test_flag(caller_channel, CF_INNER_BRIDGE);
+	int inner_bridge = switch_channel_test_flag(caller_channel, CF_INNER_BRIDGE);
 	
 	switch_channel_set_flag(caller_channel, CF_ORIGINATOR);
 	switch_channel_clear_flag(caller_channel, CF_TRANSFER);
@@ -758,8 +768,7 @@
 			audio_bridge_thread(NULL, (void *) a_leg);
 
 			switch_channel_clear_flag(caller_channel, CF_ORIGINATOR);
-			//make sure this doesnt break anything
-
+			
 			if (!switch_channel_test_flag(peer_channel, CF_TRANSFER) && switch_channel_get_state(peer_channel) == CS_EXCHANGE_MEDIA) {
 				switch_channel_set_state(peer_channel, CS_RESET);
 			}
@@ -793,7 +802,7 @@
 
 	state = switch_channel_get_state(caller_channel);
 	
-	if (!switch_channel_test_flag(caller_channel, CF_TRANSFER) && !nosuspend) {
+	if (!switch_channel_test_flag(caller_channel, CF_TRANSFER) && !inner_bridge) {
 		if ((state != CS_EXECUTE && state != CS_PARK && state != CS_ROUTING) || 
 			(switch_channel_test_flag(peer_channel, CF_ANSWERED) && state < CS_HANGUP && 
 			 switch_true(switch_channel_get_variable(caller_channel, SWITCH_HANGUP_AFTER_BRIDGE_VARIABLE)))) {



More information about the Freeswitch-svn mailing list