Sat Apr 26 2014 22:01:49

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, 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 = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, }
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 67 of file app_nbscat.c.

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


Function Documentation

static void __reg_module ( void  ) [static]

Definition at line 221 of file app_nbscat.c.

static void __unreg_module ( void  ) [static]

Definition at line 221 of file app_nbscat.c.

static int load_module ( void  ) [static]

Definition at line 216 of file app_nbscat.c.

References ast_register_application_xml, and NBScat_exec().

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_channel_writeformat(), ast_debug, ast_format_clear(), ast_format_copy(), ast_format_set(), 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_set_write_format_by_id(), ast_stopstream(), ast_tvadd(), ast_tvdiff_ms(), ast_tvnow(), ast_waitfor(), ast_write(), f, ast_frame::frametype, ast_format::id, LOG_WARNING, NBScatplay(), ast_frame::offset, and timed_read().

Referenced by load_module().

{
   int res=0;
   int fds[2];
   int ms = -1;
   int pid = -1;
   struct ast_format owriteformat;
   struct timeval next;
   struct ast_frame *f;
   struct myframe {
      struct ast_frame f;
      char offset[AST_FRIENDLY_OFFSET];
      short frdata[160];
   } myf;

   ast_format_clear(&owriteformat);
   if (socketpair(AF_LOCAL, SOCK_STREAM, 0, fds)) {
      ast_log(LOG_WARNING, "Unable to create socketpair\n");
      return -1;
   }
   
   ast_stopstream(chan);

   ast_format_copy(&owriteformat, ast_channel_writeformat(chan));
   res = ast_set_write_format_by_id(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;
               ast_format_set(&myf.f.subclass.format, AST_FORMAT_SLINEAR, 0);
               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.id)
      ast_set_write_format(chan, &owriteformat);

   return res;
}
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().

{
   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 97 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 211 of file app_nbscat.c.

References ast_unregister_application().


Variable Documentation

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 = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, } [static]

Definition at line 221 of file app_nbscat.c.

char* app = "NBScat" [static]

Definition at line 70 of file app_nbscat.c.

Definition at line 221 of file app_nbscat.c.