[asterisk-commits] jrose: branch group/bridge_construction r382553 - in /team/group/bridge_const...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Mar 6 17:44:21 CST 2013


Author: jrose
Date: Wed Mar  6 17:44:16 2013
New Revision: 382553

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=382553
Log:
merge revisions 382551-382552 from team/jrose/bridge_projects
Bridging Roles and holding bridge/app_bridgewait usage of bridging roles

(issue ASTERISK-20905)
Review: https://reviewboard.asterisk.org/r/2360/

Added:
    team/group/bridge_construction/apps/app_bridgewait.c
      - copied unchanged from r382551, team/jrose/bridge_projects/apps/app_bridgewait.c
    team/group/bridge_construction/bridges/bridge_holding.c
      - copied unchanged from r382551, team/jrose/bridge_projects/bridges/bridge_holding.c
    team/group/bridge_construction/include/asterisk/bridging_roles.h
      - copied unchanged from r382551, team/jrose/bridge_projects/include/asterisk/bridging_roles.h
    team/group/bridge_construction/main/bridging_roles.c
      - copied unchanged from r382551, team/jrose/bridge_projects/main/bridging_roles.c
Modified:
    team/group/bridge_construction/include/asterisk/bridging.h
    team/group/bridge_construction/main/bridging.c

Modified: team/group/bridge_construction/include/asterisk/bridging.h
URL: http://svnview.digium.com/svn/asterisk/team/group/bridge_construction/include/asterisk/bridging.h?view=diff&rev=382553&r1=382552&r2=382553
==============================================================================
--- team/group/bridge_construction/include/asterisk/bridging.h (original)
+++ team/group/bridge_construction/include/asterisk/bridging.h Wed Mar  6 17:44:16 2013
@@ -63,10 +63,13 @@
 #endif
 
 #include "asterisk/bridging_features.h"
+#include "asterisk/bridging_roles.h"
 #include "asterisk/dsp.h"
 
 /*! \brief Capabilities for a bridge technology */
 enum ast_bridge_capability {
+	/*! Bridge technology can service calls on hold */
+	AST_BRIDGE_CAPABILITY_HOLDING = (1 << 0),
 	/*! Bridge should natively bridge two channels if possible */
 	AST_BRIDGE_CAPABILITY_NATIVE = (1 << 1),
 	/*! Bridge is only capable of mixing 2 channels */
@@ -157,8 +160,14 @@
 	/*! Technology optimization parameters used by bridging technologies capable of
 	 *  optimizing based upon talk detection. */
 	struct ast_bridge_tech_optimizations tech_args;
+	/*! Copy of read format used by chan before join */
+	struct ast_format read_format;
+	/*! Copy of write format used by chan before join */
+	struct ast_format write_format;
 	/*! Call ID associated with bridge channel */
 	struct ast_callid *callid;
+	/*! A clone of the roles living on chan when the bridge channel joins the bridge. This may require some opacification */
+	struct bridge_roles_datastore *bridge_roles;
 	/*! Linked list information */
 	AST_LIST_ENTRY(ast_bridge_channel) entry;
 	/*! Queue of actions to perform on the channel. */
@@ -634,6 +643,14 @@
 int ast_bridge_channel_queue_action(struct ast_bridge_channel *bridge_channel, struct ast_frame *action);
 
 /*!
+ * \brief Restore the formats of a bridge channel's channel to how they were before bridge_channel_join
+ * \since 12.0.0
+ *
+ * \param bridge_channel Channel to restore
+ */
+void ast_bridge_channel_restore_formats(struct ast_bridge_channel *bridge_channel);
+
+/*!
  * \brief Adjust the internal mixing sample rate of a bridge
  * used during multimix mode.
  *

Modified: team/group/bridge_construction/main/bridging.c
URL: http://svnview.digium.com/svn/asterisk/team/group/bridge_construction/main/bridging.c?view=diff&rev=382553&r1=382552&r2=382553
==============================================================================
--- team/group/bridge_construction/main/bridging.c (original)
+++ team/group/bridge_construction/main/bridging.c Wed Mar  6 17:44:16 2013
@@ -209,6 +209,31 @@
 	ast_bridge_channel_poke(bridge_channel);
 	ao2_unlock(bridge_channel);
 	return 0;
+}
+
+void ast_bridge_channel_restore_formats(struct ast_bridge_channel *bridge_channel)
+{
+	/* Restore original formats of the channel as they came in */
+	if (ast_format_cmp(ast_channel_readformat(bridge_channel->chan), &bridge_channel->read_format) == AST_FORMAT_CMP_NOT_EQUAL) {
+		ast_debug(1, "Bridge is returning bridge channel %p(%s) to read format %s\n",
+			bridge_channel, ast_channel_name(bridge_channel->chan),
+			ast_getformatname(&bridge_channel->read_format));
+		if (ast_set_read_format(bridge_channel->chan, &bridge_channel->read_format)) {
+			ast_debug(1, "Bridge failed to return bridge channel %p(%s) to read format %s\n",
+				bridge_channel, ast_channel_name(bridge_channel->chan),
+				ast_getformatname(&bridge_channel->read_format));
+		}
+	}
+	if (ast_format_cmp(ast_channel_writeformat(bridge_channel->chan), &bridge_channel->write_format) == AST_FORMAT_CMP_NOT_EQUAL) {
+		ast_debug(1, "Bridge is returning bridge channel %p(%s) to write format %s\n",
+			bridge_channel, ast_channel_name(bridge_channel->chan),
+			ast_getformatname(&bridge_channel->write_format));
+		if (ast_set_write_format(bridge_channel->chan, &bridge_channel->write_format)) {
+			ast_debug(1, "Bridge failed to return bridge channel %p(%s) to write format %s\n",
+				bridge_channel, ast_channel_name(bridge_channel->chan),
+				ast_getformatname(&bridge_channel->write_format));
+		}
+	}
 }
 
 void ast_bridge_poke(struct ast_bridge *bridge)
@@ -1624,10 +1649,9 @@
 static void bridge_channel_join(struct ast_bridge_channel *bridge_channel)
 {
 	struct ast_frame *action;
-	struct ast_format formats[2];
-
-	ast_format_copy(&formats[0], ast_channel_readformat(bridge_channel->chan));
-	ast_format_copy(&formats[1], ast_channel_writeformat(bridge_channel->chan));
+
+	ast_format_copy(&bridge_channel->read_format, ast_channel_readformat(bridge_channel->chan));
+	ast_format_copy(&bridge_channel->write_format, ast_channel_writeformat(bridge_channel->chan));
 
 	ast_debug(1, "Joining bridge channel %p(%s) to bridge %p\n",
 		bridge_channel, ast_channel_name(bridge_channel->chan), bridge_channel->bridge);
@@ -1742,32 +1766,14 @@
 	}
 	ast_channel_internal_bridge_set(bridge_channel->chan, NULL);
 
-	/* Restore original formats of the channel as they came in */
-	if (ast_format_cmp(ast_channel_readformat(bridge_channel->chan), &formats[0]) == AST_FORMAT_CMP_NOT_EQUAL) {
-		ast_debug(1, "Bridge is returning bridge channel %p(%s) to read format %s\n",
-			bridge_channel, ast_channel_name(bridge_channel->chan),
-			ast_getformatname(&formats[0]));
-		if (ast_set_read_format(bridge_channel->chan, &formats[0])) {
-			ast_debug(1, "Bridge failed to return bridge channel %p(%s) to read format %s\n",
-				bridge_channel, ast_channel_name(bridge_channel->chan),
-				ast_getformatname(&formats[0]));
-		}
-	}
-	if (ast_format_cmp(ast_channel_writeformat(bridge_channel->chan), &formats[1]) == AST_FORMAT_CMP_NOT_EQUAL) {
-		ast_debug(1, "Bridge is returning bridge channel %p(%s) to write format %s\n",
-			bridge_channel, ast_channel_name(bridge_channel->chan),
-			ast_getformatname(&formats[1]));
-		if (ast_set_write_format(bridge_channel->chan, &formats[1])) {
-			ast_debug(1, "Bridge failed to return bridge channel %p(%s) to write format %s\n",
-				bridge_channel, ast_channel_name(bridge_channel->chan),
-				ast_getformatname(&formats[1]));
-		}
-	}
+	ast_bridge_channel_restore_formats(bridge_channel);
 }
 
 static void bridge_channel_destroy(void *obj)
 {
 	struct ast_bridge_channel *bridge_channel = obj;
+
+	ast_bridge_channel_clear_roles(bridge_channel);
 
 	if (bridge_channel->callid) {
 		bridge_channel->callid = ast_callid_unref(bridge_channel->callid);
@@ -1777,6 +1783,7 @@
 		ao2_ref(bridge_channel->bridge, -1);
 		bridge_channel->bridge = NULL;
 	}
+
 	/* Destroy elements of the bridge channel structure and the bridge channel structure itself */
 	ast_cond_destroy(&bridge_channel->cond);
 }
@@ -2106,6 +2113,14 @@
 	bridge_channel->swap = swap;
 	bridge_channel->features = features;
 
+	if (ast_bridge_channel_establish_roles(bridge_channel)) {
+		/* A bridge channel should not be allowed to join if its roles couldn't be copied properly. */
+		state = AST_BRIDGE_CHANNEL_STATE_HANGUP;
+		ast_channel_internal_bridge_channel_set(chan, NULL);
+		ao2_ref(bridge_channel, -1);
+		goto join_exit;
+	}
+
 	bridge_channel_join(bridge_channel);
 	state = bridge_channel->state;
 
@@ -2197,6 +2212,11 @@
 	bridge_channel->depart_wait = independent ? 0 : 1;
 	bridge_channel->callid = ast_read_threadstorage_callid();
 
+	if (ast_bridge_channel_establish_roles(bridge_channel)) {
+		res = -1;
+		goto bridge_impart_cleanup;
+	}
+
 	/* Actually create the thread that will handle the channel */
 	if (independent) {
 		/* Independently imparted channels cannot have a PBX. */
@@ -2211,6 +2231,8 @@
 		res = ast_pthread_create(&bridge_channel->thread, NULL,
 			bridge_channel_depart_thread, bridge_channel);
 	}
+
+bridge_impart_cleanup:
 	if (res) {
 		/* cleanup */
 		ast_channel_internal_bridge_channel_set(chan, NULL);




More information about the asterisk-commits mailing list