Revision
15181
Author
anthm
Date
2009-10-20 12:03:03 -0500 (Tue, 20 Oct 2009)

Log Message

fix proxy-media issue regression

Modified Paths

Diff

Modified: freeswitch/trunk/src/include/switch_types.h (15180 => 15181)


--- freeswitch/trunk/src/include/switch_types.h	2009-10-20 01:36:33 UTC (rev 15180)
+++ freeswitch/trunk/src/include/switch_types.h	2009-10-20 17:03:03 UTC (rev 15181)
@@ -868,7 +868,8 @@
 
 typedef enum {
 	CC_MEDIA_ACK = 1,
-	CC_BYPASS_MEDIA = 1,
+	CC_BYPASS_MEDIA,
+	CC_PROXY_MEDIA,
 	/* WARNING: DO NOT ADD ANY FLAGS BELOW THIS LINE */
 	CC_FLAG_MAX
 } switch_channel_cap_t;
@@ -914,6 +915,7 @@
 	CF_ORIGINATOR,
 	CF_XFER_ZOMBIE,
 	CF_MEDIA_ACK,
+	CF_THREAD_SLEEPING,
 	/* WARNING: DO NOT ADD ANY FLAGS BELOW THIS LINE */
 	CF_FLAG_MAX
 } switch_channel_flag_t;

Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c (15180 => 15181)


--- freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c	2009-10-20 01:36:33 UTC (rev 15180)
+++ freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c	2009-10-20 17:03:03 UTC (rev 15181)
@@ -523,6 +523,7 @@
 	tech_pvt->channel = switch_core_session_get_channel(session);
 	switch_channel_set_cap(tech_pvt->channel, CC_MEDIA_ACK);
 	switch_channel_set_cap(tech_pvt->channel, CC_BYPASS_MEDIA);
+	switch_channel_set_cap(tech_pvt->channel, CC_PROXY_MEDIA);
 	
 	switch_core_session_set_private(session, tech_pvt);
 

Modified: freeswitch/trunk/src/switch_core_session.c (15180 => 15181)


--- freeswitch/trunk/src/switch_core_session.c	2009-10-20 01:36:33 UTC (rev 15180)
+++ freeswitch/trunk/src/switch_core_session.c	2009-10-20 17:03:03 UTC (rev 15181)
@@ -507,19 +507,25 @@
 
 			if (switch_channel_test_flag(channel, CF_PROXY_MODE)) {
 				if (switch_channel_test_cap(peer_channel, CC_BYPASS_MEDIA)) {
-					switch_channel_set_flag(peer_channel, CF_PROXY_MODE);
-			
-					if (switch_channel_test_flag(channel, CF_PROXY_MEDIA)) {
-						switch_channel_set_flag(peer_channel, CF_PROXY_MEDIA);
-						if (switch_channel_test_flag(channel, CF_VIDEO)) {
-							switch_channel_set_flag(peer_channel, CF_VIDEO);
-						}
+					switch_channel_set_flag(peer_channel, CF_PROXY_MODE);		
+				} else {
+					switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, 
+									  "%s does not support the proxy feature, disabling.\n", 
+									  switch_channel_get_name(peer_channel));
+					switch_channel_clear_flag(channel, CF_PROXY_MODE);
+				}
+			}
+
+			if (switch_channel_test_flag(channel, CF_PROXY_MEDIA)) {
+				if (switch_channel_test_cap(peer_channel, CC_PROXY_MEDIA)) {
+					switch_channel_set_flag(peer_channel, CF_PROXY_MEDIA);
+					if (switch_channel_test_flag(channel, CF_VIDEO)) {
+						switch_channel_set_flag(peer_channel, CF_VIDEO);
 					}
 				} else {
 					switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, 
 									  "%s does not support the proxy feature, disabling.\n", 
 									  switch_channel_get_name(peer_channel));
-					switch_channel_clear_flag(channel, CF_PROXY_MODE);
 					switch_channel_clear_flag(channel, CF_PROXY_MEDIA);
 				}
 			}
@@ -703,7 +709,9 @@
 			status = SWITCH_STATUS_SUCCESS;
 		}
 
-		if (switch_channel_test_flag(session->channel, CF_PROXY_MODE)) {
+		switch_core_session_kill_channel(session, SWITCH_SIG_BREAK);
+
+		if (switch_channel_test_flag(session->channel, CF_PROXY_MODE) || switch_channel_test_flag(session->channel, CF_THREAD_SLEEPING)) {
 			switch_core_session_wake_session_thread(session);
 		}
 	}

Modified: freeswitch/trunk/src/switch_core_state_machine.c (15180 => 15181)


--- freeswitch/trunk/src/switch_core_state_machine.c	2009-10-20 01:36:33 UTC (rev 15180)
+++ freeswitch/trunk/src/switch_core_state_machine.c	2009-10-20 17:03:03 UTC (rev 15181)
@@ -381,8 +381,10 @@
 					switch_core_session_receive_message(session, message);
 					message = NULL;
 				}
-				
+
+				switch_channel_set_flag(session->channel, CF_THREAD_SLEEPING);
 				switch_thread_cond_wait(session->cond, session->mutex);
+				switch_channel_clear_flag(session->channel, CF_THREAD_SLEEPING);
 				
 				while (switch_core_session_dequeue_message(session, &message) == SWITCH_STATUS_SUCCESS) {
 					switch_core_session_receive_message(session, message);