[Freeswitch-svn] [commit] r5181 - in freeswitch/trunk/src: . include mod/endpoints/mod_sofia

Freeswitch SVN anthm at freeswitch.org
Mon May 14 19:50:38 EDT 2007


Author: anthm
Date: Mon May 14 19:50:38 2007
New Revision: 5181

Modified:
   freeswitch/trunk/src/include/switch_ivr.h
   freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c
   freeswitch/trunk/src/switch_core_session.c
   freeswitch/trunk/src/switch_ivr.c
   freeswitch/trunk/src/switch_ivr_async.c
   freeswitch/trunk/src/switch_ivr_bridge.c
   freeswitch/trunk/src/switch_ivr_play_say.c

Log:
update

Modified: freeswitch/trunk/src/include/switch_ivr.h
==============================================================================
--- freeswitch/trunk/src/include/switch_ivr.h	(original)
+++ freeswitch/trunk/src/include/switch_ivr.h	Mon May 14 19:50:38 2007
@@ -92,13 +92,20 @@
 
 /*!
   \brief Parse command from an event
-  \param session the session to send the message to
-  \param event the event to send
+  \param session the session on which to parse the event
+  \param event the event to parse
   \return SWITCH_STATUS_SUCCESS if successful
 */
 SWITCH_DECLARE(switch_status_t) switch_ivr_parse_event(switch_core_session_t *session, switch_event_t *event);
 
 /*!
+  \brief Parse all commands from an event
+  \param session the session on which to parse the events
+  \return SWITCH_STATUS_SUCCESS if successful
+*/
+SWITCH_DECLARE(switch_status_t) switch_ivr_parse_all_events(switch_core_session_t *session);
+
+/*!
   \brief Wait for time to pass for a specified number of milliseconds
   \param session the session to wait for.
   \param ms the number of milliseconds

Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c
==============================================================================
--- freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c	(original)
+++ freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c	Mon May 14 19:50:38 2007
@@ -690,6 +690,11 @@
 			switch_core_session_t *other_session;
 			switch_channel_t *other_channel;
 			char *ip = NULL, *port = NULL;
+
+			if (switch_channel_get_state(channel) >= CS_HANGUP) {
+				return SWITCH_STATUS_FALSE;
+			}
+
 			switch_channel_set_flag(channel, CF_BYPASS_MEDIA);
 			tech_pvt->local_sdp_str = NULL;
 			if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))
@@ -710,6 +715,11 @@
 		break;
 	case SWITCH_MESSAGE_INDICATE_MEDIA:{
 		uint32_t count = 0;
+
+		if (switch_channel_get_state(channel) >= CS_HANGUP) {
+			return SWITCH_STATUS_FALSE;
+		}
+
 		switch_channel_clear_flag(channel, CF_BYPASS_MEDIA);
 			tech_pvt->local_sdp_str = NULL;
 			if (!switch_rtp_ready(tech_pvt->rtp_session)) {

Modified: freeswitch/trunk/src/switch_core_session.c
==============================================================================
--- freeswitch/trunk/src/switch_core_session.c	(original)
+++ freeswitch/trunk/src/switch_core_session.c	Mon May 14 19:50:38 2007
@@ -581,6 +581,7 @@
 	return status;
 }
 
+
 SWITCH_DECLARE(void) switch_core_session_reset(switch_core_session_t *session)
 {
 	switch_channel_t *channel;

Modified: freeswitch/trunk/src/switch_ivr.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr.c	(original)
+++ freeswitch/trunk/src/switch_ivr.c	Mon May 14 19:50:38 2007
@@ -374,6 +374,23 @@
 
 }
 
+SWITCH_DECLARE(switch_status_t) switch_ivr_parse_all_events(switch_core_session_t *session)
+{
+	switch_event_t *event;
+	switch_channel_t *channel;
+
+	channel = switch_core_session_get_channel(session);
+    assert(channel != NULL);
+
+	while (switch_core_session_dequeue_private_event(session, &event) == SWITCH_STATUS_SUCCESS) {
+		switch_ivr_parse_event(session, event);
+		switch_event_fire(&event);
+	}
+
+	return SWITCH_STATUS_SUCCESS;
+}
+
+
 SWITCH_DECLARE(switch_status_t) switch_ivr_park(switch_core_session_t *session, switch_input_args_t *args)
 {
 	switch_status_t status = SWITCH_STATUS_SUCCESS;
@@ -383,6 +400,7 @@
 	switch_event_t *event;
 	switch_unicast_conninfo_t *conninfo = NULL;
 	switch_codec_t *read_codec = switch_core_session_get_read_codec(session);
+
 	channel = switch_core_session_get_channel(session);
 	assert(channel != NULL);
 
@@ -467,10 +485,8 @@
 				}
 			}
 			
-			if (switch_core_session_dequeue_private_event(session, &event) == SWITCH_STATUS_SUCCESS) {
-				switch_ivr_parse_event(session, event);
-				switch_channel_event_set_data(switch_core_session_get_channel(session), event);
-				switch_event_fire(&event);
+			if (switch_core_session_private_event_count(session)) {
+				switch_ivr_parse_all_events(session);
 			}
 
 			if (switch_channel_has_dtmf(channel)) {
@@ -540,10 +556,9 @@
 			}
 		}
 
-		if (switch_core_session_dequeue_private_event(session, &event) == SWITCH_STATUS_SUCCESS) {
-			switch_ivr_parse_event(session, event);
-			switch_event_destroy(&event);
-		}
+		if (switch_core_session_private_event_count(session)) {
+            switch_ivr_parse_all_events(session);
+        }
 
 		if (switch_channel_has_dtmf(channel)) {
 			switch_channel_dequeue_dtmf(channel, dtmf, sizeof(dtmf));
@@ -606,8 +621,7 @@
 
 	while (switch_channel_ready(channel)) {
 		switch_frame_t *read_frame;
-		switch_event_t *event;
-
+		
 		if (timeout) {
 			elapsed = (uint32_t) ((switch_time_now() - started) / 1000);
 			if (elapsed >= timeout) {
@@ -615,10 +629,9 @@
 			}
 		}
 
-		if (switch_core_session_dequeue_private_event(session, &event) == SWITCH_STATUS_SUCCESS) {
-			switch_ivr_parse_event(session, event);
-			switch_event_destroy(&event);
-		}
+        if (switch_core_session_private_event_count(session)) {
+            switch_ivr_parse_all_events(session);
+        }
 
 		if (switch_channel_has_dtmf(channel)) {
 			char dtmf[128];
@@ -776,8 +789,7 @@
 	switch_core_session_message_t msg = { 0 };
 	switch_status_t status = SWITCH_STATUS_GENERR;
 	uint8_t swap = 0;
-	switch_event_t *event;
-
+	
 	msg.message_id = SWITCH_MESSAGE_INDICATE_NOMEDIA;
 	msg.from = __FILE__;
 
@@ -791,27 +803,23 @@
 		}
 
 		if ((flags & SMF_FORCE) || !switch_channel_test_flag(channel, CF_BYPASS_MEDIA)) {
-			while (switch_core_session_dequeue_private_event(session, &event) == SWITCH_STATUS_SUCCESS) {
-				switch_ivr_parse_event(session, event);
-				switch_event_destroy(&event);
-			}
-
-			switch_channel_set_flag(channel, CF_BYPASS_MEDIA);
-			switch_core_session_receive_message(session, &msg);
+			switch_ivr_parse_all_events(session);
+			
 			if ((flags & SMF_REBRIDGE) && (other_uuid = switch_channel_get_variable(channel, SWITCH_BRIDGE_VARIABLE)) &&
 				(other_session = switch_core_session_locate(other_uuid))) {
 				other_channel = switch_core_session_get_channel(other_session);
 				assert(other_channel != NULL);
-
-				while (switch_core_session_dequeue_private_event(other_session, &event) == SWITCH_STATUS_SUCCESS) {
-					switch_ivr_parse_event(other_session, event);
-					switch_event_destroy(&event);
-				}
+				
+				switch_ivr_parse_all_events(other_session);
 
 				switch_core_session_receive_message(other_session, &msg);
 				switch_channel_clear_state_handler(other_channel, NULL);
-
+				
 			}
+
+			switch_channel_set_flag(channel, CF_BYPASS_MEDIA);
+			switch_core_session_receive_message(session, &msg);
+
 			if (other_channel) {
 				switch_channel_clear_state_handler(channel, NULL);
 				if (swap) {

Modified: freeswitch/trunk/src/switch_ivr_async.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr_async.c	(original)
+++ freeswitch/trunk/src/switch_ivr_async.c	Mon May 14 19:50:38 2007
@@ -771,7 +771,7 @@
 
 	if ((session = switch_core_session_locate(uuid))) {
 		char *cause = NULL;
-		char *mypath = strdup(path);
+		char *mypath;
 		char *p;
 
 		master = session;
@@ -779,6 +779,16 @@
 		channel = switch_core_session_get_channel(session);
 		assert(channel != NULL);
 
+		if ((switch_channel_test_flag(channel, CF_EVENT_PARSE))) {
+			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Channel [%s] already broadcasting...broadcast aborted\n", 
+							  switch_channel_get_name(channel));
+			switch_core_session_rwunlock(session);
+			return SWITCH_STATUS_FALSE;
+		}
+
+		mypath = strdup(path);
+
+
 		if ((nomedia = switch_channel_test_flag(channel, CF_BYPASS_MEDIA))) {
 			switch_ivr_media(uuid, SMF_REBRIDGE);
 		}

Modified: freeswitch/trunk/src/switch_ivr_bridge.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr_bridge.c	(original)
+++ freeswitch/trunk/src/switch_ivr_bridge.c	Mon May 14 19:50:38 2007
@@ -55,6 +55,7 @@
 	switch_channel_t *chan_a, *chan_b;
 	switch_frame_t *read_frame;
 	switch_core_session_t *session_a, *session_b;
+	uint32_t loop_count = 0;
 
 	session_a = data->session;
 	if (!(session_b = switch_core_session_locate(data->b_uuid))) {
@@ -80,6 +81,7 @@
 		switch_channel_state_t b_state;
 		switch_status_t status;
 		switch_event_t *event;
+		loop_count++;
 
 		/* if you really want to make sure it's not ready, test it twice because it might be just a break */
 		if (!switch_channel_ready(chan_a) && !switch_channel_ready(chan_a)) {
@@ -96,21 +98,20 @@
 			break;
 		}
 
-		if (switch_core_session_dequeue_private_event(session_a, &event) == SWITCH_STATUS_SUCCESS) {
+		if (loop_count > 10 && switch_core_session_private_event_count(session_a)) {
 			switch_channel_set_flag(chan_b, CF_SUSPEND);
 			msg.string_arg = data->b_uuid;
 			msg.message_id = SWITCH_MESSAGE_INDICATE_UNBRIDGE;
 			msg.from = __FILE__;
 			switch_core_session_receive_message(session_a, &msg);
-			switch_ivr_parse_event(session_a, event);
+			switch_ivr_parse_all_events(session_a);
 			msg.message_id = SWITCH_MESSAGE_INDICATE_BRIDGE;
 			switch_core_session_receive_message(session_a, &msg);
 			switch_channel_clear_flag(chan_b, CF_SUSPEND);
-			switch_event_destroy(&event);
 		}
 		
 		if (switch_channel_test_flag(chan_a, CF_SUSPEND) || switch_channel_test_flag(chan_b, CF_SUSPEND)) {
-			switch_yield(100000);
+			switch_yield(1000);
 			continue;
 		}
 

Modified: freeswitch/trunk/src/switch_ivr_play_say.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr_play_say.c	(original)
+++ freeswitch/trunk/src/switch_ivr_play_say.c	Mon May 14 19:50:38 2007
@@ -394,11 +394,9 @@
 
 	while (switch_channel_ready(channel)) {
 		switch_size_t len;
-		switch_event_t *event;
 
-		if (switch_core_session_dequeue_private_event(session, &event) == SWITCH_STATUS_SUCCESS) {
-			switch_ivr_parse_event(session, event);
-			switch_event_destroy(&event);
+		if (switch_core_session_private_event_count(session)) {
+			switch_ivr_parse_all_events(session);
 		}
 
 		if (start && (time(NULL) - start) > limit) {
@@ -425,6 +423,8 @@
 			}
 
 			if (args->input_callback) {
+				switch_event_t *event = NULL;
+
 				if (switch_core_session_dequeue_event(session, &event) == SWITCH_STATUS_SUCCESS) {
 					status = args->input_callback(session, event, SWITCH_INPUT_TYPE_EVENT, args->buf, args->buflen);
 					switch_event_destroy(&event);
@@ -682,12 +682,9 @@
 		int done = 0;
 		int do_speed = 1;
 		int last_speed = -1;
-		switch_event_t *event;
 
-
-		if (switch_core_session_dequeue_private_event(session, &event) == SWITCH_STATUS_SUCCESS) {
-			switch_ivr_parse_event(session, event);
-			switch_event_destroy(&event);
+		if (switch_core_session_private_event_count(session)) {
+			switch_ivr_parse_all_events(session);
 		}
 
 		if (args && (args->input_callback || args->buf || args->buflen)) {
@@ -711,6 +708,8 @@
 			}
 
 			if (args->input_callback) {
+				switch_event_t *event;
+
 				if (switch_core_session_dequeue_event(session, &event) == SWITCH_STATUS_SUCCESS) {
 					status = args->input_callback(session, event, SWITCH_INPUT_TYPE_EVENT, args->buf, args->buflen);
 					switch_event_destroy(&event);



More information about the Freeswitch-svn mailing list