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

Freeswitch SVN anthm at freeswitch.org
Thu Sep 4 14:29:43 EDT 2008


Author: anthm
Date: Thu Sep  4 14:29:43 2008
New Revision: 9449

Modified:
   freeswitch/trunk/src/switch_ivr_bridge.c
   freeswitch/trunk/src/switch_ivr_originate.c

Log:
fix bridge app to make sure both channels are ready for media when one is only in ringing state

Modified: freeswitch/trunk/src/switch_ivr_bridge.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr_bridge.c	(original)
+++ freeswitch/trunk/src/switch_ivr_bridge.c	Thu Sep  4 14:29:43 2008
@@ -723,7 +723,8 @@
 			switch_channel_set_variable(caller_channel, SWITCH_BRIDGE_VARIABLE, switch_core_session_get_uuid(peer_session));
 			switch_channel_set_variable(peer_channel, SWITCH_BRIDGE_VARIABLE, switch_core_session_get_uuid(session));
 
-			if (!(switch_channel_test_flag(peer_channel, CF_ANSWERED) || switch_channel_test_flag(peer_channel, CF_EARLY_MEDIA))) {
+			if (!switch_channel_media_ready(caller_channel) || 
+				!(switch_channel_test_flag(peer_channel, CF_ANSWERED) || switch_channel_test_flag(peer_channel, CF_EARLY_MEDIA))) {
 				if ((status = switch_ivr_wait_for_answer(session, peer_session)) != SWITCH_STATUS_SUCCESS) {
 					switch_channel_state_t w_state = switch_channel_get_state(caller_channel);
 					switch_channel_hangup(peer_channel, SWITCH_CAUSE_ALLOTTED_TIMEOUT);

Modified: freeswitch/trunk/src/switch_ivr_originate.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr_originate.c	(original)
+++ freeswitch/trunk/src/switch_ivr_originate.c	Thu Sep  4 14:29:43 2008
@@ -395,6 +395,7 @@
 			goto done;
 		}
 
+
 		if (switch_core_session_dequeue_message(peer_session, &message) == SWITCH_STATUS_SUCCESS) {
 			if (switch_test_flag(message, SCSMF_DYNAMIC)) {
 				switch_safe_free(message);
@@ -402,17 +403,21 @@
 				message = NULL;
 			}
 		}
-		status = switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0);
-		if (!SWITCH_READ_ACCEPTABLE(status)) {
-			break;
-		}
 
+		if (switch_channel_media_ready(caller_channel)) {
+			status = switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0);
+			if (!SWITCH_READ_ACCEPTABLE(status)) {
+				break;
+			}
+		} else {
+			read_frame = NULL;
+		}
 
 		if (read_frame && !pass) {
 			if (ringback.fh) {
 				switch_size_t mlen, olen;
 				unsigned int pos = 0;
-
+				
 				if (ringback.asis) {
 					mlen = write_frame.codec->implementation->encoded_bytes_per_frame;
 				} else {
@@ -443,8 +448,10 @@
 				}
 			}
 
-			if (switch_core_session_write_frame(session, &write_frame, SWITCH_IO_FLAG_NONE, 0) != SWITCH_STATUS_SUCCESS) {
-				break;
+			if ((ringback.fh || ringback.audio_buffer) && write_frame.codec && write_frame.datalen) {
+				if (switch_core_session_write_frame(session, &write_frame, SWITCH_IO_FLAG_NONE, 0) != SWITCH_STATUS_SUCCESS) {
+					break;
+				}
 			}
 		} else {
 			switch_yield(1000);
@@ -1202,10 +1209,16 @@
 					(ringback_data
 					 || (switch_channel_test_flag(caller_channel, CF_ANSWERED) || switch_channel_test_flag(caller_channel, CF_EARLY_MEDIA)))) {
 
-					switch_status_t tstatus = switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0);
+					switch_status_t tstatus = SWITCH_STATUS_SUCCESS;
 
-					if (!SWITCH_READ_ACCEPTABLE(tstatus)) {
-						break;
+					if (switch_channel_media_ready(caller_channel)) {
+						tstatus = switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0);
+
+						if (!SWITCH_READ_ACCEPTABLE(tstatus)) {
+							break;
+						}
+					} else {
+						read_frame = NULL;
 					}
 
 					if (ring_ready && read_frame && !pass) {



More information about the Freeswitch-svn mailing list