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

Freeswitch SVN anthm at freeswitch.org
Mon Feb 12 21:32:10 EST 2007


Author: anthm
Date: Mon Feb 12 21:32:10 2007
New Revision: 4221

Modified:
   freeswitch/trunk/src/include/switch_channel.h
   freeswitch/trunk/src/include/switch_types.h
   freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c
   freeswitch/trunk/src/switch_channel.c
   freeswitch/trunk/src/switch_ivr.c

Log:
add ring ready flag to core

Modified: freeswitch/trunk/src/include/switch_channel.h
==============================================================================
--- freeswitch/trunk/src/include/switch_channel.h	(original)
+++ freeswitch/trunk/src/include/switch_channel.h	Mon Feb 12 21:32:10 2007
@@ -331,6 +331,13 @@
 #define switch_channel_pre_answer(channel) switch_channel_perform_pre_answer(channel, __FILE__, __SWITCH_FUNC__, __LINE__)
 
 /*!
+  \brief Indicate a channel is ready to provide ringback
+  \param channel channel
+  \return SWITCH_STATUS_SUCCESS
+*/								
+#define switch_channel_mark_ring_ready(channel) switch_channel_perform_mark_ring_ready(channel, __FILE__, __SWITCH_FUNC__, __LINE__)
+
+/*!
   \brief add a state handler table to a given channel
   \param channel channel on which to add the state handler table
   \param state_handler table of state handler functions

Modified: freeswitch/trunk/src/include/switch_types.h
==============================================================================
--- freeswitch/trunk/src/include/switch_types.h	(original)
+++ freeswitch/trunk/src/include/switch_types.h	Mon Feb 12 21:32:10 2007
@@ -487,6 +487,7 @@
 CF_EVENT_PARSE  = (1 << 15) - Suspend control events
 CF_NO_INDICATE  = (1 << 16) - Disable Indications
 CF_REPEAT_STATE = (1 << 17) - Tell the state machine to repeat a state
+CF_RING_READY   = (1 << 18) - Channel is ready to send ringback
 </pre>
  */
 
@@ -508,7 +509,8 @@
 	CF_SUSPEND		= (1 << 14),
 	CF_EVENT_PARSE	= (1 << 15),
 	CF_NO_INDICATE	= (1 << 16),
-    CF_REPEAT_STATE = (1 << 17)
+    CF_REPEAT_STATE = (1 << 17),
+	CF_RING_READY   = (1 << 18)
 } switch_channel_flag_t;
 
 

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 Feb 12 21:32:10 2007
@@ -2811,6 +2811,7 @@
 	case nua_callstate_proceeding:
 		if (channel) {
 			if (status == 180 && !(switch_channel_test_flag(channel, CF_NO_INDICATE))) {
+				switch_channel_mark_ring_ready(channel);
 				if (switch_test_flag(tech_pvt, TFLAG_NOMEDIA)) {
 					if ((uuid = switch_channel_get_variable(channel, SWITCH_BRIDGE_VARIABLE)) && (other_session = switch_core_session_locate(uuid))) {
 						switch_core_session_message_t msg;

Modified: freeswitch/trunk/src/switch_channel.c
==============================================================================
--- freeswitch/trunk/src/switch_channel.c	(original)
+++ freeswitch/trunk/src/switch_channel.c	Mon Feb 12 21:32:10 2007
@@ -978,13 +978,32 @@
 	return channel->state;
 }
 
+
+SWITCH_DECLARE(switch_status_t) switch_channel_perform_mark_ring_ready(switch_channel_t *channel,
+																	   const char *file,
+																	   const char *func,
+																	   int line)
+{
+	if (!switch_channel_test_flag(channel, CF_RING_READY)) {
+        switch_log_printf(SWITCH_CHANNEL_ID_LOG, (char *) file, func, line, SWITCH_LOG_NOTICE, "Ring-Ready %s!\n", channel->name);
+		switch_channel_set_flag(channel, CF_RING_READY);
+		return SWITCH_STATUS_SUCCESS;
+	}
+
+	return SWITCH_STATUS_FALSE;
+}
+
+
+
 SWITCH_DECLARE(switch_status_t) switch_channel_perform_mark_pre_answered(switch_channel_t *channel,
-                                                                       const char *file,
-                                                                       const char *func,
-                                                                       int line)
+																		 const char *file,
+																		 const char *func,
+																		 int line)
 {
     switch_event_t *event;
 
+	switch_channel_mark_ring_ready(channel);
+
     if (!switch_channel_test_flag(channel, CF_EARLY_MEDIA)) {
         char *uuid;
         switch_core_session_t *other_session;

Modified: freeswitch/trunk/src/switch_ivr.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr.c	(original)
+++ freeswitch/trunk/src/switch_ivr.c	Mon Feb 12 21:32:10 2007
@@ -2789,7 +2789,7 @@
 					write_frame.datalen = read_codec->implementation->bytes_per_frame;
 					write_frame.samples = write_frame.datalen / 2;
 					memset(write_frame.data, 255, write_frame.datalen);
-
+					
 					if (ringback_data) {
 						char *tmp_data = NULL;
 						
@@ -2882,7 +2882,8 @@
 					break;
 				}
 
-				if (read_frame && !pass && !switch_test_flag(read_frame, SFF_CNG) && read_frame->datalen > 1) {
+				if (switch_channel_test_flag(caller_channel, CF_RING_READY) && 
+					read_frame && !pass && !switch_test_flag(read_frame, SFF_CNG) && read_frame->datalen > 1) {
 					if (ringback.fh) {
 						uint8_t abuf[1024];
 						switch_size_t mlen, olen;



More information about the Freeswitch-svn mailing list