Asterisk - The Open Source Telephony Project GIT-master-27fb039
Loading...
Searching...
No Matches
Functions | Variables
chan_bridge_media.c File Reference

Bridge Media Channels driver. More...

#include "asterisk.h"
#include "asterisk/channel.h"
#include "asterisk/bridge.h"
#include "asterisk/core_unreal.h"
#include "asterisk/module.h"
Include dependency graph for chan_bridge_media.c:

Go to the source code of this file.

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
static struct ast_channelannounce_request (const char *type, struct ast_format_cap *cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *data, int *cause)
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
static void cleanup_capabilities (void)
 
static int load_module (void)
 
static int media_call (struct ast_channel *chan, const char *addr, int timeout)
 
static int media_hangup (struct ast_channel *ast)
 
static struct ast_channelmedia_request_helper (struct ast_format_cap *cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *data, struct ast_channel_tech *tech, const char *role)
 
static struct ast_channelrecord_request (const char *type, struct ast_format_cap *cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *data, int *cause)
 
static int unload_module (void)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Bridge Media Channel Driver" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, }
 
static struct ast_channel_tech announce_tech
 
static const struct ast_module_infoast_module_info = &__mod_info
 
static struct ast_channel_tech record_tech
 

Detailed Description

Bridge Media Channels driver.

Author
Jonathan Rose jrose.nosp@m.@dig.nosp@m.ium.c.nosp@m.om
Richard Mudgett rmudg.nosp@m.ett@.nosp@m.digiu.nosp@m.m.co.nosp@m.m

Bridge Media Channels

Definition in file chan_bridge_media.c.

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 219 of file chan_bridge_media.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 219 of file chan_bridge_media.c.

◆ announce_request()

static struct ast_channel * announce_request ( const char *  type,
struct ast_format_cap cap,
const struct ast_assigned_ids assignedids,
const struct ast_channel requestor,
const char *  data,
int *  cause 
)
static

Definition at line 150 of file chan_bridge_media.c.

152{
153 return media_request_helper(cap, assignedids, requestor, data, &announce_tech, "announcer");
154}
static struct ast_channel_tech announce_tech
static struct ast_channel * media_request_helper(struct ast_format_cap *cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *data, struct ast_channel_tech *tech, const char *role)

References announce_tech, ast_channel::data, and media_request_helper().

◆ AST_MODULE_SELF_SYM()

struct ast_module * AST_MODULE_SELF_SYM ( void  )

Definition at line 219 of file chan_bridge_media.c.

◆ cleanup_capabilities()

static void cleanup_capabilities ( void  )
static

Definition at line 162 of file chan_bridge_media.c.

163{
167 }
168
172 }
173}
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition astobj2.h:459
static struct ast_channel_tech record_tech
#define NULL
Definition resample.c:96
struct ast_format_cap * capabilities
Definition channel.h:652

References announce_tech, ao2_ref, ast_channel_tech::capabilities, NULL, and record_tech.

Referenced by load_module(), and unload_module().

◆ load_module()

static int load_module ( void  )
static

Definition at line 183 of file chan_bridge_media.c.

184{
188 }
189
193 }
194
197
199 ast_log(LOG_ERROR, "Unable to register channel technology %s(%s).\n",
203 }
204
206 ast_log(LOG_ERROR, "Unable to register channel technology %s(%s).\n",
210 }
211
213}
#define ast_log
Definition astobj2.c:42
static void cleanup_capabilities(void)
int ast_channel_register(const struct ast_channel_tech *tech)
Register a channel technology (a new channel driver) Called by a channel module to register the kind ...
Definition channel.c:539
@ AST_MEDIA_TYPE_UNKNOWN
Definition codec.h:31
int ast_format_cap_append_by_type(struct ast_format_cap *cap, enum ast_media_type type)
Add all codecs Asterisk knows about for a specific type to the capabilities structure.
Definition format_cap.c:216
@ AST_FORMAT_CAP_FLAG_DEFAULT
Definition format_cap.h:38
#define ast_format_cap_alloc(flags)
Allocate a new ast_format_cap structure.
Definition format_cap.h:49
#define LOG_ERROR
@ AST_MODULE_LOAD_SUCCESS
Definition module.h:70
@ AST_MODULE_LOAD_DECLINE
Module has failed to load, may be in an inconsistent state.
Definition module.h:78
const char *const type
Definition channel.h:649
const char *const description
Definition channel.h:650

References announce_tech, ast_channel_register(), ast_format_cap_alloc, ast_format_cap_append_by_type(), AST_FORMAT_CAP_FLAG_DEFAULT, ast_log, AST_MEDIA_TYPE_UNKNOWN, AST_MODULE_LOAD_DECLINE, AST_MODULE_LOAD_SUCCESS, ast_channel_tech::capabilities, cleanup_capabilities(), ast_channel_tech::description, LOG_ERROR, record_tech, and ast_channel_tech::type.

◆ media_call()

static int media_call ( struct ast_channel chan,
const char *  addr,
int  timeout 
)
static

Definition at line 42 of file chan_bridge_media.c.

43{
44 /* ast_call() will fail unconditionally against channels provided by this driver */
45 return -1;
46}

◆ media_hangup()

static int media_hangup ( struct ast_channel ast)
static

Definition at line 48 of file chan_bridge_media.c.

49{
50 struct ast_unreal_pvt *p = ast_channel_tech_pvt(ast);
51 int res;
52
53 if (!p) {
54 return -1;
55 }
56
57 /* Give the pvt a ref to fulfill calling requirements. */
58 ao2_ref(p, +1);
59 res = ast_unreal_hangup(p, ast);
60 ao2_ref(p, -1);
61
62 return res;
63}
void * ast_channel_tech_pvt(const struct ast_channel *chan)
int ast_unreal_hangup(struct ast_unreal_pvt *p, struct ast_channel *ast)
Hangup one end (maybe both ends) of an unreal channel derivative.
The base pvt structure for local channel derivatives.
Definition core_unreal.h:91

References ao2_ref, ast_channel_tech_pvt(), and ast_unreal_hangup().

◆ media_request_helper()

static struct ast_channel * media_request_helper ( struct ast_format_cap cap,
const struct ast_assigned_ids assignedids,
const struct ast_channel requestor,
const char *  data,
struct ast_channel_tech tech,
const char *  role 
)
static

Definition at line 115 of file chan_bridge_media.c.

117{
118 struct ast_channel *chan;
120
121 RAII_VAR(struct ast_unreal_pvt *, pvt, NULL, ao2_cleanup);
122
123 if (!(pvt = ast_unreal_alloc(sizeof(*pvt), ast_unreal_destructor, cap))) {
124 return NULL;
125 }
126
127 ast_copy_string(pvt->name, data, sizeof(pvt->name));
128
130
132
133 chan = ast_unreal_new_channels(pvt, tech,
134 AST_STATE_UP, AST_STATE_UP, NULL, NULL, assignedids, requestor, callid);
135 if (!chan) {
136 return NULL;
137 }
138
139 ast_answer(pvt->owner);
140 ast_answer(pvt->chan);
141
142 if (ast_channel_add_bridge_role(pvt->chan, role)) {
143 ast_hangup(chan);
144 return NULL;
145 }
146
147 return chan;
148}
#define ao2_cleanup(obj)
Definition astobj2.h:1934
int ast_channel_add_bridge_role(struct ast_channel *chan, const char *role_name)
Adds a bridge role to a channel.
void ast_hangup(struct ast_channel *chan)
Hang up a channel.
Definition channel.c:2538
int ast_answer(struct ast_channel *chan)
Answer a channel.
Definition channel.c:2803
@ AST_STATE_UP
#define AST_UNREAL_NO_OPTIMIZATION
void ast_unreal_destructor(void *vdoomed)
struct ast_unreal_pvt destructor.
struct ast_unreal_pvt * ast_unreal_alloc(size_t size, ao2_destructor_fn destructor, struct ast_format_cap *cap)
Allocate the base unreal struct for a derivative.
struct ast_channel * ast_unreal_new_channels(struct ast_unreal_pvt *p, const struct ast_channel_tech *tech, int semi1_state, int semi2_state, const char *exten, const char *context, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, ast_callid callid)
Create the semi1 and semi2 unreal channels.
ast_callid ast_read_threadstorage_callid(void)
extracts the callid from the thread
Definition logger.c:2268
unsigned int ast_callid
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition strings.h:425
Main Channel structure associated with a channel.
ast_callid callid
const char * data
const struct ast_channel_tech * tech
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition utils.h:981
#define ast_set_flag(p, flag)
Definition utils.h:71

References ao2_cleanup, ast_answer(), ast_channel_add_bridge_role(), ast_copy_string(), ast_hangup(), ast_read_threadstorage_callid(), ast_set_flag, AST_STATE_UP, ast_unreal_alloc(), ast_unreal_destructor(), ast_unreal_new_channels(), AST_UNREAL_NO_OPTIMIZATION, ast_channel::callid, ast_channel::data, NULL, RAII_VAR, and ast_channel::tech.

Referenced by announce_request(), and record_request().

◆ record_request()

static struct ast_channel * record_request ( const char *  type,
struct ast_format_cap cap,
const struct ast_assigned_ids assignedids,
const struct ast_channel requestor,
const char *  data,
int *  cause 
)
static

Definition at line 156 of file chan_bridge_media.c.

158{
159 return media_request_helper(cap, assignedids, requestor, data, &record_tech, "recorder");
160}

References ast_channel::data, media_request_helper(), and record_tech.

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 175 of file chan_bridge_media.c.

176{
180 return 0;
181}
void ast_channel_unregister(const struct ast_channel_tech *tech)
Unregister a channel technology.
Definition channel.c:570

References announce_tech, ast_channel_unregister(), cleanup_capabilities(), and record_tech.

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Bridge Media Channel Driver" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, }
static

Definition at line 219 of file chan_bridge_media.c.

◆ announce_tech

struct ast_channel_tech announce_tech
static

Definition at line 71 of file chan_bridge_media.c.

71 {
72 .type = "Announcer",
73 .description = "Bridge Media Announcing Channel Driver",
74 .requester = announce_request,
75 .call = media_call,
76 .hangup = media_hangup,
77
78 .send_digit_begin = ast_unreal_digit_begin,
79 .send_digit_end = ast_unreal_digit_end,
80 .read = ast_unreal_read,
81 .write = ast_unreal_write,
82 .write_video = ast_unreal_write,
83 .exception = ast_unreal_read,
84 .indicate = ast_unreal_indicate,
85 .fixup = ast_unreal_fixup,
86 .send_html = ast_unreal_sendhtml,
87 .send_text = ast_unreal_sendtext,
88 .queryoption = ast_unreal_queryoption,
89 .setoption = ast_unreal_setoption,
90 .properties = AST_CHAN_TP_INTERNAL,
91};
static struct ast_channel * announce_request(const char *type, struct ast_format_cap *cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *data, int *cause)
static int media_hangup(struct ast_channel *ast)
static int media_call(struct ast_channel *chan, const char *addr, int timeout)
@ AST_CHAN_TP_INTERNAL
Channels with this particular technology are an implementation detail of Asterisk and should generall...
Definition channel.h:991
int ast_unreal_digit_end(struct ast_channel *ast, char digit, unsigned int duration)
int ast_unreal_setoption(struct ast_channel *chan, int option, void *data, int datalen)
Definition core_unreal.c:97
int ast_unreal_queryoption(struct ast_channel *ast, int option, void *data, int *datalen)
int ast_unreal_fixup(struct ast_channel *oldchan, struct ast_channel *newchan)
int ast_unreal_digit_begin(struct ast_channel *ast, char digit)
int ast_unreal_sendhtml(struct ast_channel *ast, int subclass, const char *data, int datalen)
int ast_unreal_write(struct ast_channel *ast, struct ast_frame *f)
int ast_unreal_indicate(struct ast_channel *ast, int condition, const void *data, size_t datalen)
int ast_unreal_sendtext(struct ast_channel *ast, const char *text)
struct ast_frame * ast_unreal_read(struct ast_channel *ast)

Referenced by announce_request(), cleanup_capabilities(), load_module(), and unload_module().

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 219 of file chan_bridge_media.c.

◆ record_tech

struct ast_channel_tech record_tech
static

Definition at line 93 of file chan_bridge_media.c.

93 {
94 .type = "Recorder",
95 .description = "Bridge Media Recording Channel Driver",
96 .requester = record_request,
97 .call = media_call,
98 .hangup = media_hangup,
99
100 .send_digit_begin = ast_unreal_digit_begin,
101 .send_digit_end = ast_unreal_digit_end,
102 .read = ast_unreal_read,
103 .write = ast_unreal_write,
104 .write_video = ast_unreal_write,
105 .exception = ast_unreal_read,
106 .indicate = ast_unreal_indicate,
107 .fixup = ast_unreal_fixup,
108 .send_html = ast_unreal_sendhtml,
109 .send_text = ast_unreal_sendtext,
110 .queryoption = ast_unreal_queryoption,
111 .setoption = ast_unreal_setoption,
112 .properties = AST_CHAN_TP_INTERNAL,
113};
static struct ast_channel * record_request(const char *type, struct ast_format_cap *cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *data, int *cause)

Referenced by cleanup_capabilities(), load_module(), record_request(), and unload_module().