Silly application to play an NBScat file -- uses nbscat8k. More...
#include "asterisk.h"#include <fcntl.h>#include <sys/time.h>#include <sys/socket.h>#include <signal.h>#include "asterisk/lock.h"#include "asterisk/file.h"#include "asterisk/channel.h"#include "asterisk/frame.h"#include "asterisk/pbx.h"#include "asterisk/module.h"#include "asterisk/translate.h"#include "asterisk/app.h"
Go to the source code of this file.
Defines | |
| #define | AF_LOCAL AF_UNIX |
| #define | LOCAL_NBSCAT "/usr/local/bin/nbscat8k" |
| #define | NBSCAT "/usr/bin/nbscat8k" |
Functions | |
| static void | __reg_module (void) |
| static void | __unreg_module (void) |
| static int | load_module (void) |
| static int | NBScat_exec (struct ast_channel *chan, void *data) |
| static int | NBScatplay (int fd) |
| static int | timed_read (int fd, void *data, int datalen) |
| static int | unload_module (void) |
Variables | |
| static struct ast_module_info __MODULE_INFO_SECTION | __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Silly NBS Stream Application" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } |
| static char * | app = "NBScat" |
| static struct ast_module_info * | ast_module_info = &__mod_info |
Silly application to play an NBScat file -- uses nbscat8k.
Definition in file app_nbscat.c.
| #define AF_LOCAL AF_UNIX |
Definition at line 63 of file app_nbscat.c.
Referenced by NBScat_exec().
| #define LOCAL_NBSCAT "/usr/local/bin/nbscat8k" |
Definition at line 59 of file app_nbscat.c.
Referenced by NBScatplay().
| #define NBSCAT "/usr/bin/nbscat8k" |
Definition at line 60 of file app_nbscat.c.
Referenced by NBScatplay().
| static void __reg_module | ( | void | ) | [static] |
Definition at line 216 of file app_nbscat.c.
| static void __unreg_module | ( | void | ) | [static] |
Definition at line 216 of file app_nbscat.c.
| static int load_module | ( | void | ) | [static] |
Definition at line 211 of file app_nbscat.c.
References ast_register_application_xml, and NBScat_exec().
{
return ast_register_application_xml(app, NBScat_exec);
}
| static int NBScat_exec | ( | struct ast_channel * | chan, |
| void * | data | ||
| ) | [static] |
Definition at line 108 of file app_nbscat.c.
References AF_LOCAL, ast_debug, AST_FORMAT_SLINEAR, AST_FRAME_DTMF, AST_FRAME_VOICE, ast_frfree, AST_FRIENDLY_OFFSET, ast_log(), ast_read(), ast_samp2tv(), ast_set_write_format(), ast_stopstream(), ast_tvadd(), ast_tvdiff_ms(), ast_tvnow(), ast_waitfor(), ast_write(), f, ast_frame::frametype, LOG_WARNING, NBScatplay(), ast_frame::offset, timed_read(), and ast_channel::writeformat.
Referenced by load_module().
{
int res=0;
int fds[2];
int ms = -1;
int pid = -1;
int owriteformat;
struct timeval next;
struct ast_frame *f;
struct myframe {
struct ast_frame f;
char offset[AST_FRIENDLY_OFFSET];
short frdata[160];
} myf;
if (socketpair(AF_LOCAL, SOCK_STREAM, 0, fds)) {
ast_log(LOG_WARNING, "Unable to create socketpair\n");
return -1;
}
ast_stopstream(chan);
owriteformat = chan->writeformat;
res = ast_set_write_format(chan, AST_FORMAT_SLINEAR);
if (res < 0) {
ast_log(LOG_WARNING, "Unable to set write format to signed linear\n");
return -1;
}
res = NBScatplay(fds[1]);
/* Wait 1000 ms first */
next = ast_tvnow();
next.tv_sec += 1;
if (res >= 0) {
pid = res;
/* Order is important -- there's almost always going to be mp3... we want to prioritize the
user */
for (;;) {
ms = ast_tvdiff_ms(next, ast_tvnow());
if (ms <= 0) {
res = timed_read(fds[0], myf.frdata, sizeof(myf.frdata));
if (res > 0) {
myf.f.frametype = AST_FRAME_VOICE;
myf.f.subclass = AST_FORMAT_SLINEAR;
myf.f.datalen = res;
myf.f.samples = res / 2;
myf.f.mallocd = 0;
myf.f.offset = AST_FRIENDLY_OFFSET;
myf.f.src = __PRETTY_FUNCTION__;
myf.f.delivery.tv_sec = 0;
myf.f.delivery.tv_usec = 0;
myf.f.data.ptr = myf.frdata;
if (ast_write(chan, &myf.f) < 0) {
res = -1;
break;
}
} else {
ast_debug(1, "No more mp3\n");
res = 0;
break;
}
next = ast_tvadd(next, ast_samp2tv(myf.f.samples, 8000));
} else {
ms = ast_waitfor(chan, ms);
if (ms < 0) {
ast_debug(1, "Hangup detected\n");
res = -1;
break;
}
if (ms) {
f = ast_read(chan);
if (!f) {
ast_debug(1, "Null frame == hangup() detected\n");
res = -1;
break;
}
if (f->frametype == AST_FRAME_DTMF) {
ast_debug(1, "User pressed a key\n");
ast_frfree(f);
res = 0;
break;
}
ast_frfree(f);
}
}
}
}
close(fds[0]);
close(fds[1]);
if (pid > -1)
kill(pid, SIGKILL);
if (!res && owriteformat)
ast_set_write_format(chan, owriteformat);
return res;
}
| static int NBScatplay | ( | int | fd | ) | [static] |
Definition at line 68 of file app_nbscat.c.
References ast_close_fds_above_n(), ast_log(), ast_opt_high_priority, ast_safe_fork(), ast_set_priority(), LOCAL_NBSCAT, LOG_WARNING, and NBSCAT.
Referenced by NBScat_exec().
{
int res;
res = ast_safe_fork(0);
if (res < 0) {
ast_log(LOG_WARNING, "Fork failed\n");
}
if (res) {
return res;
}
if (ast_opt_high_priority)
ast_set_priority(0);
dup2(fd, STDOUT_FILENO);
ast_close_fds_above_n(STDERR_FILENO);
/* Most commonly installed in /usr/local/bin */
execl(NBSCAT, "nbscat8k", "-d", (char *)NULL);
execl(LOCAL_NBSCAT, "nbscat8k", "-d", (char *)NULL);
fprintf(stderr, "Execute of nbscat8k failed\n");
_exit(0);
}
| static int timed_read | ( | int | fd, |
| void * | data, | ||
| int | datalen | ||
| ) | [static] |
Definition at line 93 of file app_nbscat.c.
References ast_log(), ast_poll, and LOG_NOTICE.
Referenced by NBScat_exec().
{
int res;
struct pollfd fds[1];
fds[0].fd = fd;
fds[0].events = POLLIN;
res = ast_poll(fds, 1, 2000);
if (res < 1) {
ast_log(LOG_NOTICE, "Selected timed out/errored out with %d\n", res);
return -1;
}
return read(fd, data, datalen);
}
| static int unload_module | ( | void | ) | [static] |
Definition at line 206 of file app_nbscat.c.
References ast_unregister_application().
{
return ast_unregister_application(app);
}
struct ast_module_info __MODULE_INFO_SECTION __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Silly NBS Stream Application" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } [static] |
Definition at line 216 of file app_nbscat.c.
char* app = "NBScat" [static] |
Definition at line 66 of file app_nbscat.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 216 of file app_nbscat.c.