#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, const char *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 | __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Silly NBS Stream Application" , .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 = "8586c2a7d357cb591cc3a6607a8f62d1" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, } |
static char * | app = "NBScat" |
static struct ast_module_info * | ast_module_info = &__mod_info |
Definition in file app_nbscat.c.
#define AF_LOCAL AF_UNIX |
Definition at line 63 of file app_nbscat.c.
Referenced by ast_makesocket(), ast_tryconnect(), listener(), and NBScat_exec().
#define LOCAL_NBSCAT "/usr/local/bin/nbscat8k" |
#define NBSCAT "/usr/bin/nbscat8k" |
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().
00212 { 00213 return ast_register_application_xml(app, NBScat_exec); 00214 }
static int NBScat_exec | ( | struct ast_channel * | chan, | |
const char * | 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, LOG_WARNING, NBScatplay(), ast_frame::offset, timed_read(), and ast_channel::writeformat.
Referenced by load_module().
00109 { 00110 int res=0; 00111 int fds[2]; 00112 int ms = -1; 00113 int pid = -1; 00114 int owriteformat; 00115 struct timeval next; 00116 struct ast_frame *f; 00117 struct myframe { 00118 struct ast_frame f; 00119 char offset[AST_FRIENDLY_OFFSET]; 00120 short frdata[160]; 00121 } myf; 00122 00123 if (socketpair(AF_LOCAL, SOCK_STREAM, 0, fds)) { 00124 ast_log(LOG_WARNING, "Unable to create socketpair\n"); 00125 return -1; 00126 } 00127 00128 ast_stopstream(chan); 00129 00130 owriteformat = chan->writeformat; 00131 res = ast_set_write_format(chan, AST_FORMAT_SLINEAR); 00132 if (res < 0) { 00133 ast_log(LOG_WARNING, "Unable to set write format to signed linear\n"); 00134 return -1; 00135 } 00136 00137 res = NBScatplay(fds[1]); 00138 /* Wait 1000 ms first */ 00139 next = ast_tvnow(); 00140 next.tv_sec += 1; 00141 if (res >= 0) { 00142 pid = res; 00143 /* Order is important -- there's almost always going to be mp3... we want to prioritize the 00144 user */ 00145 for (;;) { 00146 ms = ast_tvdiff_ms(next, ast_tvnow()); 00147 if (ms <= 0) { 00148 res = timed_read(fds[0], myf.frdata, sizeof(myf.frdata)); 00149 if (res > 0) { 00150 myf.f.frametype = AST_FRAME_VOICE; 00151 myf.f.subclass.codec = AST_FORMAT_SLINEAR; 00152 myf.f.datalen = res; 00153 myf.f.samples = res / 2; 00154 myf.f.mallocd = 0; 00155 myf.f.offset = AST_FRIENDLY_OFFSET; 00156 myf.f.src = __PRETTY_FUNCTION__; 00157 myf.f.delivery.tv_sec = 0; 00158 myf.f.delivery.tv_usec = 0; 00159 myf.f.data.ptr = myf.frdata; 00160 if (ast_write(chan, &myf.f) < 0) { 00161 res = -1; 00162 break; 00163 } 00164 } else { 00165 ast_debug(1, "No more mp3\n"); 00166 res = 0; 00167 break; 00168 } 00169 next = ast_tvadd(next, ast_samp2tv(myf.f.samples, 8000)); 00170 } else { 00171 ms = ast_waitfor(chan, ms); 00172 if (ms < 0) { 00173 ast_debug(1, "Hangup detected\n"); 00174 res = -1; 00175 break; 00176 } 00177 if (ms) { 00178 f = ast_read(chan); 00179 if (!f) { 00180 ast_debug(1, "Null frame == hangup() detected\n"); 00181 res = -1; 00182 break; 00183 } 00184 if (f->frametype == AST_FRAME_DTMF) { 00185 ast_debug(1, "User pressed a key\n"); 00186 ast_frfree(f); 00187 res = 0; 00188 break; 00189 } 00190 ast_frfree(f); 00191 } 00192 } 00193 } 00194 } 00195 close(fds[0]); 00196 close(fds[1]); 00197 00198 if (pid > -1) 00199 kill(pid, SIGKILL); 00200 if (!res && owriteformat) 00201 ast_set_write_format(chan, owriteformat); 00202 00203 return res; 00204 }
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().
00069 { 00070 int res; 00071 00072 res = ast_safe_fork(0); 00073 if (res < 0) { 00074 ast_log(LOG_WARNING, "Fork failed\n"); 00075 } 00076 00077 if (res) { 00078 return res; 00079 } 00080 00081 if (ast_opt_high_priority) 00082 ast_set_priority(0); 00083 00084 dup2(fd, STDOUT_FILENO); 00085 ast_close_fds_above_n(STDERR_FILENO); 00086 /* Most commonly installed in /usr/local/bin */ 00087 execl(NBSCAT, "nbscat8k", "-d", (char *)NULL); 00088 execl(LOCAL_NBSCAT, "nbscat8k", "-d", (char *)NULL); 00089 fprintf(stderr, "Execute of nbscat8k failed\n"); 00090 _exit(0); 00091 }
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.
00094 { 00095 int res; 00096 struct pollfd fds[1]; 00097 fds[0].fd = fd; 00098 fds[0].events = POLLIN; 00099 res = ast_poll(fds, 1, 2000); 00100 if (res < 1) { 00101 ast_log(LOG_NOTICE, "Selected timed out/errored out with %d\n", res); 00102 return -1; 00103 } 00104 return read(fd, data, datalen); 00105 00106 }
static int unload_module | ( | void | ) | [static] |
Definition at line 206 of file app_nbscat.c.
References ast_unregister_application().
00207 { 00208 return ast_unregister_application(app); 00209 }
struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Silly NBS Stream Application" , .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 = "8586c2a7d357cb591cc3a6607a8f62d1" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, } [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.