[Freeswitch-svn] [commit] r7870 - in freeswitch/trunk/src: . include

Freeswitch SVN anthm at freeswitch.org
Tue Mar 11 20:11:33 EDT 2008


Author: anthm
Date: Tue Mar 11 20:11:33 2008
New Revision: 7870

Modified:
   freeswitch/trunk/src/include/switch_types.h
   freeswitch/trunk/src/switch_ivr.c
   freeswitch/trunk/src/switch_ivr_async.c

Log:
update

Modified: freeswitch/trunk/src/include/switch_types.h
==============================================================================
--- freeswitch/trunk/src/include/switch_types.h	(original)
+++ freeswitch/trunk/src/include/switch_types.h	Tue Mar 11 20:11:33 2008
@@ -245,7 +245,8 @@
 	SMF_ECHO_ALEG = (1 << 1),
 	SMF_ECHO_BLEG = (1 << 2),
 	SMF_FORCE = (1 << 3),
-	SMF_LOOP = (1 << 4)
+	SMF_LOOP = (1 << 4),
+	SMF_HOLD_BLEG = (1 << 5)
 } switch_media_flag_t;
 
 typedef enum {

Modified: freeswitch/trunk/src/switch_ivr.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr.c	(original)
+++ freeswitch/trunk/src/switch_ivr.c	Tue Mar 11 20:11:33 2008
@@ -291,6 +291,7 @@
 		char *app_name = switch_event_get_header(event, "execute-app-name");
 		char *app_arg = switch_event_get_header(event, "execute-app-arg");
 		char *loop_h = switch_event_get_header(event, "loops");
+		char *hold_bleg = switch_event_get_header(event, "hold-bleg");
 		int loops = 1;
 
 		if (loop_h) {
@@ -301,8 +302,25 @@
 			if ((application_interface = switch_loadable_module_get_application_interface(app_name))) {
 				if (application_interface->application_function) {
 					int x;
+					const char *b_uuid = NULL;
+					switch_core_session_t *b_session = NULL;
+					
 					switch_channel_clear_flag(channel, CF_STOP_BROADCAST);
 					switch_channel_set_flag(channel, CF_BROADCAST);
+					if (hold_bleg && switch_true(hold_bleg)) {
+						if ((b_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))) {
+							const char *stream;
+
+							if (!(stream = switch_channel_get_variable_partner(channel, SWITCH_HOLD_MUSIC_VARIABLE))) {
+								stream = switch_channel_get_variable(channel, SWITCH_HOLD_MUSIC_VARIABLE);
+							}
+							if (stream) {
+								switch_ivr_broadcast(b_uuid, hold_bleg, SMF_ECHO_ALEG | SMF_LOOP);
+							} else {
+								b_uuid = NULL;
+							}
+						}
+					}
 					for (x = 0; x < loops || loops < 0; x++) {
 						switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s Command Execute %s(%s)\n", 
 										  switch_channel_get_name(channel), app_name, app_arg);
@@ -311,6 +329,14 @@
 							break;
 						}
 					}
+					if (b_uuid) {
+						if ((b_session = switch_core_session_locate(b_uuid))) {
+							switch_channel_t *b_channel = switch_core_session_get_channel(b_session);
+							switch_channel_stop_broadcast(b_channel);
+							switch_channel_wait_for_flag(b_channel, CF_BROADCAST, SWITCH_FALSE, 5000);
+							switch_core_session_rwunlock(b_session);
+						}
+					}
 					switch_channel_clear_flag(channel, CF_BROADCAST);					
 				}
 			}

Modified: freeswitch/trunk/src/switch_ivr_async.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr_async.c	(original)
+++ freeswitch/trunk/src/switch_ivr_async.c	Tue Mar 11 20:11:33 2008
@@ -1353,6 +1353,7 @@
 	if (!switch_strlen_zero(app)) {
 		md->map[key].app = switch_core_session_strdup(session, app);
 		md->map[key].flags = exec_b ? SMF_ECHO_BLEG : SMF_ECHO_ALEG;
+		md->map[key].flags |= SMF_HOLD_BLEG;
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Bound: %d %s\n", key, app);
 	} else {
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "UnBound: %d\n", key);
@@ -1838,6 +1839,9 @@
 			if ((flags & SMF_LOOP)) {
 				switch_event_add_header(event, SWITCH_STACK_BOTTOM, "loops", "%d", -1);
 			}
+			if ((flags & SMF_HOLD_BLEG)) {
+				switch_event_add_header(event, SWITCH_STACK_BOTTOM, "hold-bleg", "%s", "true");
+			}
 				
 			switch_core_session_queue_private_event(other_session, &event);
 		}



More information about the Freeswitch-svn mailing list