Author: dlee
Date: Wed Jul 31 11:12:57 2013
New Revision: 395885

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=395885
Log:
Hangup works while in an async bridge

Modified:
    team/dlee/ari-async-bridge/res/stasis/control.c

Modified: team/dlee/ari-async-bridge/res/stasis/control.c
URL: 
http://svnview.digium.com/svn/asterisk/team/dlee/ari-async-bridge/res/stasis/control.c?view=diff&rev=395885&r1=395884&r2=395885
==============================================================================
--- team/dlee/ari-async-bridge/res/stasis/control.c (original)
+++ team/dlee/ari-async-bridge/res/stasis/control.c Wed Jul 31 11:12:57 2013
@@ -33,6 +33,7 @@
 #include "control.h"
 #include "asterisk/dial.h"
 #include "asterisk/bridge.h"
+#include "asterisk/bridge_after.h"
 #include "asterisk/bridge_basic.h"
 #include "asterisk/bridge_features.h"
 #include "asterisk/frame.h"
@@ -101,11 +102,20 @@
        return control;
 }
 
+static void *noop_cb(struct stasis_app_control *control,
+       struct ast_channel *chan, void *data)
+{
+       return NULL;
+}
+
+
 static struct stasis_app_command *exec_command(
        struct stasis_app_control *control, stasis_app_command_cb command_fn,
        void *data)
 {
        RAII_VAR(struct stasis_app_command *, command, NULL, ao2_cleanup);
+
+       command_fn = command_fn ? : noop_cb;
 
        command = command_create(command_fn, data);
 
@@ -453,12 +463,56 @@
        return control->bridge;
 }
 
+
+static void bridge_after_cb(struct ast_channel *chan, void *data)
+{
+       struct stasis_app_control *control = data;
+
+       ast_debug(3, "%s, %s: Channel leaving bridge\n",
+               ast_channel_uniqueid(chan), control->bridge->uniqueid);
+
+       ast_assert(chan == control->channel);
+
+       ast_channel_pbx_set(control->channel, control->pbx);
+       control->pbx = NULL;
+
+       control->bridge = NULL;
+}
+
+static void bridge_after_cb_failed(enum ast_bridge_after_cb_reason reason,
+       void *data)
+{
+       struct stasis_app_control *control = data;
+
+       bridge_after_cb(control->channel, data);
+
+       ast_debug(3, "  reason: %s\n",
+               ast_bridge_after_cb_reason_string(reason));
+
+       /* Wakeup the command_queue loop */
+       exec_command(control, NULL, NULL);
+}
+
 void stasis_app_add_to_bridge(struct stasis_app_control *control,
        struct ast_bridge *bridge)
 {
        int res;
 
        if (!control || !bridge) {
+               return;
+       }
+
+       ast_assert(control->channel != NULL);
+
+       /* Depart whatever Stasis bridge we're currently in */
+       if (control->bridge) {
+               ast_bridge_depart(control->channel);
+       }
+
+       res = ast_bridge_set_after_callback(control->channel, bridge_after_cb,
+               bridge_after_cb_failed, control);
+       if (res != 0) {
+               ast_log(LOG_ERROR, "Error setting after-bridge callback\n");
                return;
        }
 
@@ -491,9 +545,9 @@
                return;
        }
 
+       ast_assert(control->channel != NULL);
+
        ast_bridge_depart(control->channel);
-       ast_channel_pbx_set(control->channel, control->pbx);
-       control->pbx = NULL;
 }
 
 const char *stasis_app_control_get_channel_id(


--
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

svn-commits mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/svn-commits

Reply via email to