#include "asterisk.h"
#include <stdio.h>
#include <ctype.h>
#include <math.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <sys/time.h>
#include <stdlib.h>
#include <errno.h>
#include <soundcard.h>
#include "asterisk/lock.h"
#include "asterisk/frame.h"
#include "asterisk/logger.h"
#include "asterisk/callerid.h"
#include "asterisk/channel.h"
#include "asterisk/module.h"
#include "asterisk/options.h"
#include "asterisk/pbx.h"
#include "asterisk/config.h"
#include "asterisk/cli.h"
#include "asterisk/utils.h"
#include "asterisk/causes.h"
#include "asterisk/endian.h"
#include "asterisk/stringfields.h"
#include "asterisk/abstract_jb.h"
#include "asterisk/musiconhold.h"
#include "busy_tone.h"
#include "ring_tone.h"
#include "ring10.h"
#include "answer.h"
Go to the source code of this file.
Data Structures | |
struct | chan_oss_pvt |
struct | sound |
Defines | |
#define | BOOST_MAX 40 |
#define | BOOST_SCALE (1<<9) |
#define | DEV_DSP "/dev/dsp" |
#define | FRAGS ( ( (6 * 5) << 16 ) | 0x6 ) |
#define | FRAME_SIZE 160 |
#define | M_BOOL(tag, dst) M_F(tag, (dst) = ast_true(__val) ) |
#define | M_END(x) x; |
#define | M_F(tag, f) if (!strcasecmp((__s), tag)) { f; } else |
#define | M_START(var, val) char *__s = var; char *__val = val; |
#define | M_STR(tag, dst) M_F(tag, ast_copy_string(dst, __val, sizeof(dst))) |
#define | M_UINT(tag, dst) M_F(tag, (dst) = strtoul(__val, NULL, 0) ) |
#define | MAX(a, b) ((a) > (b) ? (a) : (b)) |
#define | MIN(a, b) ((a) < (b) ? (a) : (b)) |
#define | O_CLOSE 0x444 |
#define | QUEUE_SIZE 10 |
#define | TEXT_SIZE 256 |
#define | WARN_frag 4 |
#define | WARN_speed 2 |
#define | WARN_used_blocks 1 |
Functions | |
static int | __console_mute_unmute (int mute) |
static void | __reg_module (void) |
static void | __unreg_module (void) |
static char * | ast_ext_ctx (const char *src, char **ext, char **ctx) |
static char * | autoanswer_complete (const char *line, const char *word, int pos, int state) |
static char * | autoanswer_complete_deprecated (const char *line, const char *word, int pos, int state) |
static int | console_active (int fd, int argc, char *argv[]) |
static int | console_active_deprecated (int fd, int argc, char *argv[]) |
static int | console_answer (int fd, int argc, char *argv[]) |
static int | console_answer_deprecated (int fd, int argc, char *argv[]) |
static int | console_autoanswer (int fd, int argc, char *argv[]) |
static int | console_autoanswer_deprecated (int fd, int argc, char *argv[]) |
static int | console_dial (int fd, int argc, char *argv[]) |
static int | console_dial_deprecated (int fd, int argc, char *argv[]) |
static int | console_flash (int fd, int argc, char *argv[]) |
static int | console_flash_deprecated (int fd, int argc, char *argv[]) |
static int | console_hangup (int fd, int argc, char *argv[]) |
static int | console_hangup_deprecated (int fd, int argc, char *argv[]) |
static int | console_mute (int fd, int argc, char *argv[]) |
static int | console_mute_deprecated (int fd, int argc, char *argv[]) |
static int | console_sendtext (int fd, int argc, char *argv[]) |
static int | console_sendtext_deprecated (int fd, int argc, char *argv[]) |
static int | console_transfer (int fd, int argc, char *argv[]) |
static int | console_transfer_deprecated (int fd, int argc, char *argv[]) |
static int | console_unmute (int fd, int argc, char *argv[]) |
static int | console_unmute_deprecated (int fd, int argc, char *argv[]) |
static int | do_boost (int fd, int argc, char *argv[]) |
static struct chan_oss_pvt * | find_desc (char *dev) |
static int | load_module (void) |
static int | oss_answer (struct ast_channel *c) |
static int | oss_call (struct ast_channel *c, char *dest, int timeout) |
static int | oss_digit_begin (struct ast_channel *c, char digit) |
static int | oss_digit_end (struct ast_channel *c, char digit, unsigned int duration) |
static int | oss_fixup (struct ast_channel *oldchan, struct ast_channel *newchan) |
static int | oss_hangup (struct ast_channel *c) |
static int | oss_indicate (struct ast_channel *chan, int cond, const void *data, size_t datalen) |
static struct ast_channel * | oss_new (struct chan_oss_pvt *o, char *ext, char *ctx, int state) |
static struct ast_frame * | oss_read (struct ast_channel *chan) |
static struct ast_channel * | oss_request (const char *type, int format, void *data, int *cause) |
static int | oss_text (struct ast_channel *c, const char *text) |
static int | oss_write (struct ast_channel *chan, struct ast_frame *f) |
static void | ring (struct chan_oss_pvt *o, int x) |
static void | send_sound (struct chan_oss_pvt *o) |
static int | setformat (struct chan_oss_pvt *o, int mode) |
static void * | sound_thread (void *arg) |
static int | soundcard_writeframe (struct chan_oss_pvt *o, short *data) |
static void | store_boost (struct chan_oss_pvt *o, char *s) |
static void | store_callerid (struct chan_oss_pvt *o, char *s) |
static struct chan_oss_pvt * | store_config (struct ast_config *cfg, char *ctg) |
static void | store_mixer (struct chan_oss_pvt *o, char *s) |
static int | unload_module (void) |
static int | used_blocks (struct chan_oss_pvt *o) |
Variables | |
static struct ast_module_info | __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT | AST_MODFLAG_BUILDSUM, .description = "OSS 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 = "f450f61f60e761b3aa089ebed76ca8a5" , .load = load_module, .unload = unload_module, } |
static char | active_usage [] |
static char | answer_usage [] |
static const struct ast_module_info * | ast_module_info = &__mod_info |
static char | autoanswer_usage [] |
static struct ast_cli_entry | cli_oss [] |
static struct ast_cli_entry | cli_oss_active_deprecated |
static struct ast_cli_entry | cli_oss_answer_deprecated |
static struct ast_cli_entry | cli_oss_autoanswer_deprecated |
static struct ast_cli_entry | cli_oss_boost_deprecated |
static struct ast_cli_entry | cli_oss_dial_deprecated |
static struct ast_cli_entry | cli_oss_flash_deprecated |
static struct ast_cli_entry | cli_oss_hangup_deprecated |
static struct ast_cli_entry | cli_oss_mute_deprecated |
static struct ast_cli_entry | cli_oss_send_text_deprecated |
static struct ast_cli_entry | cli_oss_transfer_deprecated |
static struct ast_cli_entry | cli_oss_unmute_deprecated |
static char * | config = "oss.conf" |
static struct ast_jb_conf | default_jbconf |
static char | dial_usage [] |
static char | flash_usage [] |
static struct ast_jb_conf | global_jbconf |
static char | hangup_usage [] |
static char | mute_usage [] |
static char * | oss_active |
static int | oss_debug |
static struct chan_oss_pvt | oss_default |
static struct ast_channel_tech | oss_tech |
static char | sendtext_usage [] |
static struct sound | sounds [] |
static char | tdesc [] = "OSS Console Channel Driver" |
static char | transfer_usage [] |
static char | unmute_usage [] |
Luigi Rizzo
Definition in file chan_oss.c.
#define BOOST_MAX 40 |
#define BOOST_SCALE (1<<9) |
#define DEV_DSP "/dev/dsp" |
#define FRAGS ( ( (6 * 5) << 16 ) | 0x6 ) |
Definition at line 257 of file chan_oss.c.
#define FRAME_SIZE 160 |
Definition at line 251 of file chan_oss.c.
#define M_BOOL | ( | tag, | |||
dst | ) | M_F(tag, (dst) = ast_true(__val) ) |
#define M_END | ( | x | ) | x; |
#define M_STR | ( | tag, | |||
dst | ) | M_F(tag, ast_copy_string(dst, __val, sizeof(dst))) |
#define M_UINT | ( | tag, | |||
dst | ) | M_F(tag, (dst) = strtoul(__val, NULL, 0) ) |
#define MAX | ( | a, | |||
b | ) | ((a) > (b) ? (a) : (b)) |
Definition at line 281 of file chan_oss.c.
#define MIN | ( | a, | |||
b | ) | ((a) < (b) ? (a) : (b)) |
Definition at line 278 of file chan_oss.c.
#define O_CLOSE 0x444 |
Definition at line 269 of file chan_oss.c.
Referenced by console_hangup(), console_hangup_deprecated(), oss_hangup(), setformat(), and sound_thread().
#define QUEUE_SIZE 10 |
Definition at line 252 of file chan_oss.c.
#define TEXT_SIZE 256 |
Definition at line 264 of file chan_oss.c.
Referenced by console_sendtext(), and console_sendtext_deprecated().
#define WARN_frag 4 |
#define WARN_speed 2 |
#define WARN_used_blocks 1 |
static int __console_mute_unmute | ( | int | mute | ) | [static] |
Definition at line 1413 of file chan_oss.c.
References find_desc(), chan_oss_pvt::mute, oss_active, and RESULT_SUCCESS.
Referenced by console_mute(), console_mute_deprecated(), console_unmute(), and console_unmute_deprecated().
01414 { 01415 struct chan_oss_pvt *o = find_desc(oss_active); 01416 01417 o->mute = mute; 01418 return RESULT_SUCCESS; 01419 }
static void __reg_module | ( | void | ) | [static] |
Definition at line 1899 of file chan_oss.c.
static void __unreg_module | ( | void | ) | [static] |
Definition at line 1899 of file chan_oss.c.
static char* ast_ext_ctx | ( | const char * | src, | |
char ** | ext, | |||
char ** | ctx | |||
) | [static] |
Definition at line 462 of file chan_oss.c.
References ast_strdup, find_desc(), and chan_oss_pvt::overridecontext.
Referenced by console_dial(), console_dial_deprecated(), console_transfer(), and console_transfer_deprecated().
00463 { 00464 struct chan_oss_pvt *o = find_desc(oss_active); 00465 00466 if (ext == NULL || ctx == NULL) 00467 return NULL; /* error */ 00468 00469 *ext = *ctx = NULL; 00470 00471 if (src && *src != '\0') 00472 *ext = ast_strdup(src); 00473 00474 if (*ext == NULL) 00475 return NULL; 00476 00477 if (!o->overridecontext) { 00478 /* parse from the right */ 00479 *ctx = strrchr(*ext, '@'); 00480 if (*ctx) 00481 *(*ctx)++ = '\0'; 00482 } 00483 00484 return *ext; 00485 }
static char* autoanswer_complete | ( | const char * | line, | |
const char * | word, | |||
int | pos, | |||
int | state | |||
) | [static] |
Definition at line 1121 of file chan_oss.c.
References ast_cli_complete().
01122 { 01123 static char *choices[] = { "on", "off", NULL }; 01124 01125 return (pos != 3) ? NULL : ast_cli_complete(word, choices, state); 01126 }
static char* autoanswer_complete_deprecated | ( | const char * | line, | |
const char * | word, | |||
int | pos, | |||
int | state | |||
) | [static] |
Definition at line 1114 of file chan_oss.c.
References ast_cli_complete().
01115 { 01116 static char *choices[] = { "on", "off", NULL }; 01117 01118 return (pos != 2) ? NULL : ast_cli_complete(word, choices, state); 01119 }
static int console_active | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 1547 of file chan_oss.c.
References ast_cli(), find_desc(), chan_oss_pvt::name, chan_oss_pvt::next, oss_active, oss_default, RESULT_SHOWUSAGE, and RESULT_SUCCESS.
01548 { 01549 if (argc == 2) 01550 ast_cli(fd, "active console is [%s]\n", oss_active); 01551 else if (argc != 3) 01552 return RESULT_SHOWUSAGE; 01553 else { 01554 struct chan_oss_pvt *o; 01555 if (strcmp(argv[2], "show") == 0) { 01556 for (o = oss_default.next; o; o = o->next) 01557 ast_cli(fd, "device [%s] exists\n", o->name); 01558 return RESULT_SUCCESS; 01559 } 01560 o = find_desc(argv[2]); 01561 if (o == NULL) 01562 ast_cli(fd, "No device [%s] exists\n", argv[2]); 01563 else 01564 oss_active = o->name; 01565 } 01566 return RESULT_SUCCESS; 01567 }
static int console_active_deprecated | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 1525 of file chan_oss.c.
References ast_cli(), find_desc(), chan_oss_pvt::name, chan_oss_pvt::next, oss_active, oss_default, RESULT_SHOWUSAGE, and RESULT_SUCCESS.
01526 { 01527 if (argc == 1) 01528 ast_cli(fd, "active console is [%s]\n", oss_active); 01529 else if (argc != 2) 01530 return RESULT_SHOWUSAGE; 01531 else { 01532 struct chan_oss_pvt *o; 01533 if (strcmp(argv[1], "show") == 0) { 01534 for (o = oss_default.next; o; o = o->next) 01535 ast_cli(fd, "device [%s] exists\n", o->name); 01536 return RESULT_SUCCESS; 01537 } 01538 o = find_desc(argv[1]); 01539 if (o == NULL) 01540 ast_cli(fd, "No device [%s] exists\n", argv[1]); 01541 else 01542 oss_active = o->name; 01543 } 01544 return RESULT_SUCCESS; 01545 }
static int console_answer | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 1159 of file chan_oss.c.
References ast_cli(), AST_CONTROL_ANSWER, AST_FRAME_CONTROL, ast_queue_frame(), chan_oss_pvt::cursound, f, find_desc(), chan_oss_pvt::hookstate, chan_oss_pvt::nosound, oss_active, chan_oss_pvt::owner, RESULT_FAILURE, RESULT_SHOWUSAGE, RESULT_SUCCESS, and ring().
01160 { 01161 struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_ANSWER }; 01162 struct chan_oss_pvt *o = find_desc(oss_active); 01163 01164 if (argc != 2) 01165 return RESULT_SHOWUSAGE; 01166 if (!o->owner) { 01167 ast_cli(fd, "No one is calling us\n"); 01168 return RESULT_FAILURE; 01169 } 01170 o->hookstate = 1; 01171 o->cursound = -1; 01172 o->nosound = 0; 01173 ast_queue_frame(o->owner, &f); 01174 #if 0 01175 /* XXX do we really need it ? considering we shut down immediately... */ 01176 ring(o, AST_CONTROL_ANSWER); 01177 #endif 01178 return RESULT_SUCCESS; 01179 }
static int console_answer_deprecated | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 1137 of file chan_oss.c.
References ast_cli(), AST_CONTROL_ANSWER, AST_FRAME_CONTROL, ast_queue_frame(), chan_oss_pvt::cursound, f, find_desc(), chan_oss_pvt::hookstate, chan_oss_pvt::nosound, oss_active, chan_oss_pvt::owner, RESULT_FAILURE, RESULT_SHOWUSAGE, RESULT_SUCCESS, and ring().
01138 { 01139 struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_ANSWER }; 01140 struct chan_oss_pvt *o = find_desc(oss_active); 01141 01142 if (argc != 1) 01143 return RESULT_SHOWUSAGE; 01144 if (!o->owner) { 01145 ast_cli(fd, "No one is calling us\n"); 01146 return RESULT_FAILURE; 01147 } 01148 o->hookstate = 1; 01149 o->cursound = -1; 01150 o->nosound = 0; 01151 ast_queue_frame(o->owner, &f); 01152 #if 0 01153 /* XXX do we really need it ? considering we shut down immediately... */ 01154 ring(o, AST_CONTROL_ANSWER); 01155 #endif 01156 return RESULT_SUCCESS; 01157 }
static int console_autoanswer | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 1090 of file chan_oss.c.
References ast_cli(), ast_log(), chan_oss_pvt::autoanswer, find_desc(), LOG_WARNING, oss_active, RESULT_FAILURE, RESULT_SHOWUSAGE, and RESULT_SUCCESS.
01091 { 01092 struct chan_oss_pvt *o = find_desc(oss_active); 01093 01094 if (argc == 2) { 01095 ast_cli(fd, "Auto answer is %s.\n", o->autoanswer ? "on" : "off"); 01096 return RESULT_SUCCESS; 01097 } 01098 if (argc != 3) 01099 return RESULT_SHOWUSAGE; 01100 if (o == NULL) { 01101 ast_log(LOG_WARNING, "Cannot find device %s (should not happen!)\n", 01102 oss_active); 01103 return RESULT_FAILURE; 01104 } 01105 if (!strcasecmp(argv[2], "on")) 01106 o->autoanswer = -1; 01107 else if (!strcasecmp(argv[2], "off")) 01108 o->autoanswer = 0; 01109 else 01110 return RESULT_SHOWUSAGE; 01111 return RESULT_SUCCESS; 01112 }
static int console_autoanswer_deprecated | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 1067 of file chan_oss.c.
References ast_cli(), ast_log(), chan_oss_pvt::autoanswer, find_desc(), LOG_WARNING, oss_active, RESULT_FAILURE, RESULT_SHOWUSAGE, and RESULT_SUCCESS.
01068 { 01069 struct chan_oss_pvt *o = find_desc(oss_active); 01070 01071 if (argc == 1) { 01072 ast_cli(fd, "Auto answer is %s.\n", o->autoanswer ? "on" : "off"); 01073 return RESULT_SUCCESS; 01074 } 01075 if (argc != 2) 01076 return RESULT_SHOWUSAGE; 01077 if (o == NULL) { 01078 ast_log(LOG_WARNING, "Cannot find device %s (should not happen!)\n", oss_active); 01079 return RESULT_FAILURE; 01080 } 01081 if (!strcasecmp(argv[1], "on")) 01082 o->autoanswer = -1; 01083 else if (!strcasecmp(argv[1], "off")) 01084 o->autoanswer = 0; 01085 else 01086 return RESULT_SHOWUSAGE; 01087 return RESULT_SUCCESS; 01088 }
static int console_dial | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 1368 of file chan_oss.c.
References ast_cli(), ast_exists_extension(), ast_ext_ctx(), AST_FRAME_DTMF, ast_queue_frame(), AST_STATE_RINGING, chan_oss_pvt::ctx, chan_oss_pvt::ext, f, find_desc(), free, chan_oss_pvt::hookstate, oss_active, oss_new(), chan_oss_pvt::owner, RESULT_FAILURE, RESULT_SHOWUSAGE, RESULT_SUCCESS, and s.
01369 { 01370 char *s = NULL, *mye = NULL, *myc = NULL; 01371 struct chan_oss_pvt *o = find_desc(oss_active); 01372 01373 if (argc != 2 && argc != 3) 01374 return RESULT_SHOWUSAGE; 01375 if (o->owner) { /* already in a call */ 01376 int i; 01377 struct ast_frame f = { AST_FRAME_DTMF, 0 }; 01378 01379 if (argc == 2) { /* argument is mandatory here */ 01380 ast_cli(fd, "Already in a call. You can only dial digits until you hangup.\n"); 01381 return RESULT_FAILURE; 01382 } 01383 s = argv[2]; 01384 /* send the string one char at a time */ 01385 for (i = 0; i < strlen(s); i++) { 01386 f.subclass = s[i]; 01387 ast_queue_frame(o->owner, &f); 01388 } 01389 return RESULT_SUCCESS; 01390 } 01391 /* if we have an argument split it into extension and context */ 01392 if (argc == 3) 01393 s = ast_ext_ctx(argv[2], &mye, &myc); 01394 /* supply default values if needed */ 01395 if (mye == NULL) 01396 mye = o->ext; 01397 if (myc == NULL) 01398 myc = o->ctx; 01399 if (ast_exists_extension(NULL, myc, mye, 1, NULL)) { 01400 o->hookstate = 1; 01401 oss_new(o, mye, myc, AST_STATE_RINGING); 01402 } else 01403 ast_cli(fd, "No such extension '%s' in context '%s'\n", mye, myc); 01404 if (s) 01405 free(s); 01406 return RESULT_SUCCESS; 01407 }
static int console_dial_deprecated | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 1327 of file chan_oss.c.
References ast_cli(), ast_exists_extension(), ast_ext_ctx(), AST_FRAME_DTMF, ast_queue_frame(), AST_STATE_RINGING, chan_oss_pvt::ctx, chan_oss_pvt::ext, f, find_desc(), free, chan_oss_pvt::hookstate, oss_active, oss_new(), chan_oss_pvt::owner, RESULT_FAILURE, RESULT_SHOWUSAGE, RESULT_SUCCESS, and s.
01328 { 01329 char *s = NULL, *mye = NULL, *myc = NULL; 01330 struct chan_oss_pvt *o = find_desc(oss_active); 01331 01332 if (argc != 1 && argc != 2) 01333 return RESULT_SHOWUSAGE; 01334 if (o->owner) { /* already in a call */ 01335 int i; 01336 struct ast_frame f = { AST_FRAME_DTMF, 0 }; 01337 01338 if (argc == 1) { /* argument is mandatory here */ 01339 ast_cli(fd, "Already in a call. You can only dial digits until you hangup.\n"); 01340 return RESULT_FAILURE; 01341 } 01342 s = argv[1]; 01343 /* send the string one char at a time */ 01344 for (i = 0; i < strlen(s); i++) { 01345 f.subclass = s[i]; 01346 ast_queue_frame(o->owner, &f); 01347 } 01348 return RESULT_SUCCESS; 01349 } 01350 /* if we have an argument split it into extension and context */ 01351 if (argc == 2) 01352 s = ast_ext_ctx(argv[1], &mye, &myc); 01353 /* supply default values if needed */ 01354 if (mye == NULL) 01355 mye = o->ext; 01356 if (myc == NULL) 01357 myc = o->ctx; 01358 if (ast_exists_extension(NULL, myc, mye, 1, NULL)) { 01359 o->hookstate = 1; 01360 oss_new(o, mye, myc, AST_STATE_RINGING); 01361 } else 01362 ast_cli(fd, "No such extension '%s' in context '%s'\n", mye, myc); 01363 if (s) 01364 free(s); 01365 return RESULT_SUCCESS; 01366 }
static int console_flash | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 1304 of file chan_oss.c.
References ast_cli(), AST_CONTROL_FLASH, AST_FRAME_CONTROL, ast_queue_frame(), chan_oss_pvt::cursound, f, find_desc(), chan_oss_pvt::hookstate, chan_oss_pvt::nosound, oss_active, chan_oss_pvt::owner, RESULT_FAILURE, RESULT_SHOWUSAGE, and RESULT_SUCCESS.
01305 { 01306 struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_FLASH }; 01307 struct chan_oss_pvt *o = find_desc(oss_active); 01308 01309 if (argc != 2) 01310 return RESULT_SHOWUSAGE; 01311 o->cursound = -1; 01312 o->nosound = 0; /* when cursound is -1 nosound must be 0 */ 01313 if (!o->owner) { /* XXX maybe !o->hookstate too ? */ 01314 ast_cli(fd, "No call to flash\n"); 01315 return RESULT_FAILURE; 01316 } 01317 o->hookstate = 0; 01318 if (o->owner) /* XXX must be true, right ? */ 01319 ast_queue_frame(o->owner, &f); 01320 return RESULT_SUCCESS; 01321 }
static int console_flash_deprecated | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 1285 of file chan_oss.c.
References ast_cli(), AST_CONTROL_FLASH, AST_FRAME_CONTROL, ast_queue_frame(), chan_oss_pvt::cursound, f, find_desc(), chan_oss_pvt::hookstate, chan_oss_pvt::nosound, oss_active, chan_oss_pvt::owner, RESULT_FAILURE, RESULT_SHOWUSAGE, and RESULT_SUCCESS.
01286 { 01287 struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_FLASH }; 01288 struct chan_oss_pvt *o = find_desc(oss_active); 01289 01290 if (argc != 1) 01291 return RESULT_SHOWUSAGE; 01292 o->cursound = -1; 01293 o->nosound = 0; /* when cursound is -1 nosound must be 0 */ 01294 if (!o->owner) { /* XXX maybe !o->hookstate too ? */ 01295 ast_cli(fd, "No call to flash\n"); 01296 return RESULT_FAILURE; 01297 } 01298 o->hookstate = 0; 01299 if (o->owner) /* XXX must be true, right ? */ 01300 ast_queue_frame(o->owner, &f); 01301 return RESULT_SUCCESS; 01302 }
static int console_hangup | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 1262 of file chan_oss.c.
References ast_cli(), ast_queue_hangup(), chan_oss_pvt::cursound, find_desc(), chan_oss_pvt::hookstate, chan_oss_pvt::nosound, O_CLOSE, oss_active, chan_oss_pvt::owner, RESULT_FAILURE, RESULT_SHOWUSAGE, RESULT_SUCCESS, and setformat().
01263 { 01264 struct chan_oss_pvt *o = find_desc(oss_active); 01265 01266 if (argc != 2) 01267 return RESULT_SHOWUSAGE; 01268 o->cursound = -1; 01269 o->nosound = 0; 01270 if (!o->owner && !o->hookstate) { /* XXX maybe only one ? */ 01271 ast_cli(fd, "No call to hang up\n"); 01272 return RESULT_FAILURE; 01273 } 01274 o->hookstate = 0; 01275 if (o->owner) 01276 ast_queue_hangup(o->owner); 01277 setformat(o, O_CLOSE); 01278 return RESULT_SUCCESS; 01279 }
static int console_hangup_deprecated | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 1243 of file chan_oss.c.
References ast_cli(), ast_queue_hangup(), chan_oss_pvt::cursound, find_desc(), chan_oss_pvt::hookstate, chan_oss_pvt::nosound, O_CLOSE, oss_active, chan_oss_pvt::owner, RESULT_FAILURE, RESULT_SHOWUSAGE, RESULT_SUCCESS, and setformat().
01244 { 01245 struct chan_oss_pvt *o = find_desc(oss_active); 01246 01247 if (argc != 1) 01248 return RESULT_SHOWUSAGE; 01249 o->cursound = -1; 01250 o->nosound = 0; 01251 if (!o->owner && !o->hookstate) { /* XXX maybe only one ? */ 01252 ast_cli(fd, "No call to hang up\n"); 01253 return RESULT_FAILURE; 01254 } 01255 o->hookstate = 0; 01256 if (o->owner) 01257 ast_queue_hangup(o->owner); 01258 setformat(o, O_CLOSE); 01259 return RESULT_SUCCESS; 01260 }
static int console_mute | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 1429 of file chan_oss.c.
References __console_mute_unmute(), and RESULT_SHOWUSAGE.
01430 { 01431 if (argc != 2) 01432 return RESULT_SHOWUSAGE; 01433 01434 return __console_mute_unmute(1); 01435 }
static int console_mute_deprecated | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 1421 of file chan_oss.c.
References __console_mute_unmute(), and RESULT_SHOWUSAGE.
01422 { 01423 if (argc != 1) 01424 return RESULT_SHOWUSAGE; 01425 01426 return __console_mute_unmute(1); 01427 }
static int console_sendtext | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 1214 of file chan_oss.c.
References ast_cli(), AST_FRAME_TEXT, ast_join(), ast_queue_frame(), ast_strlen_zero(), f, find_desc(), oss_active, chan_oss_pvt::owner, RESULT_FAILURE, RESULT_SHOWUSAGE, RESULT_SUCCESS, and TEXT_SIZE.
01215 { 01216 struct chan_oss_pvt *o = find_desc(oss_active); 01217 char buf[TEXT_SIZE]; 01218 01219 if (argc < 3) 01220 return RESULT_SHOWUSAGE; 01221 if (!o->owner) { 01222 ast_cli(fd, "Not in a call\n"); 01223 return RESULT_FAILURE; 01224 } 01225 ast_join(buf, sizeof(buf) - 1, argv + 3); 01226 if (!ast_strlen_zero(buf)) { 01227 struct ast_frame f = { 0, }; 01228 int i = strlen(buf); 01229 buf[i] = '\n'; 01230 f.frametype = AST_FRAME_TEXT; 01231 f.subclass = 0; 01232 f.data = buf; 01233 f.datalen = i + 1; 01234 ast_queue_frame(o->owner, &f); 01235 } 01236 return RESULT_SUCCESS; 01237 }
static int console_sendtext_deprecated | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 1189 of file chan_oss.c.
References ast_cli(), AST_FRAME_TEXT, ast_join(), ast_queue_frame(), ast_strlen_zero(), f, find_desc(), oss_active, chan_oss_pvt::owner, RESULT_FAILURE, RESULT_SHOWUSAGE, RESULT_SUCCESS, and TEXT_SIZE.
01190 { 01191 struct chan_oss_pvt *o = find_desc(oss_active); 01192 char buf[TEXT_SIZE]; 01193 01194 if (argc < 2) 01195 return RESULT_SHOWUSAGE; 01196 if (!o->owner) { 01197 ast_cli(fd, "Not in a call\n"); 01198 return RESULT_FAILURE; 01199 } 01200 ast_join(buf, sizeof(buf) - 1, argv + 2); 01201 if (!ast_strlen_zero(buf)) { 01202 struct ast_frame f = { 0, }; 01203 int i = strlen(buf); 01204 buf[i] = '\n'; 01205 f.frametype = AST_FRAME_TEXT; 01206 f.subclass = 0; 01207 f.data = buf; 01208 f.datalen = i + 1; 01209 ast_queue_frame(o->owner, &f); 01210 } 01211 return RESULT_SUCCESS; 01212 }
static int console_transfer | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 1490 of file chan_oss.c.
References ast_async_goto(), ast_bridged_channel(), ast_cli(), ast_exists_extension(), ast_ext_ctx(), ast_channel::cid, ast_callerid::cid_num, ast_channel::context, ext, find_desc(), free, ast_channel::name, oss_active, chan_oss_pvt::owner, RESULT_FAILURE, RESULT_SHOWUSAGE, and RESULT_SUCCESS.
01491 { 01492 struct chan_oss_pvt *o = find_desc(oss_active); 01493 struct ast_channel *b = NULL; 01494 char *tmp, *ext, *ctx; 01495 01496 if (argc != 3) 01497 return RESULT_SHOWUSAGE; 01498 if (o == NULL) 01499 return RESULT_FAILURE; 01500 if (o->owner == NULL || (b = ast_bridged_channel(o->owner)) == NULL) { 01501 ast_cli(fd, "There is no call to transfer\n"); 01502 return RESULT_SUCCESS; 01503 } 01504 01505 tmp = ast_ext_ctx(argv[2], &ext, &ctx); 01506 if (ctx == NULL) /* supply default context if needed */ 01507 ctx = o->owner->context; 01508 if (!ast_exists_extension(b, ctx, ext, 1, b->cid.cid_num)) 01509 ast_cli(fd, "No such extension exists\n"); 01510 else { 01511 ast_cli(fd, "Whee, transferring %s to %s@%s.\n", b->name, ext, ctx); 01512 if (ast_async_goto(b, ctx, ext, 1)) 01513 ast_cli(fd, "Failed to transfer :(\n"); 01514 } 01515 if (tmp) 01516 free(tmp); 01517 return RESULT_SUCCESS; 01518 }
static int console_transfer_deprecated | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 1459 of file chan_oss.c.
References ast_async_goto(), ast_bridged_channel(), ast_cli(), ast_exists_extension(), ast_ext_ctx(), ast_channel::cid, ast_callerid::cid_num, ast_channel::context, ext, find_desc(), free, ast_channel::name, oss_active, chan_oss_pvt::owner, RESULT_FAILURE, RESULT_SHOWUSAGE, and RESULT_SUCCESS.
01460 { 01461 struct chan_oss_pvt *o = find_desc(oss_active); 01462 struct ast_channel *b = NULL; 01463 char *tmp, *ext, *ctx; 01464 01465 if (argc != 2) 01466 return RESULT_SHOWUSAGE; 01467 if (o == NULL) 01468 return RESULT_FAILURE; 01469 if (o->owner ==NULL || (b = ast_bridged_channel(o->owner)) == NULL) { 01470 ast_cli(fd, "There is no call to transfer\n"); 01471 return RESULT_SUCCESS; 01472 } 01473 01474 tmp = ast_ext_ctx(argv[1], &ext, &ctx); 01475 if (ctx == NULL) /* supply default context if needed */ 01476 ctx = o->owner->context; 01477 if (!ast_exists_extension(b, ctx, ext, 1, b->cid.cid_num)) 01478 ast_cli(fd, "No such extension exists\n"); 01479 else { 01480 ast_cli(fd, "Whee, transferring %s to %s@%s.\n", 01481 b->name, ext, ctx); 01482 if (ast_async_goto(b, ctx, ext, 1)) 01483 ast_cli(fd, "Failed to transfer :(\n"); 01484 } 01485 if (tmp) 01486 free(tmp); 01487 return RESULT_SUCCESS; 01488 }
static int console_unmute | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 1448 of file chan_oss.c.
References __console_mute_unmute(), and RESULT_SHOWUSAGE.
01449 { 01450 if (argc != 2) 01451 return RESULT_SHOWUSAGE; 01452 01453 return __console_mute_unmute(0); 01454 }
static int console_unmute_deprecated | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 1440 of file chan_oss.c.
References __console_mute_unmute(), and RESULT_SHOWUSAGE.
01441 { 01442 if (argc != 1) 01443 return RESULT_SHOWUSAGE; 01444 01445 return __console_mute_unmute(0); 01446 }
static int do_boost | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 1597 of file chan_oss.c.
References ast_cli(), chan_oss_pvt::boost, BOOST_SCALE, find_desc(), oss_active, RESULT_SUCCESS, and store_boost().
01598 { 01599 struct chan_oss_pvt *o = find_desc(oss_active); 01600 01601 if (argc == 2) 01602 ast_cli(fd, "boost currently %5.1f\n", 20 * log10(((double) o->boost / (double) BOOST_SCALE))); 01603 else if (argc == 3) 01604 store_boost(o, argv[2]); 01605 return RESULT_SUCCESS; 01606 }
static struct chan_oss_pvt* find_desc | ( | char * | dev | ) | [static] |
Definition at line 438 of file chan_oss.c.
References ast_log(), LOG_WARNING, chan_oss_pvt::name, chan_oss_pvt::next, and oss_default.
Referenced by __console_mute_unmute(), ast_ext_ctx(), console_active(), console_active_deprecated(), console_answer(), console_answer_deprecated(), console_autoanswer(), console_autoanswer_deprecated(), console_dial(), console_dial_deprecated(), console_flash(), console_flash_deprecated(), console_hangup(), console_hangup_deprecated(), console_sendtext(), console_sendtext_deprecated(), console_transfer(), console_transfer_deprecated(), do_boost(), load_module(), and oss_request().
00439 { 00440 struct chan_oss_pvt *o = NULL; 00441 00442 if (!dev) 00443 ast_log(LOG_WARNING, "null dev\n"); 00444 00445 for (o = oss_default.next; o && o->name && dev && strcmp(o->name, dev) != 0; o = o->next); 00446 00447 if (!o) 00448 ast_log(LOG_WARNING, "could not find <%s>\n", dev ? dev : "--no-device--"); 00449 00450 return o; 00451 }
static int load_module | ( | void | ) | [static] |
Definition at line 1838 of file chan_oss.c.
References ast_category_browse(), ast_channel_register(), ast_cli_register_multiple(), ast_config_destroy(), ast_config_load(), ast_log(), AST_MODULE_LOAD_DECLINE, AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_SUCCESS, cli_oss, default_jbconf, find_desc(), global_jbconf, LOG_ERROR, LOG_NOTICE, oss_active, oss_tech, and store_config().
01839 { 01840 struct ast_config *cfg = NULL; 01841 char *ctg = NULL; 01842 01843 /* Copy the default jb config over global_jbconf */ 01844 memcpy(&global_jbconf, &default_jbconf, sizeof(struct ast_jb_conf)); 01845 01846 /* load config file */ 01847 if (!(cfg = ast_config_load(config))) { 01848 ast_log(LOG_NOTICE, "Unable to load config %s\n", config); 01849 return AST_MODULE_LOAD_DECLINE; 01850 } 01851 01852 do { 01853 store_config(cfg, ctg); 01854 } while ( (ctg = ast_category_browse(cfg, ctg)) != NULL); 01855 01856 ast_config_destroy(cfg); 01857 01858 if (find_desc(oss_active) == NULL) { 01859 ast_log(LOG_NOTICE, "Device %s not found\n", oss_active); 01860 /* XXX we could default to 'dsp' perhaps ? */ 01861 /* XXX should cleanup allocated memory etc. */ 01862 return AST_MODULE_LOAD_FAILURE; 01863 } 01864 01865 if (ast_channel_register(&oss_tech)) { 01866 ast_log(LOG_ERROR, "Unable to register channel type 'OSS'\n"); 01867 return AST_MODULE_LOAD_FAILURE; 01868 } 01869 01870 ast_cli_register_multiple(cli_oss, sizeof(cli_oss) / sizeof(struct ast_cli_entry)); 01871 01872 return AST_MODULE_LOAD_SUCCESS; 01873 }
static int oss_answer | ( | struct ast_channel * | c | ) | [static] |
Definition at line 824 of file chan_oss.c.
References AST_CONTROL_ANSWER, ast_setstate(), AST_STATE_UP, ast_verbose(), chan_oss_pvt::cursound, chan_oss_pvt::nosound, ring(), and ast_channel::tech_pvt.
00825 { 00826 struct chan_oss_pvt *o = c->tech_pvt; 00827 00828 ast_verbose(" << Console call has been answered >> \n"); 00829 #if 0 00830 /* play an answer tone (XXX do we really need it ?) */ 00831 ring(o, AST_CONTROL_ANSWER); 00832 #endif 00833 ast_setstate(c, AST_STATE_UP); 00834 o->cursound = -1; 00835 o->nosound = 0; 00836 return 0; 00837 }
static int oss_call | ( | struct ast_channel * | c, | |
char * | dest, | |||
int | timeout | |||
) | [static] |
Definition at line 800 of file chan_oss.c.
References AST_CONTROL_ANSWER, AST_CONTROL_RING, AST_CONTROL_RINGING, AST_FRAME_CONTROL, ast_queue_frame(), ast_verbose(), chan_oss_pvt::autoanswer, ast_channel::cid, ast_callerid::cid_dnid, ast_callerid::cid_name, ast_callerid::cid_num, ast_callerid::cid_rdnis, f, ring(), and ast_channel::tech_pvt.
00801 { 00802 struct chan_oss_pvt *o = c->tech_pvt; 00803 struct ast_frame f = { 0, }; 00804 00805 ast_verbose(" << Call to device '%s' dnid '%s' rdnis '%s' on console from '%s' <%s> >>\n", dest, c->cid.cid_dnid, c->cid.cid_rdnis, c->cid.cid_name, c->cid.cid_num); 00806 if (o->autoanswer) { 00807 ast_verbose(" << Auto-answered >> \n"); 00808 f.frametype = AST_FRAME_CONTROL; 00809 f.subclass = AST_CONTROL_ANSWER; 00810 ast_queue_frame(c, &f); 00811 } else { 00812 ast_verbose("<< Type 'answer' to answer, or use 'autoanswer' for future calls >> \n"); 00813 f.frametype = AST_FRAME_CONTROL; 00814 f.subclass = AST_CONTROL_RINGING; 00815 ast_queue_frame(c, &f); 00816 ring(o, AST_CONTROL_RING); 00817 } 00818 return 0; 00819 }
static int oss_digit_begin | ( | struct ast_channel * | c, | |
char | digit | |||
) | [static] |
static int oss_digit_end | ( | struct ast_channel * | c, | |
char | digit, | |||
unsigned int | duration | |||
) | [static] |
Definition at line 773 of file chan_oss.c.
References ast_verbose().
00774 { 00775 /* no better use for received digits than print them */ 00776 ast_verbose(" << Console Received digit %c of duration %u ms >> \n", 00777 digit, duration); 00778 return 0; 00779 }
static int oss_fixup | ( | struct ast_channel * | oldchan, | |
struct ast_channel * | newchan | |||
) | [static] |
Definition at line 948 of file chan_oss.c.
References chan_oss_pvt::owner, and ast_channel::tech_pvt.
00949 { 00950 struct chan_oss_pvt *o = newchan->tech_pvt; 00951 o->owner = newchan; 00952 return 0; 00953 }
static int oss_hangup | ( | struct ast_channel * | c | ) | [static] |
Definition at line 839 of file chan_oss.c.
References AST_CONTROL_CONGESTION, ast_module_unref(), ast_verbose(), chan_oss_pvt::autoanswer, chan_oss_pvt::autohangup, chan_oss_pvt::cursound, chan_oss_pvt::hookstate, chan_oss_pvt::nosound, O_CLOSE, chan_oss_pvt::owner, ring(), setformat(), and ast_channel::tech_pvt.
00840 { 00841 struct chan_oss_pvt *o = c->tech_pvt; 00842 00843 o->cursound = -1; 00844 o->nosound = 0; 00845 c->tech_pvt = NULL; 00846 o->owner = NULL; 00847 ast_verbose(" << Hangup on console >> \n"); 00848 ast_module_unref(ast_module_info->self); 00849 if (o->hookstate) { 00850 if (o->autoanswer || o->autohangup) { 00851 /* Assume auto-hangup too */ 00852 o->hookstate = 0; 00853 setformat(o, O_CLOSE); 00854 } else { 00855 /* Make congestion noise */ 00856 ring(o, AST_CONTROL_CONGESTION); 00857 } 00858 } 00859 return 0; 00860 }
static int oss_indicate | ( | struct ast_channel * | chan, | |
int | cond, | |||
const void * | data, | |||
size_t | datalen | |||
) | [static] |
Definition at line 955 of file chan_oss.c.
References AST_CONTROL_BUSY, AST_CONTROL_CONGESTION, AST_CONTROL_HOLD, AST_CONTROL_RINGING, AST_CONTROL_SRCUPDATE, AST_CONTROL_UNHOLD, AST_CONTROL_VIDUPDATE, ast_log(), ast_moh_start(), ast_moh_stop(), ast_verbose(), chan_oss_pvt::cursound, LOG_WARNING, chan_oss_pvt::mohinterpret, ast_channel::name, chan_oss_pvt::nosound, ring(), and ast_channel::tech_pvt.
00956 { 00957 struct chan_oss_pvt *o = c->tech_pvt; 00958 int res = -1; 00959 00960 switch (cond) { 00961 case AST_CONTROL_BUSY: 00962 case AST_CONTROL_CONGESTION: 00963 case AST_CONTROL_RINGING: 00964 res = cond; 00965 break; 00966 00967 case -1: 00968 o->cursound = -1; 00969 o->nosound = 0; /* when cursound is -1 nosound must be 0 */ 00970 return 0; 00971 00972 case AST_CONTROL_VIDUPDATE: 00973 res = -1; 00974 break; 00975 case AST_CONTROL_HOLD: 00976 ast_verbose(" << Console Has Been Placed on Hold >> \n"); 00977 ast_moh_start(c, data, o->mohinterpret); 00978 break; 00979 case AST_CONTROL_UNHOLD: 00980 ast_verbose(" << Console Has Been Retrieved from Hold >> \n"); 00981 ast_moh_stop(c); 00982 break; 00983 case AST_CONTROL_SRCUPDATE: 00984 break; 00985 default: 00986 ast_log(LOG_WARNING, "Don't know how to display condition %d on %s\n", cond, c->name); 00987 return -1; 00988 } 00989 00990 if (res > -1) 00991 ring(o, res); 00992 00993 return 0; 00994 }
static struct ast_channel* oss_new | ( | struct chan_oss_pvt * | o, | |
char * | ext, | |||
char * | ctx, | |||
int | state | |||
) | [static] |
Definition at line 999 of file chan_oss.c.
References ast_channel_alloc(), AST_FORMAT_SLINEAR, ast_hangup(), ast_jb_configure(), ast_log(), ast_module_ref(), ast_pbx_start(), AST_STATE_DOWN, ast_strdup, ast_string_field_set, ast_strlen_zero(), ast_channel::cid, ast_callerid::cid_ani, ast_callerid::cid_dnid, chan_oss_pvt::cid_name, chan_oss_pvt::cid_num, chan_oss_pvt::device, ast_channel::fds, global_jbconf, language, chan_oss_pvt::language, LOG_WARNING, ast_channel::nativeformats, oss_tech, chan_oss_pvt::owner, ast_channel::readformat, setformat(), chan_oss_pvt::sounddev, ast_channel::tech, ast_channel::tech_pvt, and ast_channel::writeformat.
Referenced by console_dial(), console_dial_deprecated(), and oss_request().
01000 { 01001 struct ast_channel *c; 01002 01003 c = ast_channel_alloc(1, state, o->cid_num, o->cid_name, "", ext, ctx, 0, "Console/%s", o->device + 5); 01004 if (c == NULL) 01005 return NULL; 01006 c->tech = &oss_tech; 01007 if (o->sounddev < 0) 01008 setformat(o, O_RDWR); 01009 c->fds[0] = o->sounddev; /* -1 if device closed, override later */ 01010 c->nativeformats = AST_FORMAT_SLINEAR; 01011 c->readformat = AST_FORMAT_SLINEAR; 01012 c->writeformat = AST_FORMAT_SLINEAR; 01013 c->tech_pvt = o; 01014 01015 if (!ast_strlen_zero(o->language)) 01016 ast_string_field_set(c, language, o->language); 01017 /* Don't use ast_set_callerid() here because it will 01018 * generate a needless NewCallerID event */ 01019 c->cid.cid_ani = ast_strdup(o->cid_num); 01020 if (!ast_strlen_zero(ext)) 01021 c->cid.cid_dnid = ast_strdup(ext); 01022 01023 o->owner = c; 01024 ast_module_ref(ast_module_info->self); 01025 ast_jb_configure(c, &global_jbconf); 01026 if (state != AST_STATE_DOWN) { 01027 if (ast_pbx_start(c)) { 01028 ast_log(LOG_WARNING, "Unable to start PBX on %s\n", c->name); 01029 ast_hangup(c); 01030 o->owner = c = NULL; 01031 /* XXX what about the channel itself ? */ 01032 /* XXX what about usecnt ? */ 01033 } 01034 } 01035 01036 return c; 01037 }
static struct ast_frame * oss_read | ( | struct ast_channel * | chan | ) | [static] |
Definition at line 899 of file chan_oss.c.
References ast_channel::_state, AST_FORMAT_SLINEAR, AST_FRAME_NULL, AST_FRAME_VOICE, AST_FRIENDLY_OFFSET, AST_STATE_UP, chan_oss_pvt::boost, BOOST_SCALE, f, FRAME_SIZE, chan_oss_pvt::mute, chan_oss_pvt::oss_read_buf, oss_tech, chan_oss_pvt::read_f, chan_oss_pvt::readpos, chan_oss_pvt::sounddev, ast_channel::tech_pvt, and ast_channel_tech::type.
00900 { 00901 int res; 00902 struct chan_oss_pvt *o = c->tech_pvt; 00903 struct ast_frame *f = &o->read_f; 00904 00905 /* XXX can be simplified returning &ast_null_frame */ 00906 /* prepare a NULL frame in case we don't have enough data to return */ 00907 bzero(f, sizeof(struct ast_frame)); 00908 f->frametype = AST_FRAME_NULL; 00909 f->src = oss_tech.type; 00910 00911 res = read(o->sounddev, o->oss_read_buf + o->readpos, sizeof(o->oss_read_buf) - o->readpos); 00912 if (res < 0) /* audio data not ready, return a NULL frame */ 00913 return f; 00914 00915 o->readpos += res; 00916 if (o->readpos < sizeof(o->oss_read_buf)) /* not enough samples */ 00917 return f; 00918 00919 if (o->mute) 00920 return f; 00921 00922 o->readpos = AST_FRIENDLY_OFFSET; /* reset read pointer for next frame */ 00923 if (c->_state != AST_STATE_UP) /* drop data if frame is not up */ 00924 return f; 00925 /* ok we can build and deliver the frame to the caller */ 00926 f->frametype = AST_FRAME_VOICE; 00927 f->subclass = AST_FORMAT_SLINEAR; 00928 f->samples = FRAME_SIZE; 00929 f->datalen = FRAME_SIZE * 2; 00930 f->data = o->oss_read_buf + AST_FRIENDLY_OFFSET; 00931 if (o->boost != BOOST_SCALE) { /* scale and clip values */ 00932 int i, x; 00933 int16_t *p = (int16_t *) f->data; 00934 for (i = 0; i < f->samples; i++) { 00935 x = (p[i] * o->boost) / BOOST_SCALE; 00936 if (x > 32767) 00937 x = 32767; 00938 else if (x < -32768) 00939 x = -32768; 00940 p[i] = x; 00941 } 00942 } 00943 00944 f->offset = AST_FRIENDLY_OFFSET; 00945 return f; 00946 }
static struct ast_channel * oss_request | ( | const char * | type, | |
int | format, | |||
void * | data, | |||
int * | cause | |||
) | [static] |
Definition at line 1039 of file chan_oss.c.
References AST_CAUSE_BUSY, AST_FORMAT_SLINEAR, ast_log(), AST_STATE_DOWN, find_desc(), LOG_NOTICE, LOG_WARNING, oss_new(), and chan_oss_pvt::owner.
01040 { 01041 struct ast_channel *c; 01042 struct chan_oss_pvt *o = find_desc(data); 01043 01044 ast_log(LOG_WARNING, "oss_request ty <%s> data 0x%p <%s>\n", type, data, (char *) data); 01045 if (o == NULL) { 01046 ast_log(LOG_NOTICE, "Device %s not found\n", (char *) data); 01047 /* XXX we could default to 'dsp' perhaps ? */ 01048 return NULL; 01049 } 01050 if ((format & AST_FORMAT_SLINEAR) == 0) { 01051 ast_log(LOG_NOTICE, "Format 0x%x unsupported\n", format); 01052 return NULL; 01053 } 01054 if (o->owner) { 01055 ast_log(LOG_NOTICE, "Already have a call (chan %p) on the OSS channel\n", o->owner); 01056 *cause = AST_CAUSE_BUSY; 01057 return NULL; 01058 } 01059 c = oss_new(o, NULL, NULL, AST_STATE_DOWN); 01060 if (c == NULL) { 01061 ast_log(LOG_WARNING, "Unable to create new OSS channel\n"); 01062 return NULL; 01063 } 01064 return c; 01065 }
static int oss_text | ( | struct ast_channel * | c, | |
const char * | text | |||
) | [static] |
Definition at line 781 of file chan_oss.c.
References ast_verbose().
00782 { 00783 /* print received messages */ 00784 ast_verbose(" << Console Received text %s >> \n", text); 00785 return 0; 00786 }
static int oss_write | ( | struct ast_channel * | chan, | |
struct ast_frame * | f | |||
) | [static] |
Definition at line 863 of file chan_oss.c.
References chan_oss_pvt::cursound, f, chan_oss_pvt::nosound, chan_oss_pvt::oss_write_buf, chan_oss_pvt::oss_write_dst, soundcard_writeframe(), and ast_channel::tech_pvt.
00864 { 00865 int src; 00866 struct chan_oss_pvt *o = c->tech_pvt; 00867 00868 /* Immediately return if no sound is enabled */ 00869 if (o->nosound) 00870 return 0; 00871 /* Stop any currently playing sound */ 00872 o->cursound = -1; 00873 /* 00874 * we could receive a block which is not a multiple of our 00875 * FRAME_SIZE, so buffer it locally and write to the device 00876 * in FRAME_SIZE chunks. 00877 * Keep the residue stored for future use. 00878 */ 00879 src = 0; /* read position into f->data */ 00880 while (src < f->datalen) { 00881 /* Compute spare room in the buffer */ 00882 int l = sizeof(o->oss_write_buf) - o->oss_write_dst; 00883 00884 if (f->datalen - src >= l) { /* enough to fill a frame */ 00885 memcpy(o->oss_write_buf + o->oss_write_dst, f->data + src, l); 00886 soundcard_writeframe(o, (short *) o->oss_write_buf); 00887 src += l; 00888 o->oss_write_dst = 0; 00889 } else { /* copy residue */ 00890 l = f->datalen - src; 00891 memcpy(o->oss_write_buf + o->oss_write_dst, f->data + src, l); 00892 src += l; /* but really, we are done */ 00893 o->oss_write_dst += l; 00894 } 00895 } 00896 return 0; 00897 }
static void ring | ( | struct chan_oss_pvt * | o, | |
int | x | |||
) | [static] |
Definition at line 789 of file chan_oss.c.
References ast_log(), errno, LOG_WARNING, and chan_oss_pvt::sndcmd.
Referenced by ast_extension_state2(), console_answer(), console_answer_deprecated(), ind_load_module(), oss_answer(), oss_call(), oss_hangup(), and oss_indicate().
00790 { 00791 if (write(o->sndcmd[1], &x, sizeof(x)) < 0) { 00792 ast_log(LOG_WARNING, "write() failed: %s\n", strerror(errno)); 00793 } 00794 }
static void send_sound | ( | struct chan_oss_pvt * | o | ) | [static] |
Definition at line 546 of file chan_oss.c.
References ast_log(), chan_oss_pvt::cursound, FRAME_SIZE, LOG_WARNING, chan_oss_pvt::nosound, s, chan_oss_pvt::sampsent, silence, soundcard_writeframe(), and sounds.
00547 { 00548 short myframe[FRAME_SIZE]; 00549 int ofs, l, start; 00550 int l_sampsent = o->sampsent; 00551 struct sound *s; 00552 00553 if (o->cursound < 0) /* no sound to send */ 00554 return; 00555 00556 s = &sounds[o->cursound]; 00557 00558 for (ofs = 0; ofs < FRAME_SIZE; ofs += l) { 00559 l = s->samplen - l_sampsent; /* # of available samples */ 00560 if (l > 0) { 00561 start = l_sampsent % s->datalen; /* source offset */ 00562 if (l > FRAME_SIZE - ofs) /* don't overflow the frame */ 00563 l = FRAME_SIZE - ofs; 00564 if (l > s->datalen - start) /* don't overflow the source */ 00565 l = s->datalen - start; 00566 bcopy(s->data + start, myframe + ofs, l * 2); 00567 if (0) 00568 ast_log(LOG_WARNING, "send_sound sound %d/%d of %d into %d\n", l_sampsent, l, s->samplen, ofs); 00569 l_sampsent += l; 00570 } else { /* end of samples, maybe some silence */ 00571 static const short silence[FRAME_SIZE] = { 0, }; 00572 00573 l += s->silencelen; 00574 if (l > 0) { 00575 if (l > FRAME_SIZE - ofs) 00576 l = FRAME_SIZE - ofs; 00577 bcopy(silence, myframe + ofs, l * 2); 00578 l_sampsent += l; 00579 } else { /* silence is over, restart sound if loop */ 00580 if (s->repeat == 0) { /* last block */ 00581 o->cursound = -1; 00582 o->nosound = 0; /* allow audio data */ 00583 if (ofs < FRAME_SIZE) /* pad with silence */ 00584 bcopy(silence, myframe + ofs, (FRAME_SIZE - ofs) * 2); 00585 } 00586 l_sampsent = 0; 00587 } 00588 } 00589 } 00590 l = soundcard_writeframe(o, myframe); 00591 if (l > 0) 00592 o->sampsent = l_sampsent; /* update status */ 00593 }
static int setformat | ( | struct chan_oss_pvt * | o, | |
int | mode | |||
) | [static] |
Definition at line 670 of file chan_oss.c.
References ast_log(), ast_tvdiff_ms(), ast_tvnow(), ast_verbose(), DEFAULT_SAMPLE_RATE, chan_oss_pvt::device, chan_oss_pvt::duplex, errno, ast_channel::fds, chan_oss_pvt::frags, chan_oss_pvt::lastopen, LOG_WARNING, chan_oss_pvt::M_FULL, chan_oss_pvt::M_READ, chan_oss_pvt::M_UNSET, chan_oss_pvt::M_WRITE, O_CLOSE, option_verbose, chan_oss_pvt::owner, chan_oss_pvt::sounddev, VERBOSE_PREFIX_2, WARN_frag, WARN_speed, and chan_oss_pvt::warned.
Referenced by console_hangup(), console_hangup_deprecated(), oss_hangup(), oss_new(), sound_thread(), and soundcard_writeframe().
00671 { 00672 int fmt, desired, res, fd; 00673 00674 if (o->sounddev >= 0) { 00675 ioctl(o->sounddev, SNDCTL_DSP_RESET, 0); 00676 close(o->sounddev); 00677 o->duplex = M_UNSET; 00678 o->sounddev = -1; 00679 } 00680 if (mode == O_CLOSE) /* we are done */ 00681 return 0; 00682 if (ast_tvdiff_ms(ast_tvnow(), o->lastopen) < 1000) 00683 return -1; /* don't open too often */ 00684 o->lastopen = ast_tvnow(); 00685 fd = o->sounddev = open(o->device, mode | O_NONBLOCK); 00686 if (fd < 0) { 00687 ast_log(LOG_WARNING, "Unable to re-open DSP device %s: %s\n", o->device, strerror(errno)); 00688 return -1; 00689 } 00690 if (o->owner) 00691 o->owner->fds[0] = fd; 00692 00693 #if __BYTE_ORDER == __LITTLE_ENDIAN 00694 fmt = AFMT_S16_LE; 00695 #else 00696 fmt = AFMT_S16_BE; 00697 #endif 00698 res = ioctl(fd, SNDCTL_DSP_SETFMT, &fmt); 00699 if (res < 0) { 00700 ast_log(LOG_WARNING, "Unable to set format to 16-bit signed\n"); 00701 return -1; 00702 } 00703 switch (mode) { 00704 case O_RDWR: 00705 res = ioctl(fd, SNDCTL_DSP_SETDUPLEX, 0); 00706 /* Check to see if duplex set (FreeBSD Bug) */ 00707 res = ioctl(fd, SNDCTL_DSP_GETCAPS, &fmt); 00708 if (res == 0 && (fmt & DSP_CAP_DUPLEX)) { 00709 if (option_verbose > 1) 00710 ast_verbose(VERBOSE_PREFIX_2 "Console is full duplex\n"); 00711 o->duplex = M_FULL; 00712 }; 00713 break; 00714 case O_WRONLY: 00715 o->duplex = M_WRITE; 00716 break; 00717 case O_RDONLY: 00718 o->duplex = M_READ; 00719 break; 00720 } 00721 00722 fmt = 0; 00723 res = ioctl(fd, SNDCTL_DSP_STEREO, &fmt); 00724 if (res < 0) { 00725 ast_log(LOG_WARNING, "Failed to set audio device to mono\n"); 00726 return -1; 00727 } 00728 fmt = desired = DEFAULT_SAMPLE_RATE; /* 8000 Hz desired */ 00729 res = ioctl(fd, SNDCTL_DSP_SPEED, &fmt); 00730 00731 if (res < 0) { 00732 ast_log(LOG_WARNING, "Failed to set audio device to mono\n"); 00733 return -1; 00734 } 00735 if (fmt != desired) { 00736 if (!(o->warned & WARN_speed)) { 00737 ast_log(LOG_WARNING, 00738 "Requested %d Hz, got %d Hz -- sound may be choppy\n", 00739 desired, fmt); 00740 o->warned |= WARN_speed; 00741 } 00742 } 00743 /* 00744 * on Freebsd, SETFRAGMENT does not work very well on some cards. 00745 * Default to use 256 bytes, let the user override 00746 */ 00747 if (o->frags) { 00748 fmt = o->frags; 00749 res = ioctl(fd, SNDCTL_DSP_SETFRAGMENT, &fmt); 00750 if (res < 0) { 00751 if (!(o->warned & WARN_frag)) { 00752 ast_log(LOG_WARNING, 00753 "Unable to set fragment size -- sound may be choppy\n"); 00754 o->warned |= WARN_frag; 00755 } 00756 } 00757 } 00758 /* on some cards, we need SNDCTL_DSP_SETTRIGGER to start outputting */ 00759 res = PCM_ENABLE_INPUT | PCM_ENABLE_OUTPUT; 00760 res = ioctl(fd, SNDCTL_DSP_SETTRIGGER, &res); 00761 /* it may fail if we are in half duplex, never mind */ 00762 return 0; 00763 }
static void* sound_thread | ( | void * | arg | ) | [static] |
Definition at line 595 of file chan_oss.c.
References ast_log(), ast_select(), chan_oss_pvt::cursound, errno, sound::ind, LOG_WARNING, MAX, O_CLOSE, chan_oss_pvt::owner, send_sound(), setformat(), chan_oss_pvt::sndcmd, chan_oss_pvt::sounddev, and sounds.
00596 { 00597 char ign[4096]; 00598 struct chan_oss_pvt *o = (struct chan_oss_pvt *) arg; 00599 00600 /* 00601 * Just in case, kick the driver by trying to read from it. 00602 * Ignore errors - this read is almost guaranteed to fail. 00603 */ 00604 if (read(o->sounddev, ign, sizeof(ign)) < 0) { 00605 } 00606 for (;;) { 00607 fd_set rfds, wfds; 00608 int maxfd, res; 00609 00610 FD_ZERO(&rfds); 00611 FD_ZERO(&wfds); 00612 FD_SET(o->sndcmd[0], &rfds); 00613 maxfd = o->sndcmd[0]; /* pipe from the main process */ 00614 if (o->cursound > -1 && o->sounddev < 0) 00615 setformat(o, O_RDWR); /* need the channel, try to reopen */ 00616 else if (o->cursound == -1 && o->owner == NULL) 00617 setformat(o, O_CLOSE); /* can close */ 00618 if (o->sounddev > -1) { 00619 if (!o->owner) { /* no one owns the audio, so we must drain it */ 00620 FD_SET(o->sounddev, &rfds); 00621 maxfd = MAX(o->sounddev, maxfd); 00622 } 00623 if (o->cursound > -1) { 00624 FD_SET(o->sounddev, &wfds); 00625 maxfd = MAX(o->sounddev, maxfd); 00626 } 00627 } 00628 /* ast_select emulates linux behaviour in terms of timeout handling */ 00629 res = ast_select(maxfd + 1, &rfds, &wfds, NULL, NULL); 00630 if (res < 1) { 00631 ast_log(LOG_WARNING, "select failed: %s\n", strerror(errno)); 00632 sleep(1); 00633 continue; 00634 } 00635 if (FD_ISSET(o->sndcmd[0], &rfds)) { 00636 /* read which sound to play from the pipe */ 00637 int i, what = -1; 00638 00639 if (read(o->sndcmd[0], &what, sizeof(what)) != sizeof(what)) { 00640 ast_log(LOG_WARNING, "read() failed: %s\n", strerror(errno)); 00641 continue; 00642 } 00643 for (i = 0; sounds[i].ind != -1; i++) { 00644 if (sounds[i].ind == what) { 00645 o->cursound = i; 00646 o->sampsent = 0; 00647 o->nosound = 1; /* block audio from pbx */ 00648 break; 00649 } 00650 } 00651 if (sounds[i].ind == -1) 00652 ast_log(LOG_WARNING, "invalid sound index: %d\n", what); 00653 } 00654 if (o->sounddev > -1) { 00655 if (FD_ISSET(o->sounddev, &rfds)) /* read and ignore errors */ 00656 if (read(o->sounddev, ign, sizeof(ign)) < 0) { 00657 } 00658 if (FD_ISSET(o->sounddev, &wfds)) 00659 send_sound(o); 00660 } 00661 } 00662 return NULL; /* Never reached */ 00663 }
static int soundcard_writeframe | ( | struct chan_oss_pvt * | o, | |
short * | data | |||
) | [static] |
Definition at line 512 of file chan_oss.c.
References ast_log(), FRAME_SIZE, LOG_WARNING, chan_oss_pvt::queuesize, setformat(), chan_oss_pvt::sounddev, used_blocks(), and chan_oss_pvt::w_errors.
Referenced by oss_write(), and send_sound().
00513 { 00514 int res; 00515 00516 if (o->sounddev < 0) 00517 setformat(o, O_RDWR); 00518 if (o->sounddev < 0) 00519 return 0; /* not fatal */ 00520 /* 00521 * Nothing complex to manage the audio device queue. 00522 * If the buffer is full just drop the extra, otherwise write. 00523 * XXX in some cases it might be useful to write anyways after 00524 * a number of failures, to restart the output chain. 00525 */ 00526 res = used_blocks(o); 00527 if (res > o->queuesize) { /* no room to write a block */ 00528 if (o->w_errors++ == 0 && (oss_debug & 0x4)) 00529 ast_log(LOG_WARNING, "write: used %d blocks (%d)\n", res, o->w_errors); 00530 return 0; 00531 } 00532 o->w_errors = 0; 00533 return write(o->sounddev, ((void *) data), FRAME_SIZE * 2); 00534 }
static void store_boost | ( | struct chan_oss_pvt * | o, | |
char * | s | |||
) | [static] |
Definition at line 1578 of file chan_oss.c.
References ast_log(), chan_oss_pvt::boost, BOOST_MAX, BOOST_SCALE, and LOG_WARNING.
Referenced by do_boost(), and store_config().
01579 { 01580 double boost = 0; 01581 if (sscanf(s, "%lf", &boost) != 1) { 01582 ast_log(LOG_WARNING, "invalid boost <%s>\n", s); 01583 return; 01584 } 01585 if (boost < -BOOST_MAX) { 01586 ast_log(LOG_WARNING, "boost %s too small, using %d\n", s, -BOOST_MAX); 01587 boost = -BOOST_MAX; 01588 } else if (boost > BOOST_MAX) { 01589 ast_log(LOG_WARNING, "boost %s too large, using %d\n", s, BOOST_MAX); 01590 boost = BOOST_MAX; 01591 } 01592 boost = exp(log(10) * boost / 20) * BOOST_SCALE; 01593 o->boost = boost; 01594 ast_log(LOG_WARNING, "setting boost %s to %d\n", s, o->boost); 01595 }
static void store_callerid | ( | struct chan_oss_pvt * | o, | |
char * | s | |||
) | [static] |
Definition at line 1733 of file chan_oss.c.
References ast_callerid_split(), chan_oss_pvt::cid_name, and chan_oss_pvt::cid_num.
Referenced by store_config().
01734 { 01735 ast_callerid_split(s, o->cid_name, sizeof(o->cid_name), o->cid_num, sizeof(o->cid_num)); 01736 }
static struct chan_oss_pvt* store_config | ( | struct ast_config * | cfg, | |
char * | ctg | |||
) | [static] |
Definition at line 1741 of file chan_oss.c.
References asprintf, ast_calloc, ast_copy_string(), ast_jb_read_conf(), ast_log(), ast_strdup, ast_strlen_zero(), ast_tvnow(), ast_variable_browse(), chan_oss_pvt::autoanswer, chan_oss_pvt::autohangup, chan_oss_pvt::ctx, DEV_DSP, chan_oss_pvt::device, errno, chan_oss_pvt::ext, chan_oss_pvt::frags, global_jbconf, chan_oss_pvt::language, chan_oss_pvt::lastopen, LOG_WARNING, M_BOOL, M_END, M_F, M_START, M_STR, M_UINT, chan_oss_pvt::mixer_cmd, chan_oss_pvt::mohinterpret, ast_variable::name, chan_oss_pvt::name, ast_variable::next, oss_active, oss_default, chan_oss_pvt::overridecontext, chan_oss_pvt::queuesize, store_boost(), store_callerid(), store_mixer(), and ast_variable::value.
Referenced by load_module().
01742 { 01743 struct ast_variable *v; 01744 struct chan_oss_pvt *o; 01745 01746 if (ctg == NULL) { 01747 o = &oss_default; 01748 ctg = "general"; 01749 } else { 01750 if (!(o = ast_calloc(1, sizeof(*o)))) 01751 return NULL; 01752 *o = oss_default; 01753 /* "general" is also the default thing */ 01754 if (strcmp(ctg, "general") == 0) { 01755 o->name = ast_strdup("dsp"); 01756 oss_active = o->name; 01757 goto openit; 01758 } 01759 o->name = ast_strdup(ctg); 01760 } 01761 01762 strcpy(o->mohinterpret, "default"); 01763 01764 o->lastopen = ast_tvnow(); /* don't leave it 0 or tvdiff may wrap */ 01765 /* fill other fields from configuration */ 01766 for (v = ast_variable_browse(cfg, ctg); v; v = v->next) { 01767 M_START(v->name, v->value); 01768 01769 /* handle jb conf */ 01770 if (!ast_jb_read_conf(&global_jbconf, v->name, v->value)) 01771 continue; 01772 01773 M_BOOL("autoanswer", o->autoanswer) 01774 M_BOOL("autohangup", o->autohangup) 01775 M_BOOL("overridecontext", o->overridecontext) 01776 M_STR("device", o->device) 01777 M_UINT("frags", o->frags) 01778 M_UINT("debug", oss_debug) 01779 M_UINT("queuesize", o->queuesize) 01780 M_STR("context", o->ctx) 01781 M_STR("language", o->language) 01782 M_STR("mohinterpret", o->mohinterpret) 01783 M_STR("extension", o->ext) 01784 M_F("mixer", store_mixer(o, v->value)) 01785 M_F("callerid", store_callerid(o, v->value)) 01786 M_F("boost", store_boost(o, v->value)) 01787 M_END(; 01788 ); 01789 } 01790 if (ast_strlen_zero(o->device)) 01791 ast_copy_string(o->device, DEV_DSP, sizeof(o->device)); 01792 if (o->mixer_cmd) { 01793 char *cmd; 01794 01795 if (asprintf(&cmd, "mixer %s", o->mixer_cmd) < 0) { 01796 ast_log(LOG_WARNING, "asprintf() failed: %s\n", strerror(errno)); 01797 } else { 01798 ast_log(LOG_WARNING, "running [%s]\n", cmd); 01799 if (system(cmd) < 0) { 01800 ast_log(LOG_WARNING, "system() failed: %s\n", strerror(errno)); 01801 } 01802 free(cmd); 01803 } 01804 } 01805 if (o == &oss_default) /* we are done with the default */ 01806 return NULL; 01807 01808 openit: 01809 #if TRYOPEN 01810 if (setformat(o, O_RDWR) < 0) { /* open device */ 01811 if (option_verbose > 0) { 01812 ast_verbose(VERBOSE_PREFIX_2 "Device %s not detected\n", ctg); 01813 ast_verbose(VERBOSE_PREFIX_2 "Turn off OSS support by adding " "'noload=chan_oss.so' in /etc/asterisk/modules.conf\n"); 01814 } 01815 goto error; 01816 } 01817 if (o->duplex != M_FULL) 01818 ast_log(LOG_WARNING, "XXX I don't work right with non " "full-duplex sound cards XXX\n"); 01819 #endif /* TRYOPEN */ 01820 if (pipe(o->sndcmd) != 0) { 01821 ast_log(LOG_ERROR, "Unable to create pipe\n"); 01822 goto error; 01823 } 01824 ast_pthread_create_background(&o->sthread, NULL, sound_thread, o); 01825 /* link into list of devices */ 01826 if (o != &oss_default) { 01827 o->next = oss_default.next; 01828 oss_default.next = o; 01829 } 01830 return o; 01831 01832 error: 01833 if (o != &oss_default) 01834 free(o); 01835 return NULL; 01836 }
static void store_mixer | ( | struct chan_oss_pvt * | o, | |
char * | s | |||
) | [static] |
Definition at line 1714 of file chan_oss.c.
References ast_log(), ast_strdup, free, LOG_WARNING, and chan_oss_pvt::mixer_cmd.
Referenced by store_config().
01715 { 01716 int i; 01717 01718 for (i = 0; i < strlen(s); i++) { 01719 if (!isalnum(s[i]) && index(" \t-/", s[i]) == NULL) { 01720 ast_log(LOG_WARNING, "Suspect char %c in mixer cmd, ignoring:\n\t%s\n", s[i], s); 01721 return; 01722 } 01723 } 01724 if (o->mixer_cmd) 01725 free(o->mixer_cmd); 01726 o->mixer_cmd = ast_strdup(s); 01727 ast_log(LOG_WARNING, "setting mixer %s\n", s); 01728 }
static int unload_module | ( | void | ) | [static] |
Definition at line 1876 of file chan_oss.c.
References ast_channel_unregister(), ast_cli_unregister_multiple(), ast_softhangup(), AST_SOFTHANGUP_APPUNLOAD, cli_oss, chan_oss_pvt::next, oss_default, oss_tech, chan_oss_pvt::owner, chan_oss_pvt::sndcmd, and chan_oss_pvt::sounddev.
01877 { 01878 struct chan_oss_pvt *o; 01879 01880 ast_channel_unregister(&oss_tech); 01881 ast_cli_unregister_multiple(cli_oss, sizeof(cli_oss) / sizeof(struct ast_cli_entry)); 01882 01883 for (o = oss_default.next; o; o = o->next) { 01884 close(o->sounddev); 01885 if (o->sndcmd[0] > 0) { 01886 close(o->sndcmd[0]); 01887 close(o->sndcmd[1]); 01888 } 01889 if (o->owner) 01890 ast_softhangup(o->owner, AST_SOFTHANGUP_APPUNLOAD); 01891 if (o->owner) /* XXX how ??? */ 01892 return -1; 01893 /* XXX what about the thread ? */ 01894 /* XXX what about the memory allocated ? */ 01895 } 01896 return 0; 01897 }
static int used_blocks | ( | struct chan_oss_pvt * | o | ) | [static] |
Definition at line 490 of file chan_oss.c.
References ast_log(), LOG_WARNING, chan_oss_pvt::sounddev, chan_oss_pvt::total_blocks, WARN_used_blocks, and chan_oss_pvt::warned.
Referenced by soundcard_writeframe().
00491 { 00492 struct audio_buf_info info; 00493 00494 if (ioctl(o->sounddev, SNDCTL_DSP_GETOSPACE, &info)) { 00495 if (!(o->warned & WARN_used_blocks)) { 00496 ast_log(LOG_WARNING, "Error reading output space\n"); 00497 o->warned |= WARN_used_blocks; 00498 } 00499 return 1; 00500 } 00501 00502 if (o->total_blocks == 0) { 00503 if (0) /* debugging */ 00504 ast_log(LOG_WARNING, "fragtotal %d size %d avail %d\n", info.fragstotal, info.fragsize, info.fragments); 00505 o->total_blocks = info.fragments; 00506 } 00507 00508 return o->total_blocks - info.fragments; 00509 }
struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT | AST_MODFLAG_BUILDSUM, .description = "OSS 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 = "f450f61f60e761b3aa089ebed76ca8a5" , .load = load_module, .unload = unload_module, } [static] |
Definition at line 1899 of file chan_oss.c.
char active_usage[] [static] |
Initial value:
"Usage: console active [device]\n" " If used without a parameter, displays which device is the current\n" "console. If a device is specified, the console sound device is changed to\n" "the device specified.\n"
Definition at line 1569 of file chan_oss.c.
char answer_usage[] [static] |
Initial value:
"Usage: console answer\n" " Answers an incoming call on the console (OSS) channel.\n"
Definition at line 1181 of file chan_oss.c.
const struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 1899 of file chan_oss.c.
char autoanswer_usage[] [static] |
Initial value:
"Usage: console 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"
Definition at line 1128 of file chan_oss.c.
struct ast_cli_entry cli_oss[] [static] |
struct ast_cli_entry cli_oss_active_deprecated [static] |
Initial value:
{ { "console", NULL }, console_active_deprecated, NULL, NULL }
Definition at line 1658 of file chan_oss.c.
struct ast_cli_entry cli_oss_answer_deprecated [static] |
Initial value:
{ { "answer", NULL }, console_answer_deprecated, NULL, NULL }
Definition at line 1608 of file chan_oss.c.
struct ast_cli_entry cli_oss_autoanswer_deprecated [static] |
Initial value:
{ { "autoanswer", NULL }, console_autoanswer_deprecated, NULL, NULL, autoanswer_complete_deprecated }
Definition at line 1648 of file chan_oss.c.
struct ast_cli_entry cli_oss_boost_deprecated [static] |
Initial value:
{ { "oss", "boost", NULL }, do_boost, NULL, NULL }
Definition at line 1653 of file chan_oss.c.
struct ast_cli_entry cli_oss_dial_deprecated [static] |
Initial value:
{ { "dial", NULL }, console_dial_deprecated, NULL, NULL }
Definition at line 1623 of file chan_oss.c.
struct ast_cli_entry cli_oss_flash_deprecated [static] |
Initial value:
{ { "flash", NULL }, console_flash_deprecated, NULL, NULL }
Definition at line 1618 of file chan_oss.c.
struct ast_cli_entry cli_oss_hangup_deprecated [static] |
Initial value:
{ { "hangup", NULL }, console_hangup_deprecated, NULL, NULL }
Definition at line 1613 of file chan_oss.c.
struct ast_cli_entry cli_oss_mute_deprecated [static] |
Initial value:
{ { "mute", NULL }, console_mute_deprecated, NULL, NULL }
Definition at line 1628 of file chan_oss.c.
struct ast_cli_entry cli_oss_send_text_deprecated [static] |
Initial value:
{ { "send", "text", NULL }, console_sendtext_deprecated, NULL, NULL }
Definition at line 1643 of file chan_oss.c.
struct ast_cli_entry cli_oss_transfer_deprecated [static] |
Initial value:
{ { "transfer", NULL }, console_transfer_deprecated, NULL, NULL }
Definition at line 1638 of file chan_oss.c.
struct ast_cli_entry cli_oss_unmute_deprecated [static] |
Initial value:
{ { "unmute", NULL }, console_unmute_deprecated, NULL, NULL }
Definition at line 1633 of file chan_oss.c.
char* config = "oss.conf" [static] |
Definition at line 284 of file chan_oss.c.
struct ast_jb_conf default_jbconf [static] |
Global jitterbuffer configuration - by default, jb is disabled
Definition at line 86 of file chan_oss.c.
char dial_usage[] [static] |
Initial value:
"Usage: console dial [extension[@context]]\n" " Dials a given extension (and context if specified)\n"
Definition at line 1409 of file chan_oss.c.
char flash_usage[] [static] |
Initial value:
"Usage: console flash\n" " Flashes the call currently placed on the console.\n"
Definition at line 1323 of file chan_oss.c.
struct ast_jb_conf global_jbconf [static] |
Definition at line 93 of file chan_oss.c.
char hangup_usage[] [static] |
Initial value:
"Usage: console hangup\n" " Hangs up any call currently placed on the console.\n"
Definition at line 1281 of file chan_oss.c.
char mute_usage[] [static] |
Initial value:
"Usage: console mute\nMutes the microphone\n"
Definition at line 1437 of file chan_oss.c.
char* oss_active [static] |
Definition at line 400 of file chan_oss.c.
Referenced by __console_mute_unmute(), console_active(), console_active_deprecated(), console_answer(), console_answer_deprecated(), console_autoanswer(), console_autoanswer_deprecated(), console_dial(), console_dial_deprecated(), console_flash(), console_flash_deprecated(), console_hangup(), console_hangup_deprecated(), console_sendtext(), console_sendtext_deprecated(), console_transfer(), console_transfer_deprecated(), do_boost(), load_module(), and store_config().
int oss_debug [static] |
Definition at line 286 of file chan_oss.c.
struct chan_oss_pvt oss_default [static] |
Definition at line 385 of file chan_oss.c.
Referenced by console_active(), console_active_deprecated(), find_desc(), store_config(), and unload_module().
struct ast_channel_tech oss_tech [static] |
Definition at line 418 of file chan_oss.c.
Referenced by load_module(), oss_new(), oss_read(), and unload_module().
char sendtext_usage[] [static] |
Initial value:
"Usage: console send text <message>\n" " Sends a text message for display on the remote terminal.\n"
Definition at line 1239 of file chan_oss.c.
Definition at line 303 of file chan_oss.c.
char tdesc[] = "OSS Console Channel Driver" [static] |
Definition at line 416 of file chan_oss.c.
char transfer_usage[] [static] |
Initial value:
"Usage: console transfer <extension>[@context]\n" " Transfers the currently connected call to the given extension (and\n" "context if specified)\n"
Definition at line 1520 of file chan_oss.c.
char unmute_usage[] [static] |
Initial value:
"Usage: console unmute\nUnmutes the microphone\n"
Definition at line 1456 of file chan_oss.c.