[asterisk-commits] file: branch file/bridging r65487 -
/team/file/bridging/bridges/bridge_zaptel.c
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Tue May 22 09:55:06 MST 2007
Author: file
Date: Tue May 22 11:55:06 2007
New Revision: 65487
URL: http://svn.digium.com/view/asterisk?view=rev&rev=65487
Log:
Add preliminary bridge_zaptel module. Doesn't actually do anything with frames written in yet or handle the signed linear requirement.
Added:
team/file/bridging/bridges/bridge_zaptel.c (with props)
Added: team/file/bridging/bridges/bridge_zaptel.c
URL: http://svn.digium.com/view/asterisk/team/file/bridging/bridges/bridge_zaptel.c?view=auto&rev=65487
==============================================================================
--- team/file/bridging/bridges/bridge_zaptel.c (added)
+++ team/file/bridging/bridges/bridge_zaptel.c Tue May 22 11:55:06 2007
@@ -1,0 +1,217 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2007, Digium, Inc.
+ *
+ * Joshua Colp <jcolp at digium.com>
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*! \file
+ *
+ * \brief Zaptel mixing bridge module
+ *
+ * \author Joshua Colp <jcolp at digium.com>
+ *
+ * \ingroup bridges
+ */
+
+/*** MODULEINFO
+ <depend>zaptel</depend>
+***/
+
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/fcntl.h>
+
+#include "asterisk/zapata.h"
+
+#include "asterisk/module.h"
+#include "asterisk/channel.h"
+#include "asterisk/bridging.h"
+#include "asterisk/frame.h"
+#include "asterisk/lock.h"
+#include "asterisk/linkedlists.h"
+
+struct zaptel_mixer {
+ int fd; /*!< File descriptor for the pseudo channel */
+ int conf; /*!< Zaptel conference number */
+ AST_LIST_HEAD_NOLOCK(, zaptel_mixer_channel) channels;
+};
+
+struct zaptel_mixer_channel {
+ int fd; /*!< File descriptor for our listening/talking channel */
+ AST_LIST_ENTRY(zaptel_mixer_channel) list;
+};
+
+static int zaptel_bridge_create(struct ast_bridge *bridge)
+{
+ struct zaptel_mixer *zm = NULL;
+ struct zt_confinfo ztc = { 0, };
+
+ /* Create a new zaptel-specific mixer structure */
+ if (!(zm = ast_calloc(1, sizeof(*zm))))
+ return -1;
+
+ /* Create a new zaptel pseudo channel to use for mixing */
+ if ((zm->fd = open("/dev/zap/pseudo", O_RDWR)) < 0) {
+ free(zm);
+ return -1;
+ }
+
+ /* Setup zaptel conference parameters and apply them */
+ ztc.confno = -1;
+ ztc.confmode = ZT_CONF_CONFANN | ZT_CONF_CONFANNMON;
+ if (ioctl(zm->fd, ZT_SETCONF, &zm)) {
+ close(zm->fd);
+ free(zm);
+ return -1;
+ }
+ zm->conf = ztc.confno;
+
+ /* All parameters are setup and the zaptel mixer is up... link it to the bridge */
+ bridge->bridge_pvt = zm;
+
+ return 0;
+}
+
+static int zaptel_bridge_destroy(struct ast_bridge *bridge)
+{
+ struct zaptel_mixer *zm = bridge->bridge_pvt;
+
+ /* Drop the zaptel conference room */
+ close(zm->fd);
+
+ /* Free our memory and go on our way... */
+ free(zm);
+
+ return 0;
+}
+
+static int zaptel_bridge_join(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel)
+{
+ struct zaptel_mixer *zm = bridge->bridge_pvt;
+ struct zaptel_mixer_channel *zmc = NULL;
+ struct zt_confinfo ztc = { 0, };
+ int flags = 0, x = 1;
+ ZT_BUFFERINFO bi;
+
+ /* Boom! Need another structure */
+ if (!(zmc = ast_calloc(1, sizeof(*zmc))))
+ return -1;
+
+ /* Attempt to open the pseudo channel */
+ if ((zmc->fd = open("/dev/zap/pseudo", O_RDWR)) < 0) {
+ free(zmc);
+ return -1;
+ }
+
+ /* Switch to non-blocking */
+ if (((flags = fcntl(zmc->fd, F_GETFL)) < 0) || (fcntl(zmc->fd, F_SETFL, flags | O_NONBLOCK))) {
+ close(zmc->fd);
+ free(zmc);
+ return -1;
+ }
+
+ /* Setup buffering parameters */
+ memset(&bi, 0, sizeof(bi));
+ bi.bufsize = 160;
+ bi.txbufpolicy = ZT_POLICY_IMMEDIATE;
+ bi.rxbufpolicy = ZT_POLICY_IMMEDIATE;
+ bi.numbufs = 32;
+
+ /* Apply the above */
+ if (ioctl(zmc->fd, ZT_SET_BUFINFO, &bi)) {
+ close(zmc->fd);
+ free(zmc);
+ return -1;
+ }
+
+ /* Set linear mode */
+ if (ioctl(zmc->fd, ZT_SETLINEAR, &x)) {
+ close(zmc->fd);
+ free(zmc);
+ return -1;
+ }
+
+ /* Add us to the conference */
+ ztc.confno = zm->conf;
+ ztc.confmode = ZT_CONF_CONF | ZT_CONF_TALKER | ZT_CONF_LISTENER;
+ if (ioctl(zmc->fd, ZT_SETCONF, &ztc)) {
+ close(zmc->fd);
+ free(zmc);
+ return -1;
+ }
+
+ /* Add ourselves to the zaptel mixer structure */
+ AST_LIST_INSERT_TAIL(&zm->channels, zmc, list);
+
+ /* We "should" be a go */
+ bridge_channel->bridge_pvt = zmc;
+
+ return 0;
+}
+
+static int zaptel_bridge_leave(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel)
+{
+ struct zaptel_mixer *zm = bridge->bridge_pvt;
+ struct zaptel_mixer_channel *zmc = bridge_channel->bridge_pvt;
+ struct zt_confinfo ztc = { 0, };
+
+ /* Take ourselves out of the zaptel mixer structure */
+ AST_LIST_REMOVE(&zm->channels, zmc, list);
+
+ /* Take ourselves out of the conference */
+ ioctl(zmc->fd, ZT_SETCONF, &ztc);
+
+ /* Close down the open file descriptor */
+ close(zmc->fd);
+
+ /* Free the memory and go on our merry way */
+ free(zmc);
+
+ return 0;
+}
+
+static int zaptel_bridge_write(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel, struct ast_frame *frame)
+{
+ return 0;
+}
+
+static struct ast_bridge_technology zaptel_bridge = {
+ .name = "zaptel_bridge",
+ .capabilities = AST_BRIDGE_CAPABILITY_MULTIMIX,
+ .create = zaptel_bridge_create,
+ .destroy = zaptel_bridge_destroy,
+ .join = zaptel_bridge_join,
+ .leave = zaptel_bridge_leave,
+ .write = zaptel_bridge_write,
+};
+
+static int unload_module(void)
+{
+ return ast_bridge_technology_unregister(&zaptel_bridge);
+}
+
+static int load_module(void)
+{
+ return ast_bridge_technology_register(&zaptel_bridge);
+}
+
+AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Zaptel mixing bridge module");
Propchange: team/file/bridging/bridges/bridge_zaptel.c
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: team/file/bridging/bridges/bridge_zaptel.c
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: team/file/bridging/bridges/bridge_zaptel.c
------------------------------------------------------------------------------
svn:mime-type = text/plain
More information about the asterisk-commits
mailing list