[asterisk-commits] dlee: branch dlee/ari-async-bridge r395885 - /team/dlee/ari-async-bridge/res/...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Jul 31 11:12:59 CDT 2013


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(




More information about the asterisk-commits mailing list