Cross-platform console channel driver. More...
#include "asterisk.h"#include <sys/signal.h>#include <portaudio.h>#include "asterisk/module.h"#include "asterisk/channel.h"#include "asterisk/pbx.h"#include "asterisk/causes.h"#include "asterisk/cli.h"#include "asterisk/musiconhold.h"#include "asterisk/callerid.h"#include "asterisk/astobj2.h"
Go to the source code of this file.
Data Structures | |
| struct | console_pvt |
| Console pvt structure. More... | |
Defines | |
| #define | console_pvt_lock(pvt) ao2_lock(pvt) |
| lock a console_pvt struct | |
| #define | console_pvt_unlock(pvt) ao2_unlock(pvt) |
| unlock a console_pvt struct | |
| #define | INPUT_CHANNELS 1 |
| Mono Input. | |
| #define | NUM_PVT_BUCKETS 7 |
| #define | NUM_SAMPLES 320 |
| The number of samples to configure the portaudio stream for. | |
| #define | OUTPUT_CHANNELS 1 |
| Mono Output. | |
| #define | SAMPLE_RATE 16000 |
| The sample rate to request from PortAudio. | |
| #define | SUPPORTED_FORMATS ( AST_FORMAT_SLINEAR16 ) |
| Formats natively supported by this module. | |
| #define | TEXT_SIZE 256 |
| Maximum text message length. | |
| #define | V_BEGIN " --- <(\"<) --- " |
| Dance, Kirby, Dance! | |
| #define | V_END " --- (>\")> ---\n" |
Functions | |
| static void | __reg_module (void) |
| static void | __unreg_module (void) |
| static char * | ast_ext_ctx (struct console_pvt *pvt, const char *src, char **ext, char **ctx) |
| static void | build_device (struct ast_config *cfg, const char *name) |
| static char * | cli_console_active (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
| static char * | cli_console_answer (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
| answer command from the console | |
| static char * | cli_console_autoanswer (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
| static char * | cli_console_dial (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
| static char * | cli_console_flash (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
| static char * | cli_console_hangup (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
| static char * | cli_console_mute (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
| static char * | cli_console_sendtext (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
| Console send text CLI command. | |
| static char * | cli_list_available (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
| static char * | cli_list_devices (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
| static struct ast_channel * | console_new (struct console_pvt *pvt, const char *ext, const char *ctx, int state, const char *linkedid) |
| static void | destroy_pvts (void) |
| static struct console_pvt * | find_pvt (const char *name) |
| static struct console_pvt * | get_active_pvt (void) |
| static int | init_pvt (struct console_pvt *pvt, const char *name) |
| static int | load_config (int reload) |
| Load the configuration. | |
| static int | load_module (void) |
| static int | open_stream (struct console_pvt *pvt) |
| static int | pvt_cmp_cb (void *obj, void *arg, int flags) |
| static void | pvt_destructor (void *obj) |
| static int | pvt_hash_cb (const void *obj, const int flags) |
| static int | pvt_mark_destroy_cb (void *obj, void *arg, int flags) |
| static struct console_pvt * | ref_pvt (struct console_pvt *pvt) |
| static int | reload (void) |
| static void | set_active (struct console_pvt *pvt, const char *value) |
| static void | set_pvt_defaults (struct console_pvt *pvt) |
| Set default values for a pvt struct. | |
| static int | start_stream (struct console_pvt *pvt) |
| static int | stop_stream (struct console_pvt *pvt) |
| static void | stop_streams (void) |
| static void | store_callerid (struct console_pvt *pvt, const char *value) |
| static void | store_config_core (struct console_pvt *pvt, const char *var, const char *value) |
| Store a configuration parameter in a pvt struct. | |
| static void * | stream_monitor (void *data) |
| Stream monitor thread. | |
| static int | unload_module (void) |
| static struct console_pvt * | unref_pvt (struct console_pvt *pvt) |
| static struct ast_channel * | console_request (const char *type, format_t format, const struct ast_channel *requestor, void *data, int *cause) |
| static int | console_digit_begin (struct ast_channel *c, char digit) |
| static int | console_digit_end (struct ast_channel *c, char digit, unsigned int duration) |
| static int | console_text (struct ast_channel *c, const char *text) |
| static int | console_hangup (struct ast_channel *c) |
| static int | console_answer (struct ast_channel *c) |
| static struct ast_frame * | console_read (struct ast_channel *chan) |
| static int | console_call (struct ast_channel *c, char *dest, int timeout) |
| static int | console_write (struct ast_channel *chan, struct ast_frame *f) |
| static int | console_indicate (struct ast_channel *chan, int cond, const void *data, size_t datalen) |
| static int | console_fixup (struct ast_channel *oldchan, struct ast_channel *newchan) |
Variables | |
| static struct ast_module_info | __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Console Channel Driver" , .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 = "7a1b8b48c852d7a7061c7e499b9bd0d2" , .load = load_module, .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CHANNEL_DRIVER, } |
| static ast_rwlock_t | active_lock = { PTHREAD_RWLOCK_INITIALIZER , NULL, 1 } |
| static struct console_pvt * | active_pvt |
| static struct ast_module_info * | ast_module_info = &__mod_info |
| static struct ast_cli_entry | cli_console [] |
| static const char | config_file [] = "console.conf" |
| static struct ast_channel_tech | console_tech |
| static struct ast_jb_conf | default_jbconf |
| Global jitterbuffer configuration. | |
| static struct ast_jb_conf | global_jbconf |
| static struct console_pvt | globals |
| static ast_mutex_t | globals_lock = { PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP , NULL, 1 } |
| static struct ao2_container * | pvts |
Cross-platform console channel driver.
To install portaudio v19 from svn, check it out using the following command:
Definition in file chan_console.c.
| #define console_pvt_lock | ( | pvt | ) | ao2_lock(pvt) |
lock a console_pvt struct
Definition at line 226 of file chan_console.c.
Referenced by start_stream(), stop_stream(), console_request(), console_call(), cli_console_dial(), cli_list_devices(), cli_console_active(), and build_device().
| #define console_pvt_unlock | ( | pvt | ) | ao2_unlock(pvt) |
unlock a console_pvt struct
Definition at line 229 of file chan_console.c.
Referenced by start_stream(), stop_stream(), console_request(), console_call(), cli_console_dial(), cli_list_devices(), cli_console_active(), and build_device().
| #define INPUT_CHANNELS 1 |
| #define NUM_PVT_BUCKETS 7 |
Definition at line 167 of file chan_console.c.
Referenced by load_module().
| #define NUM_SAMPLES 320 |
The number of samples to configure the portaudio stream for.
320 samples (20 ms) is the most common frame size in Asterisk. So, the code in this module reads 320 sample frames from the portaudio stream and queues them up on the Asterisk channel. Frames of any size can be written to a portaudio stream, but the portaudio documentation does say that for high performance applications, the data should be written to Pa_WriteStream in the same size as what is used to initialize the stream.
Definition at line 90 of file chan_console.c.
Referenced by stream_monitor(), and open_stream().
| #define OUTPUT_CHANNELS 1 |
| #define SAMPLE_RATE 16000 |
The sample rate to request from PortAudio.
Definition at line 78 of file chan_console.c.
Referenced by open_stream().
| #define SUPPORTED_FORMATS ( AST_FORMAT_SLINEAR16 ) |
Formats natively supported by this module.
Definition at line 206 of file chan_console.c.
Referenced by console_request().
| #define TEXT_SIZE 256 |
Maximum text message length.
Definition at line 103 of file chan_console.c.
Referenced by cli_console_sendtext().
| #define V_BEGIN " --- <(\"<) --- " |
Dance, Kirby, Dance!
Definition at line 106 of file chan_console.c.
Referenced by console_digit_begin(), console_digit_end(), console_text(), console_hangup(), console_answer(), console_call(), console_indicate(), and cli_console_mute().
| #define V_END " --- (>\")> ---\n" |
Definition at line 107 of file chan_console.c.
Referenced by console_digit_begin(), console_digit_end(), console_text(), console_hangup(), console_answer(), console_call(), console_indicate(), and cli_console_mute().
| static void __reg_module | ( | void | ) | [static] |
Definition at line 1531 of file chan_console.c.
| static void __unreg_module | ( | void | ) | [static] |
Definition at line 1531 of file chan_console.c.
| static char* ast_ext_ctx | ( | struct console_pvt * | pvt, |
| const char * | src, | ||
| char ** | ext, | ||
| char ** | ctx | ||
| ) | [static] |
split a string in extension-context, returns pointers to malloc'ed strings. If we do not have 'overridecontext' then the last @ is considered as a context separator, and the context is overridden. This is usually not very necessary as you can play with the dialplan, and it is nice not to need it because you have '@' in SIP addresses. Return value is the buffer address.
Definition at line 659 of file chan_console.c.
References ast_strdup, console_pvt::overridecontext, and ext.
Referenced by cli_console_dial().
{
if (ext == NULL || ctx == NULL)
return NULL; /* error */
*ext = *ctx = NULL;
if (src && *src != '\0')
*ext = ast_strdup(src);
if (*ext == NULL)
return NULL;
if (!pvt->overridecontext) {
/* parse from the right */
*ctx = strrchr(*ext, '@');
if (*ctx)
*(*ctx)++ = '\0';
}
return *ext;
}
| static void build_device | ( | struct ast_config * | cfg, |
| const char * | name | ||
| ) | [static] |
Definition at line 1331 of file chan_console.c.
References find_pvt(), console_pvt_lock, set_pvt_defaults(), console_pvt::destroy, ao2_alloc, pvt_destructor(), init_pvt(), ast_variable_browse(), ast_variable::next, store_config_core(), ast_variable::name, ast_variable::value, ao2_link, console_pvt_unlock, and unref_pvt().
Referenced by load_config().
{
struct ast_variable *v;
struct console_pvt *pvt;
int new = 0;
if ((pvt = find_pvt(name))) {
console_pvt_lock(pvt);
set_pvt_defaults(pvt);
pvt->destroy = 0;
} else {
if (!(pvt = ao2_alloc(sizeof(*pvt), pvt_destructor)))
return;
init_pvt(pvt, name);
set_pvt_defaults(pvt);
new = 1;
}
for (v = ast_variable_browse(cfg, name); v; v = v->next)
store_config_core(pvt, v->name, v->value);
if (new)
ao2_link(pvts, pvt);
else
console_pvt_unlock(pvt);
unref_pvt(pvt);
}
| static char* cli_console_active | ( | struct ast_cli_entry * | e, |
| int | cmd, | ||
| struct ast_cli_args * | a | ||
| ) | [static] |
Definition at line 1154 of file chan_console.c.
References CLI_INIT, ast_cli_entry::command, ast_cli_entry::usage, CLI_GENERATE, ast_cli_args::pos, ast_cli_entry::args, ao2_iterator_init(), ao2_iterator_next, ast_cli_args::n, console_pvt::name, ast_cli_args::word, ast_strdup, unref_pvt(), ao2_iterator_destroy(), ast_cli_args::argc, CLI_SHOWUSAGE, get_active_pvt(), ast_cli(), ast_cli_args::fd, console_pvt_lock, console_pvt_unlock, CLI_SUCCESS, find_pvt(), ast_cli_args::argv, CLI_FAILURE, and set_active().
{
struct console_pvt *pvt;
switch (cmd) {
case CLI_INIT:
e->command = "console {set|show} active";
e->usage =
"Usage: console {set|show} active [<device>]\n"
" Set or show the active console device for the Asterisk CLI.\n";
return NULL;
case CLI_GENERATE:
if (a->pos == e->args) {
struct ao2_iterator i;
int x = 0;
char *res = NULL;
i = ao2_iterator_init(pvts, 0);
while ((pvt = ao2_iterator_next(&i))) {
if (++x > a->n && !strncasecmp(pvt->name, a->word, strlen(a->word)))
res = ast_strdup(pvt->name);
unref_pvt(pvt);
if (res) {
ao2_iterator_destroy(&i);
return res;
}
}
ao2_iterator_destroy(&i);
}
return NULL;
}
if (a->argc < e->args)
return CLI_SHOWUSAGE;
if (a->argc == 3) {
pvt = get_active_pvt();
if (!pvt)
ast_cli(a->fd, "No device is currently set as the active console device.\n");
else {
console_pvt_lock(pvt);
ast_cli(a->fd, "The active console device is '%s'.\n", pvt->name);
console_pvt_unlock(pvt);
pvt = unref_pvt(pvt);
}
return CLI_SUCCESS;
}
if (!(pvt = find_pvt(a->argv[e->args - 1]))) {
ast_cli(a->fd, "Could not find a device called '%s'.\n", a->argv[e->args]);
return CLI_FAILURE;
}
set_active(pvt, "yes");
console_pvt_lock(pvt);
ast_cli(a->fd, "The active console device has been set to '%s'\n", pvt->name);
console_pvt_unlock(pvt);
unref_pvt(pvt);
return CLI_SUCCESS;
}
| static char* cli_console_answer | ( | struct ast_cli_entry * | e, |
| int | cmd, | ||
| struct ast_cli_args * | a | ||
| ) | [static] |
answer command from the console
Definition at line 1035 of file chan_console.c.
References get_active_pvt(), CLI_INIT, ast_cli_entry::command, ast_cli_entry::usage, CLI_GENERATE, ast_cli(), ast_cli_args::fd, CLI_FAILURE, ast_cli_args::argc, ast_cli_entry::args, unref_pvt(), CLI_SHOWUSAGE, console_pvt::owner, console_pvt::hookstate, ast_indicate(), ast_queue_control(), AST_CONTROL_ANSWER, and CLI_SUCCESS.
{
struct console_pvt *pvt = get_active_pvt();
switch (cmd) {
case CLI_INIT:
e->command = "console answer";
e->usage =
"Usage: console answer\n"
" Answers an incoming call on the console channel.\n";
return NULL;
case CLI_GENERATE:
return NULL; /* no completion */
}
if (!pvt) {
ast_cli(a->fd, "No console device is set as active\n");
return CLI_FAILURE;
}
if (a->argc != e->args) {
unref_pvt(pvt);
return CLI_SHOWUSAGE;
}
if (!pvt->owner) {
ast_cli(a->fd, "No one is calling us\n");
unref_pvt(pvt);
return CLI_FAILURE;
}
pvt->hookstate = 1;
ast_indicate(pvt->owner, -1);
ast_queue_control(pvt->owner, AST_CONTROL_ANSWER);
unref_pvt(pvt);
return CLI_SUCCESS;
}
| static char* cli_console_autoanswer | ( | struct ast_cli_entry * | e, |
| int | cmd, | ||
| struct ast_cli_args * | a | ||
| ) | [static] |
Definition at line 693 of file chan_console.c.
References get_active_pvt(), CLI_SUCCESS, CLI_INIT, ast_cli_entry::command, ast_cli_entry::usage, CLI_GENERATE, ast_cli(), ast_cli_args::fd, CLI_FAILURE, ast_cli_args::argc, ast_cli_entry::args, console_pvt::autoanswer, unref_pvt(), CLI_SHOWUSAGE, and ast_cli_args::argv.
{
struct console_pvt *pvt = get_active_pvt();
char *res = CLI_SUCCESS;
switch (cmd) {
case CLI_INIT:
e->command = "console {set|show} autoanswer [on|off]";
e->usage =
"Usage: console {set|show} autoanswer [on|off]\n"
" Enables or disables autoanswer feature. If used without\n"
" argument, displays the current on/off status of autoanswer.\n"
" The default value of autoanswer is in 'oss.conf'.\n";
return NULL;
case CLI_GENERATE:
return NULL;
}
if (!pvt) {
ast_cli(a->fd, "No console device is set as active.\n");
return CLI_FAILURE;
}
if (a->argc == e->args - 1) {
ast_cli(a->fd, "Auto answer is %s.\n", pvt->autoanswer ? "on" : "off");
unref_pvt(pvt);
return CLI_SUCCESS;
}
if (a->argc != e->args) {
unref_pvt(pvt);
return CLI_SHOWUSAGE;
}
if (!strcasecmp(a->argv[e->args-1], "on"))
pvt->autoanswer = 1;
else if (!strcasecmp(a->argv[e->args - 1], "off"))
pvt->autoanswer = 0;
else
res = CLI_SHOWUSAGE;
unref_pvt(pvt);
return res;
}
| static char* cli_console_dial | ( | struct ast_cli_entry * | e, |
| int | cmd, | ||
| struct ast_cli_args * | a | ||
| ) | [static] |
Definition at line 777 of file chan_console.c.
References get_active_pvt(), CLI_INIT, ast_cli_entry::command, ast_cli_entry::usage, CLI_GENERATE, ast_cli(), ast_cli_args::fd, CLI_FAILURE, ast_cli_args::argc, ast_cli_entry::args, CLI_SHOWUSAGE, console_pvt::owner, AST_FRAME_DTMF, unref_pvt(), ast_cli_args::argv, ast_frame::subclass, ast_frame_subclass::integer, ast_queue_frame(), CLI_SUCCESS, ext, ast_ext_ctx(), ast_debug, ast_strlen_zero(), console_pvt::exten, console_pvt::context, ast_exists_extension(), console_pvt_lock, console_pvt::hookstate, console_new(), AST_STATE_RINGING, console_pvt_unlock, and free.
{
char *s = NULL;
const char *mye = NULL, *myc = NULL;
struct console_pvt *pvt = get_active_pvt();
if (cmd == CLI_INIT) {
e->command = "console dial";
e->usage =
"Usage: console dial [extension[@context]]\n"
" Dials a given extension (and context if specified)\n";
return NULL;
} else if (cmd == CLI_GENERATE)
return NULL;
if (!pvt) {
ast_cli(a->fd, "No console device is currently set as active\n");
return CLI_FAILURE;
}
if (a->argc > e->args + 1)
return CLI_SHOWUSAGE;
if (pvt->owner) { /* already in a call */
int i;
struct ast_frame f = { AST_FRAME_DTMF };
const char *s;
if (a->argc == e->args) { /* argument is mandatory here */
ast_cli(a->fd, "Already in a call. You can only dial digits until you hangup.\n");
unref_pvt(pvt);
return CLI_FAILURE;
}
s = a->argv[e->args];
/* send the string one char at a time */
for (i = 0; i < strlen(s); i++) {
f.subclass.integer = s[i];
ast_queue_frame(pvt->owner, &f);
}
unref_pvt(pvt);
return CLI_SUCCESS;
}
/* if we have an argument split it into extension and context */
if (a->argc == e->args + 1) {
char *ext = NULL, *con = NULL;
s = ast_ext_ctx(pvt, a->argv[e->args], &ext, &con);
ast_debug(1, "provided '%s', exten '%s' context '%s'\n",
a->argv[e->args], mye, myc);
mye = ext;
myc = con;
}
/* supply default values if needed */
if (ast_strlen_zero(mye))
mye = pvt->exten;
if (ast_strlen_zero(myc))
myc = pvt->context;
if (ast_exists_extension(NULL, myc, mye, 1, NULL)) {
console_pvt_lock(pvt);
pvt->hookstate = 1;
console_new(pvt, mye, myc, AST_STATE_RINGING, NULL);
console_pvt_unlock(pvt);
} else
ast_cli(a->fd, "No such extension '%s' in context '%s'\n", mye, myc);
free(s);
unref_pvt(pvt);
return CLI_SUCCESS;
}
| static char* cli_console_flash | ( | struct ast_cli_entry * | e, |
| int | cmd, | ||
| struct ast_cli_args * | a | ||
| ) | [static] |
Definition at line 741 of file chan_console.c.
References get_active_pvt(), CLI_INIT, ast_cli_entry::command, ast_cli_entry::usage, CLI_GENERATE, ast_cli(), ast_cli_args::fd, CLI_FAILURE, ast_cli_args::argc, ast_cli_entry::args, CLI_SHOWUSAGE, console_pvt::owner, unref_pvt(), console_pvt::hookstate, ast_queue_control(), AST_CONTROL_FLASH, and CLI_SUCCESS.
{
struct console_pvt *pvt = get_active_pvt();
if (cmd == CLI_INIT) {
e->command = "console flash";
e->usage =
"Usage: console flash\n"
" Flashes the call currently placed on the console.\n";
return NULL;
} else if (cmd == CLI_GENERATE)
return NULL;
if (!pvt) {
ast_cli(a->fd, "No console device is set as active\n");
return CLI_FAILURE;
}
if (a->argc != e->args)
return CLI_SHOWUSAGE;
if (!pvt->owner) {
ast_cli(a->fd, "No call to flash\n");
unref_pvt(pvt);
return CLI_FAILURE;
}
pvt->hookstate = 0;
ast_queue_control(pvt->owner, AST_CONTROL_FLASH);
unref_pvt(pvt);
return CLI_SUCCESS;
}
| static char* cli_console_hangup | ( | struct ast_cli_entry * | e, |
| int | cmd, | ||
| struct ast_cli_args * | a | ||
| ) | [static] |
Definition at line 851 of file chan_console.c.
References get_active_pvt(), CLI_INIT, ast_cli_entry::command, ast_cli_entry::usage, CLI_GENERATE, ast_cli(), ast_cli_args::fd, CLI_FAILURE, ast_cli_args::argc, ast_cli_entry::args, CLI_SHOWUSAGE, console_pvt::owner, console_pvt::hookstate, unref_pvt(), ast_queue_hangup(), and CLI_SUCCESS.
{
struct console_pvt *pvt = get_active_pvt();
if (cmd == CLI_INIT) {
e->command = "console hangup";
e->usage =
"Usage: console hangup\n"
" Hangs up any call currently placed on the console.\n";
return NULL;
} else if (cmd == CLI_GENERATE)
return NULL;
if (!pvt) {
ast_cli(a->fd, "No console device is set as active\n");
return CLI_FAILURE;
}
if (a->argc != e->args)
return CLI_SHOWUSAGE;
if (!pvt->owner && !pvt->hookstate) {
ast_cli(a->fd, "No call to hang up\n");
unref_pvt(pvt);
return CLI_FAILURE;
}
pvt->hookstate = 0;
if (pvt->owner)
ast_queue_hangup(pvt->owner);
unref_pvt(pvt);
return CLI_SUCCESS;
}
| static char* cli_console_mute | ( | struct ast_cli_entry * | e, |
| int | cmd, | ||
| struct ast_cli_args * | a | ||
| ) | [static] |
Definition at line 887 of file chan_console.c.
References get_active_pvt(), CLI_SUCCESS, CLI_INIT, ast_cli_entry::command, ast_cli_entry::usage, CLI_GENERATE, ast_cli(), ast_cli_args::fd, CLI_FAILURE, ast_cli_args::argc, ast_cli_entry::args, CLI_SHOWUSAGE, ast_cli_args::argv, console_pvt::muted, ast_verb, V_BEGIN, V_END, and unref_pvt().
{
const char *s;
struct console_pvt *pvt = get_active_pvt();
char *res = CLI_SUCCESS;
if (cmd == CLI_INIT) {
e->command = "console {mute|unmute}";
e->usage =
"Usage: console {mute|unmute}\n"
" Mute/unmute the microphone.\n";
return NULL;
} else if (cmd == CLI_GENERATE)
return NULL;
if (!pvt) {
ast_cli(a->fd, "No console device is set as active\n");
return CLI_FAILURE;
}
if (a->argc != e->args)
return CLI_SHOWUSAGE;
s = a->argv[e->args-1];
if (!strcasecmp(s, "mute"))
pvt->muted = 1;
else if (!strcasecmp(s, "unmute"))
pvt->muted = 0;
else
res = CLI_SHOWUSAGE;
ast_verb(1, V_BEGIN "The Console is now %s" V_END,
pvt->muted ? "Muted" : "Unmuted");
unref_pvt(pvt);
return res;
}
| static char* cli_console_sendtext | ( | struct ast_cli_entry * | e, |
| int | cmd, | ||
| struct ast_cli_args * | a | ||
| ) | [static] |
Console send text CLI command.
Definition at line 1084 of file chan_console.c.
References TEXT_SIZE, get_active_pvt(), ast_frame::frametype, AST_FRAME_TEXT, len(), CLI_INIT, ast_cli_entry::command, ast_cli_entry::usage, CLI_GENERATE, ast_cli(), ast_cli_args::fd, CLI_FAILURE, ast_cli_args::argc, ast_cli_entry::args, unref_pvt(), CLI_SHOWUSAGE, console_pvt::owner, ast_join(), ast_cli_args::argv, ast_strlen_zero(), ast_frame::datalen, ast_queue_frame(), and CLI_SUCCESS.
{
char buf[TEXT_SIZE];
struct console_pvt *pvt = get_active_pvt();
struct ast_frame f = {
.frametype = AST_FRAME_TEXT,
.data.ptr = buf,
.src = "console_send_text",
};
int len;
if (cmd == CLI_INIT) {
e->command = "console send text";
e->usage =
"Usage: console send text <message>\n"
" Sends a text message for display on the remote terminal.\n";
return NULL;
} else if (cmd == CLI_GENERATE)
return NULL;
if (!pvt) {
ast_cli(a->fd, "No console device is set as active\n");
return CLI_FAILURE;
}
if (a->argc < e->args + 1) {
unref_pvt(pvt);
return CLI_SHOWUSAGE;
}
if (!pvt->owner) {
ast_cli(a->fd, "Not in a call\n");
unref_pvt(pvt);
return CLI_FAILURE;
}
ast_join(buf, sizeof(buf) - 1, a->argv + e->args);
if (ast_strlen_zero(buf)) {
unref_pvt(pvt);
return CLI_SHOWUSAGE;
}
len = strlen(buf);
buf[len] = '\n';
f.datalen = len + 1;
ast_queue_frame(pvt->owner, &f);
unref_pvt(pvt);
return CLI_SUCCESS;
}
| static char* cli_list_available | ( | struct ast_cli_entry * | e, |
| int | cmd, | ||
| struct ast_cli_args * | a | ||
| ) | [static] |
Definition at line 926 of file chan_console.c.
References CLI_INIT, ast_cli_entry::command, ast_cli_entry::usage, CLI_GENERATE, ast_cli_args::argc, ast_cli_entry::args, CLI_SHOWUSAGE, ast_cli(), ast_cli_args::fd, and CLI_SUCCESS.
{
PaDeviceIndex idx, num, def_input, def_output;
if (cmd == CLI_INIT) {
e->command = "console list available";
e->usage =
"Usage: console list available\n"
" List all available devices.\n";
return NULL;
} else if (cmd == CLI_GENERATE)
return NULL;
if (a->argc != e->args)
return CLI_SHOWUSAGE;
ast_cli(a->fd, "\n"
"=============================================================\n"
"=== Available Devices =======================================\n"
"=============================================================\n"
"===\n");
num = Pa_GetDeviceCount();
if (!num) {
ast_cli(a->fd, "(None)\n");
return CLI_SUCCESS;
}
def_input = Pa_GetDefaultInputDevice();
def_output = Pa_GetDefaultOutputDevice();
for (idx = 0; idx < num; idx++) {
const PaDeviceInfo *dev = Pa_GetDeviceInfo(idx);
if (!dev)
continue;
ast_cli(a->fd, "=== ---------------------------------------------------------\n"
"=== Device Name: %s\n", dev->name);
if (dev->maxInputChannels)
ast_cli(a->fd, "=== ---> %sInput Device\n", (idx == def_input) ? "Default " : "");
if (dev->maxOutputChannels)
ast_cli(a->fd, "=== ---> %sOutput Device\n", (idx == def_output) ? "Default " : "");
ast_cli(a->fd, "=== ---------------------------------------------------------\n===\n");
}
ast_cli(a->fd, "=============================================================\n\n");
return CLI_SUCCESS;
}
| static char* cli_list_devices | ( | struct ast_cli_entry * | e, |
| int | cmd, | ||
| struct ast_cli_args * | a | ||
| ) | [static] |
Definition at line 974 of file chan_console.c.
References CLI_INIT, ast_cli_entry::command, ast_cli_entry::usage, CLI_GENERATE, ast_cli_args::argc, ast_cli_entry::args, CLI_SHOWUSAGE, ast_cli(), ast_cli_args::fd, ao2_iterator_init(), ao2_iterator_next, console_pvt_lock, console_pvt::name, console_pvt::input_device, console_pvt::output_device, console_pvt::context, console_pvt::exten, console_pvt::cid_num, console_pvt::cid_name, console_pvt::mohinterpret, console_pvt::language, console_pvt::parkinglot, console_pvt::muted, console_pvt::autoanswer, console_pvt::overridecontext, console_pvt_unlock, unref_pvt(), ao2_iterator_destroy(), and CLI_SUCCESS.
{
struct ao2_iterator i;
struct console_pvt *pvt;
if (cmd == CLI_INIT) {
e->command = "console list devices";
e->usage =
"Usage: console list devices\n"
" List all configured devices.\n";
return NULL;
} else if (cmd == CLI_GENERATE)
return NULL;
if (a->argc != e->args)
return CLI_SHOWUSAGE;
ast_cli(a->fd, "\n"
"=============================================================\n"
"=== Configured Devices ======================================\n"
"=============================================================\n"
"===\n");
i = ao2_iterator_init(pvts, 0);
while ((pvt = ao2_iterator_next(&i))) {
console_pvt_lock(pvt);
ast_cli(a->fd, "=== ---------------------------------------------------------\n"
"=== Device Name: %s\n"
"=== ---> Active: %s\n"
"=== ---> Input Device: %s\n"
"=== ---> Output Device: %s\n"
"=== ---> Context: %s\n"
"=== ---> Extension: %s\n"
"=== ---> CallerID Num: %s\n"
"=== ---> CallerID Name: %s\n"
"=== ---> MOH Interpret: %s\n"
"=== ---> Language: %s\n"
"=== ---> Parkinglot: %s\n"
"=== ---> Muted: %s\n"
"=== ---> Auto-Answer: %s\n"
"=== ---> Override Context: %s\n"
"=== ---------------------------------------------------------\n===\n",
pvt->name, (pvt == active_pvt) ? "Yes" : "No",
pvt->input_device, pvt->output_device, pvt->context,
pvt->exten, pvt->cid_num, pvt->cid_name, pvt->mohinterpret,
pvt->language, pvt->parkinglot, pvt->muted ? "Yes" : "No", pvt->autoanswer ? "Yes" : "No",
pvt->overridecontext ? "Yes" : "No");
console_pvt_unlock(pvt);
unref_pvt(pvt);
}
ao2_iterator_destroy(&i);
ast_cli(a->fd, "=============================================================\n\n");
return CLI_SUCCESS;
}
| static int console_answer | ( | struct ast_channel * | c | ) | [static] |
Definition at line 527 of file chan_console.c.
References ast_channel::tech_pvt, ast_verb, V_BEGIN, V_END, ast_setstate(), AST_STATE_UP, and start_stream().
{
struct console_pvt *pvt = c->tech_pvt;
ast_verb(1, V_BEGIN "Call from Console has been Answered" V_END);
ast_setstate(c, AST_STATE_UP);
return start_stream(pvt);
}
| static int console_call | ( | struct ast_channel * | c, |
| char * | dest, | ||
| int | timeout | ||
| ) | [static] |
Definition at line 565 of file chan_console.c.
References ast_channel::tech_pvt, ast_verb, V_BEGIN, V_END, S_COR, ast_channel::caller, ast_party_caller::id, ast_party_id::name, ast_party_name::valid, ast_party_name::str, ast_party_id::number, ast_party_number::valid, ast_party_number::str, console_pvt_lock, console_pvt::autoanswer, console_pvt::hookstate, console_pvt_unlock, AST_CONTROL_ANSWER, AST_CONTROL_RINGING, ast_indicate(), ast_queue_control(), and start_stream().
{
struct console_pvt *pvt = c->tech_pvt;
enum ast_control_frame_type ctrl;
ast_verb(1, V_BEGIN "Call to device '%s' on console from '%s' <%s>" V_END,
dest,
S_COR(c->caller.id.name.valid, c->caller.id.name.str, ""),
S_COR(c->caller.id.number.valid, c->caller.id.number.str, ""));
console_pvt_lock(pvt);
if (pvt->autoanswer) {
pvt->hookstate = 1;
console_pvt_unlock(pvt);
ast_verb(1, V_BEGIN "Auto-answered" V_END);
ctrl = AST_CONTROL_ANSWER;
} else {
console_pvt_unlock(pvt);
ast_verb(1, V_BEGIN "Type 'console answer' to answer, or use the 'autoanswer' option "
"for future calls" V_END);
ctrl = AST_CONTROL_RINGING;
ast_indicate(c, AST_CONTROL_RINGING);
}
ast_queue_control(c, ctrl);
return start_stream(pvt);
}
| static int console_digit_begin | ( | struct ast_channel * | c, |
| char | digit | ||
| ) | [static] |
| static int console_digit_end | ( | struct ast_channel * | c, |
| char | digit, | ||
| unsigned int | duration | ||
| ) | [static] |
| static int console_fixup | ( | struct ast_channel * | oldchan, |
| struct ast_channel * | newchan | ||
| ) | [static] |
Definition at line 639 of file chan_console.c.
References ast_channel::tech_pvt, and console_pvt::owner.
{
struct console_pvt *pvt = newchan->tech_pvt;
pvt->owner = newchan;
return 0;
}
| static int console_hangup | ( | struct ast_channel * | c | ) | [static] |
Definition at line 512 of file chan_console.c.
References ast_channel::tech_pvt, ast_verb, V_BEGIN, V_END, console_pvt::hookstate, console_pvt::owner, stop_stream(), and unref_pvt().
{
struct console_pvt *pvt = c->tech_pvt;
ast_verb(1, V_BEGIN "Hangup on Console" V_END);
pvt->hookstate = 0;
pvt->owner = NULL;
stop_stream(pvt);
c->tech_pvt = unref_pvt(pvt);
return 0;
}
| static int console_indicate | ( | struct ast_channel * | chan, |
| int | cond, | ||
| const void * | data, | ||
| size_t | datalen | ||
| ) | [static] |
Definition at line 604 of file chan_console.c.
References ast_channel::tech_pvt, AST_CONTROL_BUSY, AST_CONTROL_CONGESTION, AST_CONTROL_RINGING, AST_CONTROL_PROGRESS, AST_CONTROL_PROCEEDING, AST_CONTROL_VIDUPDATE, AST_CONTROL_SRCUPDATE, AST_CONTROL_HOLD, ast_verb, V_BEGIN, V_END, ast_moh_start(), console_pvt::mohinterpret, AST_CONTROL_UNHOLD, ast_moh_stop(), ast_log(), LOG_WARNING, and ast_channel::name.
{
struct console_pvt *pvt = chan->tech_pvt;
int res = 0;
switch (cond) {
case AST_CONTROL_BUSY:
case AST_CONTROL_CONGESTION:
case AST_CONTROL_RINGING:
case -1:
res = -1; /* Ask for inband indications */
break;
case AST_CONTROL_PROGRESS:
case AST_CONTROL_PROCEEDING:
case AST_CONTROL_VIDUPDATE:
case AST_CONTROL_SRCUPDATE:
break;
case AST_CONTROL_HOLD:
ast_verb(1, V_BEGIN "Console Has Been Placed on Hold" V_END);
ast_moh_start(chan, data, pvt->mohinterpret);
break;
case AST_CONTROL_UNHOLD:
ast_verb(1, V_BEGIN "Console Has Been Retrieved from Hold" V_END);
ast_moh_stop(chan);
break;
default:
ast_log(LOG_WARNING, "Don't know how to display condition %d on %s\n",
cond, chan->name);
/* The core will play inband indications for us if appropriate */
res = -1;
}
return res;
}
| static struct ast_channel* console_new | ( | struct console_pvt * | pvt, |
| const char * | ext, | ||
| const char * | ctx, | ||
| int | state, | ||
| const char * | linkedid | ||
| ) | [static, read] |
Definition at line 419 of file chan_console.c.
References ast_channel_alloc(), console_pvt::cid_num, console_pvt::cid_name, console_pvt::name, ast_channel::tech, console_tech, ast_channel::nativeformats, AST_FORMAT_SLINEAR16, ast_channel::readformat, ast_channel::writeformat, ast_channel::tech_pvt, ref_pvt(), console_pvt::owner, ast_strlen_zero(), console_pvt::language, ast_string_field_set, language, ast_jb_configure(), global_jbconf, AST_STATE_DOWN, ast_pbx_start(), ast_channel::hangupcause, AST_CAUSE_SWITCH_CONGESTION, ast_hangup(), and start_stream().
Referenced by console_request(), and cli_console_dial().
{
struct ast_channel *chan;
if (!(chan = ast_channel_alloc(1, state, pvt->cid_num, pvt->cid_name, NULL,
ext, ctx, linkedid, 0, "Console/%s", pvt->name))) {
return NULL;
}
chan->tech = &console_tech;
chan->nativeformats = AST_FORMAT_SLINEAR16;
chan->readformat = AST_FORMAT_SLINEAR16;
chan->writeformat = AST_FORMAT_SLINEAR16;
chan->tech_pvt = ref_pvt(pvt);
pvt->owner = chan;
if (!ast_strlen_zero(pvt->language))
ast_string_field_set(chan, language, pvt->language);
ast_jb_configure(chan, &global_jbconf);
if (state != AST_STATE_DOWN) {
if (ast_pbx_start(chan)) {
chan->hangupcause = AST_CAUSE_SWITCH_CONGESTION;
ast_hangup(chan);
chan = NULL;
} else
start_stream(pvt);
}
return chan;
}
| static struct ast_frame * console_read | ( | struct ast_channel * | chan | ) | [static, read] |
Definition at line 558 of file chan_console.c.
References ast_debug, and ast_null_frame.
{
ast_debug(1, "I should not be called ...\n");
return &ast_null_frame;
}
| static struct ast_channel * console_request | ( | const char * | type, |
| format_t | format, | ||
| const struct ast_channel * | requestor, | ||
| void * | data, | ||
| int * | cause | ||
| ) | [static, read] |
Channel Technology Callbacks
Definition at line 453 of file chan_console.c.
References format, find_pvt(), ast_log(), LOG_ERROR, SUPPORTED_FORMATS, LOG_NOTICE, ast_getformatname_multiple(), console_pvt::owner, AST_CAUSE_BUSY, console_pvt_lock, console_new(), AST_STATE_DOWN, ast_channel::linkedid, console_pvt_unlock, LOG_WARNING, and unref_pvt().
{
format_t oldformat = format;
struct ast_channel *chan = NULL;
struct console_pvt *pvt;
char buf[512];
if (!(pvt = find_pvt(data))) {
ast_log(LOG_ERROR, "Console device '%s' not found\n", (char *) data);
return NULL;
}
format &= SUPPORTED_FORMATS;
if (!format) {
ast_log(LOG_NOTICE, "Channel requested with unsupported format(s): '%s'\n", ast_getformatname_multiple(buf, sizeof(buf), oldformat));
goto return_unref;
}
if (pvt->owner) {
ast_log(LOG_NOTICE, "Console channel already active!\n");
*cause = AST_CAUSE_BUSY;
goto return_unref;
}
console_pvt_lock(pvt);
chan = console_new(pvt, NULL, NULL, AST_STATE_DOWN, requestor ? requestor->linkedid : NULL);
console_pvt_unlock(pvt);
if (!chan)
ast_log(LOG_WARNING, "Unable to create new Console channel!\n");
return_unref:
unref_pvt(pvt);
return chan;
}
| static int console_text | ( | struct ast_channel * | c, |
| const char * | text | ||
| ) | [static] |
| static int console_write | ( | struct ast_channel * | chan, |
| struct ast_frame * | f | ||
| ) | [static] |
Definition at line 595 of file chan_console.c.
References ast_channel::tech_pvt, console_pvt::stream, ast_frame::data, ast_frame::ptr, and ast_frame::samples.
| static void destroy_pvts | ( | void | ) | [static] |
Definition at line 1367 of file chan_console.c.
References ao2_iterator_init(), ao2_iterator_next, console_pvt::destroy, ao2_unlink, ast_rwlock_wrlock, active_lock, unref_pvt(), ast_rwlock_unlock, and ao2_iterator_destroy().
Referenced by load_config().
{
struct ao2_iterator i;
struct console_pvt *pvt;
i = ao2_iterator_init(pvts, 0);
while ((pvt = ao2_iterator_next(&i))) {
if (pvt->destroy) {
ao2_unlink(pvts, pvt);
ast_rwlock_wrlock(&active_lock);
if (active_pvt == pvt)
active_pvt = unref_pvt(pvt);
ast_rwlock_unlock(&active_lock);
}
unref_pvt(pvt);
}
ao2_iterator_destroy(&i);
}
| static struct console_pvt* find_pvt | ( | const char * | name | ) | [static, read] |
Definition at line 244 of file chan_console.c.
References console_pvt::name, name, ao2_find, and OBJ_POINTER.
Referenced by console_request(), cli_console_active(), and build_device().
{
struct console_pvt tmp_pvt = {
.name = name,
};
return ao2_find(pvts, &tmp_pvt, OBJ_POINTER);
}
| static struct console_pvt* get_active_pvt | ( | void | ) | [static, read] |
Definition at line 682 of file chan_console.c.
References ast_rwlock_rdlock, active_lock, ref_pvt(), and ast_rwlock_unlock.
Referenced by cli_console_autoanswer(), cli_console_flash(), cli_console_dial(), cli_console_hangup(), cli_console_mute(), cli_console_answer(), cli_console_sendtext(), and cli_console_active().
{
struct console_pvt *pvt;
ast_rwlock_rdlock(&active_lock);
pvt = ref_pvt(active_pvt);
ast_rwlock_unlock(&active_lock);
return pvt;
}
| static int init_pvt | ( | struct console_pvt * | pvt, |
| const char * | name | ||
| ) | [static] |
Definition at line 1319 of file chan_console.c.
References console_pvt::thread, AST_PTHREADT_NULL, ast_string_field_init, ast_string_field_set, and S_OR.
Referenced by build_device(), and load_module().
{
pvt->thread = AST_PTHREADT_NULL;
if (ast_string_field_init(pvt, 32))
return -1;
ast_string_field_set(pvt, name, S_OR(name, ""));
return 0;
}
| static int load_config | ( | int | reload | ) | [static] |
Load the configuration.
| reload | if this was called due to a reload |
| 0 | success |
| -1 | failure |
Definition at line 1392 of file chan_console.c.
References context, global_jbconf, ast_mutex_lock, globals_lock, set_pvt_defaults(), globals, ast_mutex_unlock, ast_config_load, ast_log(), LOG_NOTICE, CONFIG_STATUS_FILEINVALID, ao2_callback, OBJ_NODATA, pvt_mark_destroy_cb(), ast_variable_browse(), ast_variable::next, store_config_core(), ast_variable::name, ast_variable::value, ast_category_browse(), build_device(), ast_config_destroy(), and destroy_pvts().
Referenced by load_module(), and reload().
{
struct ast_config *cfg;
struct ast_variable *v;
struct ast_flags config_flags = { 0 };
char *context = NULL;
/* default values */
memcpy(&global_jbconf, &default_jbconf, sizeof(global_jbconf));
ast_mutex_lock(&globals_lock);
set_pvt_defaults(&globals);
ast_mutex_unlock(&globals_lock);
if (!(cfg = ast_config_load(config_file, config_flags))) {
ast_log(LOG_NOTICE, "Unable to open configuration file %s!\n", config_file);
return -1;
} else if (cfg == CONFIG_STATUS_FILEINVALID) {
ast_log(LOG_NOTICE, "Config file %s has an invalid format\n", config_file);
return -1;
}
ao2_callback(pvts, OBJ_NODATA, pvt_mark_destroy_cb, NULL);
ast_mutex_lock(&globals_lock);
for (v = ast_variable_browse(cfg, "general"); v; v = v->next)
store_config_core(&globals, v->name, v->value);
ast_mutex_unlock(&globals_lock);
while ((context = ast_category_browse(cfg, context))) {
if (strcasecmp(context, "general"))
build_device(cfg, context);
}
ast_config_destroy(cfg);
destroy_pvts();
return 0;
}
| static int load_module | ( | void | ) | [static] |
Definition at line 1477 of file chan_console.c.
References init_pvt(), globals, ao2_container_alloc, NUM_PVT_BUCKETS, pvt_hash_cb(), pvt_cmp_cb(), load_config(), ast_log(), LOG_WARNING, ast_channel_register(), LOG_ERROR, ast_cli_register_multiple(), ARRAY_LEN, AST_MODULE_LOAD_SUCCESS, ast_cli_unregister_multiple(), ast_channel_unregister(), ao2_ref, pvt_destructor(), and AST_MODULE_LOAD_DECLINE.
{
PaError res;
init_pvt(&globals, NULL);
if (!(pvts = ao2_container_alloc(NUM_PVT_BUCKETS, pvt_hash_cb, pvt_cmp_cb)))
goto return_error;
if (load_config(0))
goto return_error;
res = Pa_Initialize();
if (res != paNoError) {
ast_log(LOG_WARNING, "Failed to initialize audio system - (%d) %s\n",
res, Pa_GetErrorText(res));
goto return_error_pa_init;
}
if (ast_channel_register(&console_tech)) {
ast_log(LOG_ERROR, "Unable to register channel type 'Console'\n");
goto return_error_chan_reg;
}
if (ast_cli_register_multiple(cli_console, ARRAY_LEN(cli_console)))
goto return_error_cli_reg;
return AST_MODULE_LOAD_SUCCESS;
return_error_cli_reg:
ast_cli_unregister_multiple(cli_console, ARRAY_LEN(cli_console));
return_error_chan_reg:
ast_channel_unregister(&console_tech);
return_error_pa_init:
Pa_Terminate();
return_error:
if (pvts)
ao2_ref(pvts, -1);
pvts = NULL;
pvt_destructor(&globals);
return AST_MODULE_LOAD_DECLINE;
}
| static int open_stream | ( | struct console_pvt * | pvt | ) | [static] |
Definition at line 293 of file chan_console.c.
References console_pvt::input_device, console_pvt::output_device, console_pvt::stream, INPUT_CHANNELS, OUTPUT_CHANNELS, SAMPLE_RATE, NUM_SAMPLES, ast_log(), LOG_ERROR, and console_pvt::name.
Referenced by start_stream().
{
int res = paInternalError;
if (!strcasecmp(pvt->input_device, "default") &&
!strcasecmp(pvt->output_device, "default")) {
res = Pa_OpenDefaultStream(&pvt->stream, INPUT_CHANNELS, OUTPUT_CHANNELS,
paInt16, SAMPLE_RATE, NUM_SAMPLES, NULL, NULL);
} else {
PaStreamParameters input_params = {
.channelCount = 1,
.sampleFormat = paInt16,
.suggestedLatency = (1.0 / 50.0), /* 20 ms */
.device = paNoDevice,
};
PaStreamParameters output_params = {
.channelCount = 1,
.sampleFormat = paInt16,
.suggestedLatency = (1.0 / 50.0), /* 20 ms */
.device = paNoDevice,
};
PaDeviceIndex idx, num_devices, def_input, def_output;
if (!(num_devices = Pa_GetDeviceCount()))
return res;
def_input = Pa_GetDefaultInputDevice();
def_output = Pa_GetDefaultOutputDevice();
for (idx = 0;
idx < num_devices && (input_params.device == paNoDevice
|| output_params.device == paNoDevice);
idx++)
{
const PaDeviceInfo *dev = Pa_GetDeviceInfo(idx);
if (dev->maxInputChannels) {
if ( (idx == def_input && !strcasecmp(pvt->input_device, "default")) ||
!strcasecmp(pvt->input_device, dev->name) )
input_params.device = idx;
}
if (dev->maxOutputChannels) {
if ( (idx == def_output && !strcasecmp(pvt->output_device, "default")) ||
!strcasecmp(pvt->output_device, dev->name) )
output_params.device = idx;
}
}
if (input_params.device == paNoDevice)
ast_log(LOG_ERROR, "No input device found for console device '%s'\n", pvt->name);
if (output_params.device == paNoDevice)
ast_log(LOG_ERROR, "No output device found for console device '%s'\n", pvt->name);
res = Pa_OpenStream(&pvt->stream, &input_params, &output_params,
SAMPLE_RATE, NUM_SAMPLES, paNoFlag, NULL, NULL);
}
return res;
}
| static int pvt_cmp_cb | ( | void * | obj, |
| void * | arg, | ||
| int | flags | ||
| ) | [static] |
Definition at line 1439 of file chan_console.c.
References console_pvt::name, CMP_MATCH, and CMP_STOP.
Referenced by load_module().
{
struct console_pvt *pvt = obj, *pvt2 = arg;
return !strcasecmp(pvt->name, pvt2->name) ? CMP_MATCH | CMP_STOP : 0;
}
| static void pvt_destructor | ( | void * | obj | ) | [static] |
Definition at line 1312 of file chan_console.c.
References ast_string_field_free_memory.
Referenced by build_device(), unload_module(), and load_module().
{
struct console_pvt *pvt = obj;
ast_string_field_free_memory(pvt);
}
| static int pvt_hash_cb | ( | const void * | obj, |
| const int | flags | ||
| ) | [static] |
Definition at line 1432 of file chan_console.c.
References ast_str_case_hash(), and console_pvt::name.
Referenced by load_module().
{
const struct console_pvt *pvt = obj;
return ast_str_case_hash(pvt->name);
}
| static int pvt_mark_destroy_cb | ( | void * | obj, |
| void * | arg, | ||
| int | flags | ||
| ) | [static] |
Definition at line 1360 of file chan_console.c.
References console_pvt::destroy.
Referenced by load_config().
{
struct console_pvt *pvt = obj;
pvt->destroy = 1;
return 0;
}
| static struct console_pvt* ref_pvt | ( | struct console_pvt * | pvt | ) | [static, read] |
Definition at line 231 of file chan_console.c.
References ao2_ref.
Referenced by console_new(), get_active_pvt(), and set_active().
{
if (pvt)
ao2_ref(pvt, +1);
return pvt;
}
| static int reload | ( | void | ) | [static] |
Definition at line 1521 of file chan_console.c.
References load_config().
{
return load_config(1);
}
| static void set_active | ( | struct console_pvt * | pvt, |
| const char * | value | ||
| ) | [static] |
Definition at line 1137 of file chan_console.c.
References globals, ast_log(), LOG_ERROR, ast_true(), ast_rwlock_wrlock, active_lock, unref_pvt(), ref_pvt(), and ast_rwlock_unlock.
Referenced by cli_console_active(), and store_config_core().
{
if (pvt == &globals) {
ast_log(LOG_ERROR, "active is only valid as a per-device setting\n");
return;
}
if (!ast_true(value))
return;
ast_rwlock_wrlock(&active_lock);
if (active_pvt)
unref_pvt(active_pvt);
active_pvt = ref_pvt(pvt);
ast_rwlock_unlock(&active_lock);
}
| static void set_pvt_defaults | ( | struct console_pvt * | pvt | ) | [static] |
Set default values for a pvt struct.
Definition at line 1237 of file chan_console.c.
References globals, ast_string_field_set, mohinterpret, context, exten, language, cid_num, cid_name, parkinglot, console_pvt::overridecontext, console_pvt::autoanswer, ast_mutex_lock, globals_lock, console_pvt::mohinterpret, console_pvt::context, console_pvt::exten, console_pvt::language, console_pvt::cid_num, console_pvt::cid_name, console_pvt::parkinglot, and ast_mutex_unlock.
Referenced by build_device(), and load_config().
{
if (pvt == &globals) {
ast_string_field_set(pvt, mohinterpret, "default");
ast_string_field_set(pvt, context, "default");
ast_string_field_set(pvt, exten, "s");
ast_string_field_set(pvt, language, "");
ast_string_field_set(pvt, cid_num, "");
ast_string_field_set(pvt, cid_name, "");
ast_string_field_set(pvt, parkinglot, "");
pvt->overridecontext = 0;
pvt->autoanswer = 0;
} else {
ast_mutex_lock(&globals_lock);
ast_string_field_set(pvt, mohinterpret, globals.mohinterpret);
ast_string_field_set(pvt, context, globals.context);
ast_string_field_set(pvt, exten, globals.exten);
ast_string_field_set(pvt, language, globals.language);
ast_string_field_set(pvt, cid_num, globals.cid_num);
ast_string_field_set(pvt, cid_name, globals.cid_name);
ast_string_field_set(pvt, parkinglot, globals.parkinglot);
pvt->overridecontext = globals.overridecontext;
pvt->autoanswer = globals.autoanswer;
ast_mutex_unlock(&globals_lock);
}
}
| static int start_stream | ( | struct console_pvt * | pvt | ) | [static] |
Definition at line 354 of file chan_console.c.
References console_pvt_lock, console_pvt::streamstate, console_pvt::owner, ast_debug, open_stream(), ast_log(), LOG_WARNING, console_pvt::stream, ast_pthread_create_background, console_pvt::thread, stream_monitor(), LOG_ERROR, and console_pvt_unlock.
Referenced by console_new(), console_answer(), and console_call().
{
PaError res;
int ret_val = 0;
console_pvt_lock(pvt);
/* It is possible for console_hangup to be called before the
* stream is started, if this is the case pvt->owner will be NULL
* and start_stream should be aborted. */
if (pvt->streamstate || !pvt->owner)
goto return_unlock;
pvt->streamstate = 1;
ast_debug(1, "Starting stream\n");
res = open_stream(pvt);
if (res != paNoError) {
ast_log(LOG_WARNING, "Failed to open stream - (%d) %s\n",
res, Pa_GetErrorText(res));
ret_val = -1;
goto return_unlock;
}
res = Pa_StartStream(pvt->stream);
if (res != paNoError) {
ast_log(LOG_WARNING, "Failed to start stream - (%d) %s\n",
res, Pa_GetErrorText(res));
ret_val = -1;
goto return_unlock;
}
if (ast_pthread_create_background(&pvt->thread, NULL, stream_monitor, pvt)) {
ast_log(LOG_ERROR, "Failed to start stream monitor thread\n");
ret_val = -1;
}
return_unlock:
console_pvt_unlock(pvt);
return ret_val;
}
| static int stop_stream | ( | struct console_pvt * | pvt | ) | [static] |
Definition at line 397 of file chan_console.c.
References console_pvt::streamstate, console_pvt::thread, AST_PTHREADT_NULL, console_pvt_lock, console_pvt::stream, and console_pvt_unlock.
Referenced by console_hangup(), and stop_streams().
{
if (!pvt->streamstate || pvt->thread == AST_PTHREADT_NULL)
return 0;
pthread_cancel(pvt->thread);
pthread_kill(pvt->thread, SIGURG);
pthread_join(pvt->thread, NULL);
console_pvt_lock(pvt);
Pa_AbortStream(pvt->stream);
Pa_CloseStream(pvt->stream);
pvt->stream = NULL;
pvt->streamstate = 0;
console_pvt_unlock(pvt);
return 0;
}
| static void stop_streams | ( | void | ) | [static] |
Definition at line 1446 of file chan_console.c.
References ao2_iterator_init(), ao2_iterator_next, console_pvt::hookstate, stop_stream(), unref_pvt(), and ao2_iterator_destroy().
Referenced by unload_module().
{
struct console_pvt *pvt;
struct ao2_iterator i;
i = ao2_iterator_init(pvts, 0);
while ((pvt = ao2_iterator_next(&i))) {
if (pvt->hookstate)
stop_stream(pvt);
unref_pvt(pvt);
}
ao2_iterator_destroy(&i);
}
| static void store_callerid | ( | struct console_pvt * | pvt, |
| const char * | value | ||
| ) | [static] |
Definition at line 1268 of file chan_console.c.
References cid_name, cid_num, ast_callerid_split(), and ast_string_field_set.
Referenced by store_config_core(), and store_config().
{
char cid_name[256];
char cid_num[256];
ast_callerid_split(value, cid_name, sizeof(cid_name),
cid_num, sizeof(cid_num));
ast_string_field_set(pvt, cid_name, cid_name);
ast_string_field_set(pvt, cid_num, cid_num);
}
| static void store_config_core | ( | struct console_pvt * | pvt, |
| const char * | var, | ||
| const char * | value | ||
| ) | [static] |
Store a configuration parameter in a pvt struct.
Definition at line 1285 of file chan_console.c.
References globals, ast_jb_read_conf(), global_jbconf, CV_START, CV_STRFIELD, context, exten, mohinterpret, language, CV_F, store_callerid(), CV_BOOL, console_pvt::overridecontext, console_pvt::autoanswer, parkinglot, set_active(), ast_log(), LOG_WARNING, and CV_END.
Referenced by build_device(), and load_config().
{
if (pvt == &globals && !ast_jb_read_conf(&global_jbconf, var, value))
return;
CV_START(var, value);
CV_STRFIELD("context", pvt, context);
CV_STRFIELD("extension", pvt, exten);
CV_STRFIELD("mohinterpret", pvt, mohinterpret);
CV_STRFIELD("language", pvt, language);
CV_F("callerid", store_callerid(pvt, value));
CV_BOOL("overridecontext", pvt->overridecontext);
CV_BOOL("autoanswer", pvt->autoanswer);
CV_STRFIELD("parkinglot", pvt, parkinglot);
if (pvt != &globals) {
CV_F("active", set_active(pvt, value))
CV_STRFIELD("input_device", pvt, input_device);
CV_STRFIELD("output_device", pvt, output_device);
}
ast_log(LOG_WARNING, "Unknown option '%s'\n", var);
CV_END;
}
| static void* stream_monitor | ( | void * | data | ) | [static] |
Stream monitor thread.
This function runs in its own thread to monitor data coming in from a portaudio stream. When enough data is available, it is queued up to be read from the Asterisk channel.
Definition at line 263 of file chan_console.c.
References NUM_SAMPLES, ast_frame::frametype, AST_FRAME_VOICE, AST_FORMAT_SLINEAR16, ast_frame::samples, console_pvt::stream, console_pvt::owner, and ast_queue_frame().
Referenced by start_stream().
{
struct console_pvt *pvt = data;
char buf[NUM_SAMPLES * sizeof(int16_t)];
PaError res;
struct ast_frame f = {
.frametype = AST_FRAME_VOICE,
.subclass.codec = AST_FORMAT_SLINEAR16,
.src = "console_stream_monitor",
.data.ptr = buf,
.datalen = sizeof(buf),
.samples = sizeof(buf) / sizeof(int16_t),
};
for (;;) {
pthread_testcancel();
res = Pa_ReadStream(pvt->stream, buf, sizeof(buf) / sizeof(int16_t));
pthread_testcancel();
if (!pvt->owner) {
return NULL;
}
if (res == paNoError)
ast_queue_frame(pvt->owner, &f);
}
return NULL;
}
| static int unload_module | ( | void | ) | [static] |
Definition at line 1460 of file chan_console.c.
References ast_channel_unregister(), ast_cli_unregister_multiple(), ARRAY_LEN, stop_streams(), ao2_ref, pvt_destructor(), and globals.
{
ast_channel_unregister(&console_tech);
ast_cli_unregister_multiple(cli_console, ARRAY_LEN(cli_console));
stop_streams();
Pa_Terminate();
/* Will unref all the pvts so they will get destroyed, too */
ao2_ref(pvts, -1);
pvt_destructor(&globals);
return 0;
}
| static struct console_pvt* unref_pvt | ( | struct console_pvt * | pvt | ) | [static, read] |
Definition at line 238 of file chan_console.c.
References ao2_ref.
Referenced by console_request(), console_hangup(), cli_console_autoanswer(), cli_console_flash(), cli_console_dial(), cli_console_hangup(), cli_console_mute(), cli_list_devices(), cli_console_answer(), cli_console_sendtext(), set_active(), cli_console_active(), build_device(), destroy_pvts(), and stop_streams().
{
ao2_ref(pvt, -1);
return NULL;
}
struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Console Channel Driver" , .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 = "7a1b8b48c852d7a7061c7e499b9bd0d2" , .load = load_module, .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CHANNEL_DRIVER, } [static] |
Definition at line 1531 of file chan_console.c.
ast_rwlock_t active_lock = { PTHREAD_RWLOCK_INITIALIZER , NULL, 1 } [static] |
Definition at line 170 of file chan_console.c.
Referenced by get_active_pvt(), set_active(), and destroy_pvts().
struct console_pvt* active_pvt [static] |
Definition at line 169 of file chan_console.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 1531 of file chan_console.c.
struct ast_cli_entry cli_console[] [static] |
Definition at line 1219 of file chan_console.c.
const char config_file[] = "console.conf" [static] |
Definition at line 110 of file chan_console.c.
struct ast_channel_tech console_tech [static] |
Definition at line 208 of file chan_console.c.
Referenced by console_new().
struct ast_jb_conf default_jbconf [static] |
Global jitterbuffer configuration.
Definition at line 178 of file chan_console.c.
struct ast_jb_conf global_jbconf [static] |
Definition at line 185 of file chan_console.c.
Referenced by console_new(), store_config_core(), and load_config().
struct console_pvt globals [static] |
Referenced by set_active(), set_pvt_defaults(), store_config_core(), load_config(), unload_module(), and load_module().
ast_mutex_t globals_lock = { PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP , NULL, 1 } [static] |
Definition at line 164 of file chan_console.c.
Referenced by set_pvt_defaults(), and load_config().
struct ao2_container* pvts [static] |
Definition at line 166 of file chan_console.c.