[Freeswitch-svn] [commit] r4311 - in freeswitch/trunk/src: . mod/languages/mod_spidermonkey

Freeswitch SVN anthm at freeswitch.org
Sat Feb 17 13:40:43 EST 2007


Author: anthm
Date: Sat Feb 17 13:40:42 2007
New Revision: 4311

Modified:
   freeswitch/trunk/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c
   freeswitch/trunk/src/switch_core.c
   freeswitch/trunk/src/switch_ivr.c

Log:
rearrange things to work better

Modified: freeswitch/trunk/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c
==============================================================================
--- freeswitch/trunk/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c	(original)
+++ freeswitch/trunk/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c	Sat Feb 17 13:40:42 2007
@@ -831,8 +831,8 @@
         return JS_TRUE;
     }
 
-	if ((has = switch_channel_has_dtmf(channel))) {
-		switch_channel_dequeue_dtmf(channel, buf, has);
+	while ((has = switch_channel_has_dtmf(channel))) {
+		switch_channel_dequeue_dtmf(channel, buf, sizeof(buf));
 	}
 
 	*rval = BOOLEAN_TO_JSVAL( JS_TRUE );

Modified: freeswitch/trunk/src/switch_core.c
==============================================================================
--- freeswitch/trunk/src/switch_core.c	(original)
+++ freeswitch/trunk/src/switch_core.c	Sat Feb 17 13:40:42 2007
@@ -2195,12 +2195,11 @@
 	switch_buffer_destroy(&session->raw_read_buffer);
 	switch_buffer_destroy(&session->raw_write_buffer);
 
-	/* reset state handlers and flush dtmf */
+	/* flush dtmf */
 	channel = switch_core_session_get_channel(session);
-	switch_channel_clear_state_handler(channel, NULL);
 
-	if ((has = switch_channel_has_dtmf(channel))) {
-        switch_channel_dequeue_dtmf(channel, buf, has);
+	while ((has = switch_channel_has_dtmf(channel))) {
+        switch_channel_dequeue_dtmf(channel, buf, sizeof(buf));
     }
 
 }

Modified: freeswitch/trunk/src/switch_ivr.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr.c	(original)
+++ freeswitch/trunk/src/switch_ivr.c	Sat Feb 17 13:40:42 2007
@@ -36,9 +36,8 @@
 #include <switch_ivr.h>
 #include <libteletone.h>
 
-static const switch_state_handler_table_t noop_state_handler = {0};
-
 static const switch_state_handler_table_t audio_bridge_peer_state_handlers;
+static const switch_state_handler_table_t originate_state_handlers;
 
 typedef enum {
 	IDX_CANCEL = -2,
@@ -2157,6 +2156,35 @@
 };
 
 
+
+static switch_status_t originate_on_ring(switch_core_session_t *session)
+{
+	switch_channel_t *channel = NULL;
+
+	channel = switch_core_session_get_channel(session);
+	assert(channel != NULL);
+
+	/* put the channel in a passive state so we can loop audio to it */
+
+	/* clear this handler so it only works once (next time (a.k.a. Transfer) we will do the real ring state) */
+	switch_channel_clear_state_handler(channel, &originate_state_handlers);
+
+	switch_channel_set_state(channel, CS_HOLD);
+
+	return SWITCH_STATUS_FALSE;
+}
+
+static const switch_state_handler_table_t originate_state_handlers = {
+	/*.on_init */ NULL,
+	/*.on_ring */ originate_on_ring,
+	/*.on_execute */ NULL,
+	/*.on_hangup */ NULL,
+	/*.on_loopback */ NULL,
+	/*.on_transmit */ NULL,
+	/*.on_hold */ NULL
+};
+
+
 static switch_status_t uuid_bridge_on_transmit(switch_core_session_t *session)
 {
 	switch_channel_t *channel = NULL;
@@ -2722,12 +2750,8 @@
 			peer_channels[i] = switch_core_session_get_channel(peer_sessions[i]);
 			assert(peer_channels[i] != NULL);
 
-			//switch_channel_set_flag(peer_channels[i], CF_NO_INDICATE);
-
-			if (table == &noop_state_handler) {
-				table = NULL;
-			} else if (!table) {
-				table = &audio_bridge_peer_state_handlers;
+			if (!table) {
+				table = &originate_state_handlers;
 			}
 
 			if (table) {
@@ -3533,7 +3557,6 @@
 			switch_channel_set_private(peer_channel, "_bridge_", other_audio_thread);
 			switch_channel_set_state(peer_channel, CS_LOOPBACK);
 			audio_bridge_thread(NULL, (void *) this_audio_thread);
-			switch_core_session_reset(session);
 
 			if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_UNBRIDGE) == SWITCH_STATUS_SUCCESS) {
 				switch_channel_event_set_data(caller_channel, event);
@@ -3560,7 +3583,7 @@
 					switch_yield(1000);
 				}
 			}
-			switch_core_session_reset(peer_session);
+
 			switch_core_session_rwunlock(peer_session);
 			
 		} else {
@@ -3656,10 +3679,14 @@
 	assert(extension != NULL);
 
 	switch_core_session_reset(session);
-	
+
+
 	channel = switch_core_session_get_channel(session);
 	assert(channel != NULL);
 
+	/* clear all state handlers */
+	switch_channel_clear_state_handler(channel, NULL);
+
 	if ((profile = switch_channel_get_caller_profile(channel))) {
 		new_profile = switch_caller_profile_clone(session, profile);
 		new_profile->destination_number = switch_core_session_strdup(session, extension);



More information about the Freeswitch-svn mailing list