[svn-commits] file: branch file/bridging r65489 - in /team/file/bridging: bridges/ include/...

svn-commits at lists.digium.com svn-commits at lists.digium.com
Tue May 22 10:31:37 MST 2007


Author: file
Date: Tue May 22 12:31:37 2007
New Revision: 65489

URL: http://svn.digium.com/view/asterisk?view=rev&rev=65489
Log:
Add support for having the bridging core handle formats. The bridge technology specifies what formats it can handle and the bridging core will try to make a joining channel obey it. If that fails then the joining channel will be denied.

Modified:
    team/file/bridging/bridges/bridge_simple.c
    team/file/bridging/bridges/bridge_zaptel.c
    team/file/bridging/include/asterisk/bridging.h
    team/file/bridging/main/bridging.c

Modified: team/file/bridging/bridges/bridge_simple.c
URL: http://svn.digium.com/view/asterisk/team/file/bridging/bridges/bridge_simple.c?view=diff&rev=65489&r1=65488&r2=65489
==============================================================================
--- team/file/bridging/bridges/bridge_simple.c (original)
+++ team/file/bridging/bridges/bridge_simple.c Tue May 22 12:31:37 2007
@@ -61,6 +61,7 @@
 static struct ast_bridge_technology simple_bridge = {
 	.name = "simple_bridge",
 	.capabilities = AST_BRIDGE_CAPABILITY_1TO1MIX | AST_BRIDGE_CAPABILITY_NATIVE,
+	.formats = AST_FORMAT_AUDIO_MASK | AST_FORMAT_VIDEO_MASK | AST_FORMAT_TEXT_MASK,
 	.write = simple_bridge_write,
 };
 

Modified: team/file/bridging/bridges/bridge_zaptel.c
URL: http://svn.digium.com/view/asterisk/team/file/bridging/bridges/bridge_zaptel.c?view=diff&rev=65489&r1=65488&r2=65489
==============================================================================
--- team/file/bridging/bridges/bridge_zaptel.c (original)
+++ team/file/bridging/bridges/bridge_zaptel.c Tue May 22 12:31:37 2007
@@ -197,6 +197,7 @@
 static struct ast_bridge_technology zaptel_bridge = {
 	.name = "zaptel_bridge",
 	.capabilities = AST_BRIDGE_CAPABILITY_MULTIMIX,
+	.formats = AST_FORMAT_SLINEAR,
 	.create = zaptel_bridge_create,
 	.destroy = zaptel_bridge_destroy,
 	.join = zaptel_bridge_join,

Modified: team/file/bridging/include/asterisk/bridging.h
URL: http://svn.digium.com/view/asterisk/team/file/bridging/include/asterisk/bridging.h?view=diff&rev=65489&r1=65488&r2=65489
==============================================================================
--- team/file/bridging/include/asterisk/bridging.h (original)
+++ team/file/bridging/include/asterisk/bridging.h Tue May 22 12:31:37 2007
@@ -66,6 +66,7 @@
 	int (*leave)(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel);                           /*! Callback for when a channel leaves a bridge */
 	int (*write)(struct ast_bridge *bridge, struct ast_bridge_channel *bridged_channel, struct ast_frame *frame); /*! Callback for writing a frame to the bridge */
 	int (*signal)(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel);                          /*! Callback for a bridge channel thread signal */
+	int formats;                                                                                                  /*! Formats this bridge technology can support */
 	AST_RWLIST_ENTRY(ast_bridge_technology) list;                                                                 /*! Linked list information */
 };
 

Modified: team/file/bridging/main/bridging.c
URL: http://svn.digium.com/view/asterisk/team/file/bridging/main/bridging.c?view=diff&rev=65489&r1=65488&r2=65489
==============================================================================
--- team/file/bridging/main/bridging.c (original)
+++ team/file/bridging/main/bridging.c Tue May 22 12:31:37 2007
@@ -329,6 +329,45 @@
 /*! \brief Join a channel to a bridge and handle anything the bridge may want us to do */
 static enum ast_bridge_channel_phase bridge_channel_join(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel)
 {
+	int formats[2] = {bridge_channel->chan->readformat, bridge_channel->chan->writeformat};
+
+	/* Are the formats currently in use something this bridge can handle? */
+	if (!(bridge->technology->formats & formats[0])) {
+		int best_format = ast_best_codec(bridge->technology->formats);
+
+		/* Read format is a no go... */
+		if (option_debug) {
+			char codec_buf[512];
+			ast_getformatname_multiple(codec_buf, sizeof(codec_buf), bridge->technology->formats);
+			ast_log(LOG_DEBUG, "Bridge technology %s wants to read any of formats %s(%d) but channel has %s(%d)\n", bridge->technology->name, codec_buf, bridge->technology->formats, ast_getformatname(formats[0]), formats[0]);
+		}
+		/* Switch read format to the best one chosen */
+		if (ast_set_read_format(bridge_channel->chan, best_format)) {
+			ast_log(LOG_WARNING, "Failed to set channel %s to read format %s(%d)\n", bridge_channel->chan->name, ast_getformatname(best_format), best_format);
+			return -1;
+		}
+		if (option_debug)
+			ast_log(LOG_DEBUG, "Bridge %p put channel %s into read format %s(%d)\n", bridge, bridge_channel->chan->name, ast_getformatname(best_format), best_format);
+	}
+
+	if (!(bridge->technology->formats & formats[1])) {
+		int best_format = ast_best_codec(bridge->technology->formats);
+
+		/* Write format is a no go... */
+		if (option_debug) {
+			char codec_buf[512];
+			ast_getformatname_multiple(codec_buf, sizeof(codec_buf), bridge->technology->formats);
+			ast_log(LOG_DEBUG, "Bridge technology %s wants to write any of formats %s(%d) but channel has %s(%d)\n", bridge->technology->name, codec_buf, bridge->technology->formats, ast_getformatname(formats[1]), formats[1]);
+		}
+		/* Switch write format to the best one chosen */
+		if (ast_set_write_format(bridge_channel->chan, best_format)) {
+			ast_log(LOG_WARNING, "Failed to set channel %s to write format %s(%d)\n", bridge_channel->chan->name, ast_getformatname(best_format), best_format);
+			return -1;
+		}
+		if (option_debug)
+			ast_log(LOG_DEBUG, "Bridge %p put channel %s into write format %s(%d)\n", bridge, bridge_channel->chan->name, ast_getformatname(best_format), best_format);
+	}
+
 	/* Before we actually become part of this bridge make sure we are in the signalling wait phase */
 	bridge_channel->phase = AST_BRIDGE_CHANNEL_PHASE_WAIT;
 
@@ -394,6 +433,21 @@
 	/* Remove ourselves from the bridge */
 	AST_LIST_REMOVE(&bridge->channels, bridge_channel, list);
 
+	/* Restore original formats if need be */
+	if (bridge_channel->chan->readformat != formats[0]) {
+		if (option_debug)
+			ast_log(LOG_DEBUG, "Bridge is returning %p to read format %s(%d)\n", bridge_channel, ast_getformatname(formats[0]), formats[0]);
+		if (ast_set_read_format(bridge_channel->chan, formats[0]))
+			ast_log(LOG_WARNING, "Failed to return channel %s to read format %s(%d)\n", bridge_channel->chan->name, ast_getformatname(formats[0]), formats[0]);
+	}
+
+	if (bridge_channel->chan->writeformat != formats[0]) {
+		if (option_debug)
+			ast_log(LOG_DEBUG, "Bridge is returning %p to write format %s(%d)\n", bridge_channel, ast_getformatname(formats[1]), formats[1]);
+		if (ast_set_write_format(bridge_channel->chan, formats[1]))
+			ast_log(LOG_WARNING, "Failed to return channel %s to write format %s(%d)\n", bridge_channel->chan->name, ast_getformatname(formats[1]), formats[1]);
+	}
+
 	return bridge_channel->phase;
 }
 



More information about the svn-commits mailing list