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