Thu Oct 11 06:47:42 2012

Asterisk developer's documentation


app_nbscat.c File Reference

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"

Include dependency graph for app_nbscat.c:

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 __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .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 = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, }
static char * app = "NBScat"
static struct ast_module_infoast_module_info = &__mod_info


Detailed Description

Silly application to play an NBScat file -- uses nbscat8k.

Author:
Mark Spencer <markster@digium.com>

Definition in file app_nbscat.c.


Define Documentation

#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"

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().


Function Documentation

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,
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().

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 = 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 }


Variable Documentation

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .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 = 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.

Definition at line 216 of file app_nbscat.c.


Generated on Thu Oct 11 06:47:42 2012 for Asterisk - the Open Source PBX by  doxygen 1.5.6