[svn-commits] mmichelson: branch mmichelson/transfer r386457 - /team/mmichelson/transfer/main/

SVN commits to the Digium repositories svn-commits at lists.digium.com
Wed Apr 24 15:51:48 CDT 2013


Author: mmichelson
Date: Wed Apr 24 15:51:44 2013
New Revision: 386457

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=386457
Log:
Use signed linear as the format when requesting a local channel for whole-bridge blind transfers.

We use a file-scoped format_cap so we only have to allocate it once. It is initialized at startup.


Modified:
    team/mmichelson/transfer/main/bridging.c

Modified: team/mmichelson/transfer/main/bridging.c
URL: http://svnview.digium.com/svn/asterisk/team/mmichelson/transfer/main/bridging.c?view=diff&rev=386457&r1=386456&r2=386457
==============================================================================
--- team/mmichelson/transfer/main/bridging.c (original)
+++ team/mmichelson/transfer/main/bridging.c Wed Apr 24 15:51:44 2013
@@ -4248,14 +4248,35 @@
 	return channels;
 }
 
-/*!
- * \internal
- * \brief Accomplish a transfer by swapping a Local channel with an existing channel
- *
- * This, in a sense, blind transfers an entire bridge to an extension and context. It
- * works by creating a local channel to dial out and swapping the called local channel
- * with the transferring channel. By doing so, all participants in the bridge are
- * privy to the goings-on of the blind transfer.
+/*! Signed linear format capabilities structure that can be reused */
+static struct ast_format_cap *slin_cap;
+
+/*!
+ * \internal
+ * \brief Initialize reusable signed linear format cap
+ * \retval 0 Success
+ * \retval non-zero failure
+ */
+static int initialize_slin_cap(void)
+{
+	struct ast_format slin_format;
+
+	slin_cap = ast_format_cap_alloc_nolock();
+	if (!slin_cap) {
+		return -1;
+	}
+
+	ast_format_cap_set(slin_cap, ast_getformatbyname("slin", &slin_format));
+	return 0;
+}
+
+/*!
+ * \internal
+ * \brief Transfer an entire bridge to a specific destination.
+ *
+ * This creates a local channel to dial out and swaps the called local channel
+ * with the transferer channel. By doing so, all participants in the bridge are
+ * connected to the specified destination.
  *
  * While this means of transferring would work for both two-party and multi-party
  * bridges, this method is only used for multi-party bridges since this method would
@@ -4267,7 +4288,7 @@
  * \param context The destination context for the blind transfer
  * \return The success or failure of the operation
  */
-static enum ast_transfer_result local_channel_swap_transfer(struct ast_channel *transferer, 
+static enum ast_transfer_result blind_transfer_bridge(struct ast_channel *transferer, 
 		struct ast_bridge *bridge, const char *exten, const char *context)
 {
 	struct ast_channel *local;
@@ -4275,8 +4296,7 @@
 	int cause;
 
 	snprintf(chan_name, sizeof(chan_name), "%s@%s", exten, context);
-	local = ast_request("Local", ast_channel_nativeformats(transferer),
-			transferer, chan_name, &cause);
+	local = ast_request("Local", slin_cap, transferer, chan_name, &cause);
 	if (!local) {
 		return AST_BRIDGE_TRANSFER_FAIL;
 	}
@@ -4397,7 +4417,7 @@
 	}
 
 	if (do_bridge_transfer) {
-		return local_channel_swap_transfer(transferer, bridge, exten, context);
+		return blind_transfer_bridge(transferer, bridge, exten, context);
 	}
 
 	/* Reaching this portion means that we're dealing with a two-party bridge */
@@ -5034,6 +5054,11 @@
 		return -1;
 	}
 
+	if (initialize_slin_cap()) {
+		bridge_shutdown();
+		return -1;
+	}
+
 	ast_bridging_init_basic();
 
 /* BUGBUG need AMI action equivalents to the CLI commands. */




More information about the svn-commits mailing list