Sat Apr 26 2014 22:02:01

Asterisk developer's documentation


chan_bridge.c File Reference

Bridge Interaction Channel. More...

#include "asterisk.h"
#include <fcntl.h>
#include <sys/signal.h>
#include "asterisk/lock.h"
#include "asterisk/channel.h"
#include "asterisk/config.h"
#include "asterisk/module.h"
#include "asterisk/pbx.h"
#include "asterisk/sched.h"
#include "asterisk/io.h"
#include "asterisk/acl.h"
#include "asterisk/callerid.h"
#include "asterisk/file.h"
#include "asterisk/cli.h"
#include "asterisk/app.h"
#include "asterisk/bridging.h"
#include "asterisk/astobj2.h"
Include dependency graph for chan_bridge.c:

Go to the source code of this file.

Data Structures

struct  bridge_pvt

Functions

static void __reg_module (void)
static void __unreg_module (void)
static struct ast_channelbridge_bridgedchannel (struct ast_channel *chan, struct ast_channel *bridge)
 Called when the user of this channel wants to get the actual channel in the bridge.
static int bridge_call (struct ast_channel *ast, const char *dest, int timeout)
 Called when the channel should actually be dialed.
static int bridge_hangup (struct ast_channel *ast)
 Called when a channel should be hung up.
static struct ast_framebridge_read (struct ast_channel *ast)
 Called when a frame should be read from the channel.
static struct ast_channelbridge_request (const char *type, struct ast_format_cap *cap, const struct ast_channel *requestor, const char *data, int *cause)
 Called when we want to place a call somewhere, but not actually call it... yet.
static int bridge_write (struct ast_channel *ast, struct ast_frame *f)
 Called when a frame should be written out to a channel.
static int load_module (void)
 Load module into PBX, register channel.
static int unload_module (void)
 Unload the bridge interaction channel from Asterisk.

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Bridge Interaction Channel" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_CHANNEL_DRIVER, }
static struct ast_module_infoast_module_info = &__mod_info
static struct ast_channel_tech bridge_tech

Detailed Description

Bridge Interaction Channel.

Author:
Joshua Colp <jcolp@digium.com>

Definition in file chan_bridge.c.


Function Documentation

static void __reg_module ( void  ) [static]

Definition at line 235 of file chan_bridge.c.

static void __unreg_module ( void  ) [static]

Definition at line 235 of file chan_bridge.c.

static struct ast_channel * bridge_bridgedchannel ( struct ast_channel chan,
struct ast_channel bridge 
) [static, read]

Called when the user of this channel wants to get the actual channel in the bridge.

Definition at line 80 of file chan_bridge.c.

References ast_channel_tech_pvt(), bridge_pvt::input, and bridge_pvt::output.

{
   struct bridge_pvt *p = ast_channel_tech_pvt(chan);
   return (chan == p->input) ? p->output : bridge;
}
static int bridge_call ( struct ast_channel ast,
const char *  dest,
int  timeout 
) [static]

Called when the channel should actually be dialed.

Definition at line 119 of file chan_bridge.c.

References ast_bridge_impart(), ast_channel_internal_bridge(), ast_channel_tech_pvt(), bridge_pvt::input, and bridge_pvt::output.

{
   struct bridge_pvt *p = ast_channel_tech_pvt(ast);

   /* If no bridge has been provided on the input channel, bail out */
   if (!ast_channel_internal_bridge(ast)) {
      return -1;
   }

   /* Impart the output channel upon the given bridge of the input channel */
   return ast_bridge_impart(ast_channel_internal_bridge(p->input), p->output, NULL, NULL, 0)
      ? -1 : 0;
}
static int bridge_hangup ( struct ast_channel ast) [static]

Called when a channel should be hung up.

Definition at line 134 of file chan_bridge.c.

References ao2_lock, ao2_ref, ao2_unlock, ast_channel_tech_pvt(), ast_channel_tech_pvt_set(), bridge_pvt::input, and bridge_pvt::output.

{
   struct bridge_pvt *p = ast_channel_tech_pvt(ast);

   if (!p) {
      return 0;
   }

   ao2_lock(p);
   if (p->input == ast) {
      p->input = NULL;
   } else if (p->output == ast) {
      p->output = NULL;
   }
   ao2_unlock(p);

   ast_channel_tech_pvt_set(ast, NULL);
   ao2_ref(p, -1);

   return 0;
}
static struct ast_frame * bridge_read ( struct ast_channel ast) [static, read]

Called when a frame should be read from the channel.

Definition at line 87 of file chan_bridge.c.

References ast_null_frame.

{
   return &ast_null_frame;
}
static struct ast_channel * bridge_request ( const char *  type,
struct ast_format_cap cap,
const struct ast_channel requestor,
const char *  data,
int *  cause 
) [static, read]

Called when we want to place a call somewhere, but not actually call it... yet.

Definition at line 157 of file chan_bridge.c.

References ao2_alloc, ao2_ref, ast_answer(), ast_channel_alloc(), ast_channel_linkedid(), ast_channel_nativeformats(), ast_channel_rawreadformat(), ast_channel_rawwriteformat(), ast_channel_readformat(), ast_channel_release(), ast_channel_tech_pvt_set(), ast_channel_tech_set(), ast_channel_writeformat(), ast_format_cap_add(), ast_format_copy(), ast_format_set(), AST_FORMAT_SLINEAR, AST_STATE_UP, bridge_pvt::input, and bridge_pvt::output.

{
   struct bridge_pvt *p = NULL;
   struct ast_format slin;

   /* Try to allocate memory for our very minimal pvt structure */
   if (!(p = ao2_alloc(sizeof(*p), NULL))) {
      return NULL;
   }

   /* Try to grab two Asterisk channels to use as input and output channels */
   if (!(p->input = ast_channel_alloc(1, AST_STATE_UP, 0, 0, "", "", "", requestor ? ast_channel_linkedid(requestor) : NULL, 0, "Bridge/%p-input", p))) {
      ao2_ref(p, -1);
      return NULL;
   }
   if (!(p->output = ast_channel_alloc(1, AST_STATE_UP, 0, 0, "", "", "", requestor ? ast_channel_linkedid(requestor) : NULL, 0, "Bridge/%p-output", p))) {
      p->input = ast_channel_release(p->input);
      ao2_ref(p, -1);
      return NULL;
   }

   /* Setup parameters on both new channels */
   ast_channel_tech_set(p->input, &bridge_tech);
   ast_channel_tech_set(p->output, &bridge_tech);

   ao2_ref(p, 2);
   ast_channel_tech_pvt_set(p->input, p);
   ast_channel_tech_pvt_set(p->output, p);

   ast_format_set(&slin, AST_FORMAT_SLINEAR, 0);

   ast_format_cap_add(ast_channel_nativeformats(p->input), &slin);
   ast_format_cap_add(ast_channel_nativeformats(p->output), &slin);
   ast_format_copy(ast_channel_readformat(p->input), &slin);
   ast_format_copy(ast_channel_readformat(p->output), &slin);
   ast_format_copy(ast_channel_rawreadformat(p->input), &slin);
   ast_format_copy(ast_channel_rawreadformat(p->output), &slin);
   ast_format_copy(ast_channel_writeformat(p->input), &slin);
   ast_format_copy(ast_channel_writeformat(p->output), &slin);
   ast_format_copy(ast_channel_rawwriteformat(p->input), &slin);
   ast_format_copy(ast_channel_rawwriteformat(p->output), &slin);

   ast_answer(p->output);
   ast_answer(p->input);

   /* remove the reference from the alloc. The channels now own the pvt. */
   ao2_ref(p, -1);
   return p->input;
}
static int bridge_write ( struct ast_channel ast,
struct ast_frame f 
) [static]

Called when a frame should be written out to a channel.

Definition at line 93 of file chan_bridge.c.

References ao2_lock, ao2_unlock, ast_channel_lock, ast_channel_ref, ast_channel_tech_pvt(), ast_channel_unlock, ast_channel_unref, ast_queue_frame(), bridge_pvt::input, and bridge_pvt::output.

{
   struct bridge_pvt *p = ast_channel_tech_pvt(ast);
   struct ast_channel *other = NULL;

   ao2_lock(p);
   /* only write frames to output. */
   if (p->input == ast) {
      other = p->output;
      if (other) {
         ast_channel_ref(other);
      }
   }
   ao2_unlock(p);

   if (other) {
      ast_channel_unlock(ast);
      ast_queue_frame(other, f);
      ast_channel_lock(ast);
      other = ast_channel_unref(other);
   }

   return 0;
}
static int load_module ( void  ) [static]

Load module into PBX, register channel.

Definition at line 208 of file chan_bridge.c.

References ast_channel_register(), ast_format_cap_add_all(), ast_format_cap_alloc(), ast_log(), AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_SUCCESS, ast_channel_tech::capabilities, and LOG_ERROR.

{
   if (!(bridge_tech.capabilities = ast_format_cap_alloc())) {
      return AST_MODULE_LOAD_FAILURE;
   }

   ast_format_cap_add_all(bridge_tech.capabilities);
   /* Make sure we can register our channel type */
   if (ast_channel_register(&bridge_tech)) {
      ast_log(LOG_ERROR, "Unable to register channel class 'Bridge'\n");
      return AST_MODULE_LOAD_FAILURE;
   }
   return AST_MODULE_LOAD_SUCCESS;
}
static int unload_module ( void  ) [static]

Unload the bridge interaction channel from Asterisk.

Definition at line 224 of file chan_bridge.c.

References ast_channel_unregister(), ast_format_cap_destroy(), and ast_channel_tech::capabilities.


Variable Documentation

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Bridge Interaction Channel" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_CHANNEL_DRIVER, } [static]

Definition at line 235 of file chan_bridge.c.

Definition at line 235 of file chan_bridge.c.

struct ast_channel_tech bridge_tech [static]

Definition at line 61 of file chan_bridge.c.