[Freeswitch-svn] [commit] r5776 - freeswitch/trunk/src/mod/applications/mod_fifo

Freeswitch SVN anthm at freeswitch.org
Mon Oct 1 20:03:53 EDT 2007


Author: anthm
Date: Mon Oct  1 20:03:53 2007
New Revision: 5776

Modified:
   freeswitch/trunk/src/mod/applications/mod_fifo/Makefile
   freeswitch/trunk/src/mod/applications/mod_fifo/mod_fifo.c

Log:
add a few things to mod_fifo

Modified: freeswitch/trunk/src/mod/applications/mod_fifo/Makefile
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_fifo/Makefile	(original)
+++ freeswitch/trunk/src/mod/applications/mod_fifo/Makefile	Mon Oct  1 20:03:53 2007
@@ -1,2 +1,2 @@
 BASE=../../../..
-include /usr/src/freeswitch.trunk/build/modmake.rules
+include $(BASE)/build/modmake.rules

Modified: freeswitch/trunk/src/mod/applications/mod_fifo/mod_fifo.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_fifo/mod_fifo.c	(original)
+++ freeswitch/trunk/src/mod/applications/mod_fifo/mod_fifo.c	Mon Oct  1 20:03:53 2007
@@ -24,8 +24,6 @@
  * Contributor(s):
  * 
  * Anthony Minessale II <anthmct at yahoo.com>
- * Neal Horman <neal at wanlink dot com>
- *
  *
  * mod_fifo.c -- FIFO
  *
@@ -36,20 +34,66 @@
 SWITCH_MODULE_LOAD_FUNCTION(mod_fifo_load);
 SWITCH_MODULE_DEFINITION(mod_fifo, mod_fifo_load, mod_fifo_shutdown, NULL);
 
+
+
+static switch_status_t on_dtmf(switch_core_session_t *session, void *input, switch_input_type_t itype, void *buf, unsigned int buflen)
+{
+    switch_core_session_t *bleg;
+    switch_channel_t *channel;
+
+    bleg = (switch_core_session_t *) buf;
+
+	switch (itype) {
+	case SWITCH_INPUT_TYPE_DTMF:
+        {
+            char *dtmf = (char *) input;
+            if (*dtmf == '*') {
+                channel = switch_core_session_get_channel(session);
+                if (switch_channel_test_flag(channel, CF_ORIGINATOR)) {
+                    channel = switch_core_session_get_channel(bleg);
+                    switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING);
+                    return SWITCH_STATUS_BREAK;
+                }
+            }
+        }
+		break;
+	default:
+		break;
+	}
+
+	return SWITCH_STATUS_SUCCESS;
+}
+
+
+#define check_string(s) if (!switch_strlen_zero(s) && !strcasecmp(s, "undef")) { s = NULL; }
+
+
+static switch_status_t read_frame_callback(switch_core_session_t *session, switch_frame_t *frame, void *user_data)
+{
+    switch_queue_t *fifo = (switch_queue_t *) user_data;
+    if (switch_queue_size(fifo)) {
+        return SWITCH_STATUS_FALSE;
+    }
+    return SWITCH_STATUS_SUCCESS;
+}
+
 static struct {
     switch_hash_t *fifo_hash;
     switch_memory_pool_t *pool;
 } globals;
 
 #define FIFO_DESC "Fifo for stacking parked calls."
-#define FIFO_USAGE "<fifo name> [in <file> | out [nowait]]"
+#define FIFO_USAGE "<fifo name> [in [<announce file>|undef] [<music file>|undef] | out [wait|nowait] [<announce file>|undef] [<music file>|undef]]"
 SWITCH_STANDARD_APP(fifo_function)
 {
     int argc;
-    char *mydata = NULL, *argv[4] = { 0 };
+    char *mydata = NULL, *argv[5] = { 0 };
     switch_queue_t *fifo;
     switch_channel_t *channel;
     int nowait = 0;
+    char *moh = NULL;
+    char *announce = NULL;
+
 
     if (switch_strlen_zero(data)) {
         switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No Args\n");
@@ -70,7 +114,8 @@
     }
 
     channel = switch_core_session_get_channel(session);
-
+    moh = switch_channel_get_variable(channel, "fifo_music");
+    announce = switch_channel_get_variable(channel, "fifo_announce");
 
     if (argc > 2) {
         nowait = !strcasecmp(argv[2], "nowait");
@@ -78,22 +123,42 @@
 
     if (!strcasecmp(argv[1], "in")) {
         char *uuid = strdup(switch_core_session_get_uuid(session));
-        char *moh = NULL;
 
         switch_channel_answer(channel);
 
-        moh = switch_channel_get_variable(channel, "fifo_music");
-
         if (argc > 2) {
-            moh = argv[2];
+            announce = argv[2];
+        }
+
+        if (argc > 3) {
+            moh = argv[3];
         }
 
+        check_string(announce);
+        check_string(moh);
+
+        
         if (moh) {
             switch_ivr_broadcast(uuid, moh, SMF_LOOP | SMF_ECHO_ALEG);
         }
-
+        
+        switch_channel_set_flag(channel, CF_TAGGED);
+        
         switch_queue_push(fifo, uuid);
         switch_ivr_park(session, NULL);
+        
+        if (switch_channel_ready(channel)) {
+            if (announce) {
+                switch_ivr_play_file(session, NULL, announce, NULL);
+            }
+        }
+
+        switch_channel_clear_flag(channel, CF_TAGGED);
+
+        if (switch_channel_ready(channel)) {
+            switch_channel_set_state(channel, CS_HIBERNATE);
+        }
+        
         return;
     } else if (!strcasecmp(argv[1], "out")) {
         void *pop;
@@ -102,12 +167,31 @@
         char *uuid;
         int done = 0;
         switch_core_session_t *other_session;
+        switch_input_args_t args = { 0 };
 
+        if (argc > 3) {
+            announce = argv[3];
+        }
+
+        if (argc > 4) {
+            moh = argv[4];
+        }
+        
+        check_string(announce);
+        check_string(moh);
+                            
         if (!nowait) {
             switch_channel_answer(channel);
         }
+        
 
         for (;;) {
+            if (moh) {
+                args.read_frame_callback = read_frame_callback;
+                args.user_data = fifo;
+                switch_ivr_play_file(session, NULL, moh, &args);
+            }
+
             if (switch_queue_trypop(fifo, &pop) != SWITCH_STATUS_SUCCESS) {
                 if (nowait) {
                     return;
@@ -126,13 +210,38 @@
 
             if ((other_session = switch_core_session_locate(uuid))) {
                 switch_channel_t *other_channel = switch_core_session_get_channel(other_session);
+                switch_caller_profile_t *cloned_profile;
+                
+                if (announce) {
+                    switch_ivr_play_file(session, NULL, announce, NULL);
+                } else {
+                    switch_ivr_sleep(session, 500);
+                }
                 switch_channel_clear_flag(other_channel, CF_CONTROLLED);
                 switch_channel_clear_flag(other_channel, CF_BROADCAST);
                 switch_channel_set_flag(other_channel, CF_BREAK);
                 switch_core_session_kill_channel(other_session, SWITCH_SIG_BREAK);
-                switch_ivr_multi_threaded_bridge(session, other_session, NULL, NULL, NULL);
+                while (switch_channel_test_flag(other_channel, CF_TAGGED)) {
+                    status = switch_core_session_read_frame(session, &read_frame, -1, 0);
+                    if (!SWITCH_READ_ACCEPTABLE(status)) {
+                        break;
+                    }
+                }
+
+                switch_channel_answer(channel);
+				cloned_profile = switch_caller_profile_clone(session, switch_channel_get_caller_profile(channel));
+                assert(cloned_profile);
+                switch_channel_set_originator_caller_profile(other_channel, cloned_profile);
+
+				cloned_profile = switch_caller_profile_clone(other_session, switch_channel_get_caller_profile(channel));
+                assert(cloned_profile);
+                switch_channel_set_originatee_caller_profile(channel, cloned_profile);
+				
+                switch_ivr_multi_threaded_bridge(session, other_session, on_dtmf, other_session, session);
                 switch_core_session_rwunlock(other_session);
-                done = 1;
+                if (nowait) {
+                    done = 1;
+                }
             }
 
             switch_safe_free(uuid);



More information about the Freeswitch-svn mailing list