[Freeswitch-svn] [commit] r4105 - in freeswitch/trunk/src: . include mod/applications/mod_ivrtest

Freeswitch SVN anthm at freeswitch.org
Wed Jan 31 18:09:33 EST 2007


Author: anthm
Date: Wed Jan 31 18:09:33 2007
New Revision: 4105

Modified:
   freeswitch/trunk/src/include/switch_core.h
   freeswitch/trunk/src/include/switch_types.h
   freeswitch/trunk/src/mod/applications/mod_ivrtest/mod_ivrtest.c
   freeswitch/trunk/src/switch_core.c
   freeswitch/trunk/src/switch_ivr.c

Log:
core framework for reverse media bugs

Modified: freeswitch/trunk/src/include/switch_core.h
==============================================================================
--- freeswitch/trunk/src/include/switch_core.h	(original)
+++ freeswitch/trunk/src/include/switch_core.h	Wed Jan 31 18:09:33 2007
@@ -137,6 +137,19 @@
 SWITCH_DECLARE(void *) switch_core_media_bug_get_user_data(switch_media_bug_t *bug);
 
 /*!
+  \brief Obtain a replace frame from a media bug
+  \param bug the bug to get the data from
+*/
+SWITCH_DECLARE(switch_frame_t *) switch_core_media_bug_get_replace_frame(switch_media_bug_t *bug);
+
+/*!
+  \brief Set a return replace frame
+  \param bug the bug to set the frame on
+  \param frame the frame to set
+*/
+SWITCH_DECLARE(void) switch_core_media_bug_set_replace_frame(switch_media_bug_t *bug, switch_frame_t *frame);
+
+/*!
   \brief Remove a media bug from the session
   \param session the session to remove the bug from
   \param bug bug to remove

Modified: freeswitch/trunk/src/include/switch_types.h
==============================================================================
--- freeswitch/trunk/src/include/switch_types.h	(original)
+++ freeswitch/trunk/src/include/switch_types.h	Wed Jan 31 18:09:33 2007
@@ -140,6 +140,7 @@
 	SWITCH_ABC_TYPE_INIT,
 	SWITCH_ABC_TYPE_READ,
 	SWITCH_ABC_TYPE_WRITE,
+	SWITCH_ABC_TYPE_WRITE_REPLACE,
 	SWITCH_ABC_TYPE_CLOSE,
 } switch_abc_type_t;
 
@@ -654,12 +655,14 @@
 <pre>
 SMBF_READ_STREAM - Include the Read Stream
 SMBF_WRITE_STREAM - Include the Write Stream
+SMBF_WRITE_STREAM - Replace the Write Stream
 </pre>
 */
 typedef enum {
 	SMBF_BOTH = 0,
 	SMBF_READ_STREAM = (1 << 0),
-	SMBF_WRITE_STREAM = (1 << 1)
+	SMBF_WRITE_STREAM = (1 << 1),
+	SMBF_WRITE_REPLACE = (1 << 2)
 } switch_media_bug_flag_t;
 
 /*!

Modified: freeswitch/trunk/src/mod/applications/mod_ivrtest/mod_ivrtest.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_ivrtest/mod_ivrtest.c	(original)
+++ freeswitch/trunk/src/mod/applications/mod_ivrtest/mod_ivrtest.c	Wed Jan 31 18:09:33 2007
@@ -231,6 +231,39 @@
 	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Done\n");
 }
 
+static void bug_callback(switch_media_bug_t *bug, void *user_data, switch_abc_type_t type)
+{
+    switch_frame_t *frame;
+
+    switch(type) {
+	case SWITCH_ABC_TYPE_WRITE_REPLACE:
+        frame = switch_core_media_bug_get_replace_frame(bug);
+        switch_core_media_bug_set_replace_frame(bug, frame);
+        printf("W00t\n");
+        break;
+    default:
+        break;
+    }
+
+}
+
+static void bugtest_function(switch_core_session_t *session, char *data)
+{
+	switch_media_bug_t *bug;
+	switch_channel_t *channel = switch_core_session_get_channel(session);
+    switch_status_t status;
+
+	if ((status = switch_core_media_bug_add(session,
+											bug_callback,
+											NULL,
+											SMBF_WRITE_REPLACE,
+											&bug)) != SWITCH_STATUS_SUCCESS) {
+		switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);
+        return;
+	}
+    switch_ivr_play_file(session, NULL, data, NULL);
+}
+
 #if 1
 static void asrtest_function(switch_core_session_t *session, char *data)
 {
@@ -423,11 +456,18 @@
 
 
 
+static const switch_application_interface_t bug_application_interface = {
+	/*.interface_name */ "bugtest",
+	/*.application_function */ bugtest_function,
+	NULL, NULL, NULL,
+	/*.next*/ NULL
+};
+
 static const switch_application_interface_t ivr_application_interface = {
 	/*.interface_name */ "ivrmenu",
 	/*.application_function */ ivr_application_function,
 	NULL, NULL, NULL,
-	/*.next*/ NULL
+	/*.next*/ &bug_application_interface
 };
 
 static const switch_application_interface_t xml_application_interface = {

Modified: freeswitch/trunk/src/switch_core.c
==============================================================================
--- freeswitch/trunk/src/switch_core.c	(original)
+++ freeswitch/trunk/src/switch_core.c	Wed Jan 31 18:09:33 2007
@@ -59,6 +59,8 @@
 struct switch_media_bug {
 	switch_buffer_t *raw_write_buffer;
 	switch_buffer_t *raw_read_buffer;
+    switch_frame_t *replace_frame_in;
+    switch_frame_t *replace_frame_out;
 	switch_media_bug_callback_t callback;
 	switch_mutex_t *read_mutex;
 	switch_mutex_t *write_mutex;
@@ -176,6 +178,17 @@
 	switch_buffer_destroy(&bug->raw_write_buffer);
 }
 
+
+SWITCH_DECLARE(switch_frame_t *) switch_core_media_bug_get_replace_frame(switch_media_bug_t *bug)
+{
+    return bug->replace_frame_in;
+}
+
+SWITCH_DECLARE(void) switch_core_media_bug_set_replace_frame(switch_media_bug_t *bug, switch_frame_t *frame)
+{
+    bug->replace_frame_out = frame;
+}
+
 SWITCH_DECLARE(void *) switch_core_media_bug_get_user_data(switch_media_bug_t *bug)
 {
 	return bug->user_data;
@@ -277,9 +290,21 @@
 														  switch_media_bug_t **new_bug)
 
 {
-	switch_media_bug_t *bug;
+	switch_media_bug_t *bug, *bp;
 	switch_size_t bytes;
 
+    if (flags & SMBF_WRITE_REPLACE) {
+        switch_thread_rwlock_wrlock(session->bug_rwlock);
+        for (bp = session->bugs; bp; bp = bp->next) {
+            if (switch_test_flag(bp, SMBF_WRITE_REPLACE)) {
+                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Only one bug of this type allowed!\n");
+                switch_thread_rwlock_unlock(session->bug_rwlock);
+                return SWITCH_STATUS_GENERR;
+            }
+        }
+        switch_thread_rwlock_unlock(session->bug_rwlock);
+    }
+
 	if (!(bug = switch_core_session_alloc(session, sizeof(*bug)))) {
 		return SWITCH_STATUS_MEMERR;
 	}
@@ -2087,6 +2112,7 @@
 	switch_status_t status = SWITCH_STATUS_FALSE;
 
 	if (session->endpoint_interface->io_routines->write_frame) {
+
 		if ((status =
 			 session->endpoint_interface->io_routines->write_frame(session, frame, timeout, flags,
 																   stream_id)) == SWITCH_STATUS_SUCCESS) {
@@ -2230,15 +2256,25 @@
 					if (bp->callback) {
 						bp->callback(bp, bp->user_data, SWITCH_ABC_TYPE_WRITE);
 					}
+				} else if (switch_test_flag(bp, SMBF_WRITE_REPLACE)) {
+                    do_bugs = 0;
+					if (bp->callback) {
+                        bp->replace_frame_in = frame;
+                        bp->replace_frame_out = NULL;
+						bp->callback(bp, bp->user_data, SWITCH_ABC_TYPE_WRITE_REPLACE);
+                        write_frame = bp->replace_frame_out;
+					}
 				}
 			}
 			switch_thread_rwlock_unlock(session->bug_rwlock);
 		}
+
 		if (do_bugs) {
-			do_write = 1;
-			write_frame = frame;
-			goto done;
+            do_write = 1;
+            write_frame = frame;
+            goto done;
 		}
+
 		if (session->write_codec) {
 			if (write_frame->datalen == session->write_codec->implementation->bytes_per_frame) {
 				perfect = TRUE;

Modified: freeswitch/trunk/src/switch_ivr.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr.c	(original)
+++ freeswitch/trunk/src/switch_ivr.c	Wed Jan 31 18:09:33 2007
@@ -563,6 +563,7 @@
 		}
 		break;
 	case SWITCH_ABC_TYPE_WRITE:
+    default:
 		break;
 	}
 }
@@ -787,6 +788,7 @@
 		}
 		break;
 	case SWITCH_ABC_TYPE_WRITE:
+    default:
 		break;
 	}
 }



More information about the Freeswitch-svn mailing list