Tue Aug 20 16:34:42 2013

Asterisk developer's documentation


app_controlplayback.c File Reference

Trivial application to control playback of a sound file. More...

#include "asterisk.h"
#include "asterisk/pbx.h"
#include "asterisk/app.h"
#include "asterisk/module.h"

Go to the source code of this file.

Enumerations

enum  { OPT_OFFSET = (1 << 1) }
enum  { OPT_ARG_OFFSET = 0, OPT_ARG_ARRAY_LEN }

Functions

 AST_APP_OPTIONS (cpb_opts, BEGIN_OPTIONS AST_APP_OPTION_ARG('o', OPT_OFFSET, OPT_ARG_OFFSET), END_OPTIONS)
 AST_MODULE_INFO_STANDARD (ASTERISK_GPL_KEY,"Control Playback Application")
static int controlplayback_exec (struct ast_channel *chan, const char *data)
static int is_argument (const char *haystack, int needle)
static int is_on_phonepad (char key)
static int load_module (void)
static int unload_module (void)

Variables

static const char app [] = "ControlPlayback"

Detailed Description

Trivial application to control playback of a sound file.

Author:
Mark Spencer <markster@digium.com>

Definition in file app_controlplayback.c.


Enumeration Type Documentation

anonymous enum
Enumerator:
OPT_OFFSET 

Definition at line 101 of file app_controlplayback.c.

00101      {
00102    OPT_OFFSET = (1 << 1),
00103 };

anonymous enum
Enumerator:
OPT_ARG_OFFSET 
OPT_ARG_ARRAY_LEN 

Definition at line 105 of file app_controlplayback.c.

00105      {
00106    OPT_ARG_OFFSET = 0,
00107    /* must stay as the last entry ... */
00108    OPT_ARG_ARRAY_LEN,
00109 };


Function Documentation

AST_APP_OPTIONS ( cpb_opts  ,
BEGIN_OPTIONS   AST_APP_OPTION_ARG'o', OPT_OFFSET, OPT_ARG_OFFSET,
END_OPTIONS   
)
AST_MODULE_INFO_STANDARD ( ASTERISK_GPL_KEY  ,
"Control Playback Application"   
)
static int controlplayback_exec ( struct ast_channel chan,
const char *  data 
) [static]

Definition at line 132 of file app_controlplayback.c.

References args, AST_APP_ARG, ast_app_parse_options(), ast_control_streamfile(), ast_debug, AST_DECLARE_APP_ARGS, ast_log(), AST_STANDARD_APP_ARGS, ast_strdupa, ast_strlen_zero(), ast_test_flag, is_argument(), is_on_phonepad(), LOG_WARNING, OPT_ARG_ARRAY_LEN, OPT_ARG_OFFSET, OPT_OFFSET, pbx_builtin_setvar_helper(), skipms, and stop.

Referenced by load_module().

00133 {
00134    int res = 0;
00135    int skipms = 0;
00136    long offsetms = 0;
00137    char offsetbuf[20];
00138    char stopkeybuf[2];
00139    char *tmp;
00140    struct ast_flags opts = { 0, };
00141    char *opt_args[OPT_ARG_ARRAY_LEN];
00142    AST_DECLARE_APP_ARGS(args,
00143       AST_APP_ARG(filename);
00144       AST_APP_ARG(skip);
00145       AST_APP_ARG(fwd);
00146       AST_APP_ARG(rev);
00147       AST_APP_ARG(stop);
00148       AST_APP_ARG(pause);
00149       AST_APP_ARG(restart);
00150       AST_APP_ARG(options);
00151    );
00152 
00153    if (ast_strlen_zero(data)) {
00154       ast_log(LOG_WARNING, "ControlPlayback requires an argument (filename)\n");
00155       return -1;
00156    }
00157    
00158    tmp = ast_strdupa(data);
00159    AST_STANDARD_APP_ARGS(args, tmp);
00160 
00161    if (args.argc < 1) {
00162       ast_log(LOG_WARNING, "ControlPlayback requires an argument (filename)\n");
00163       return -1;
00164    }
00165 
00166    skipms = args.skip ? (atoi(args.skip) ? atoi(args.skip) : 3000) : 3000;
00167 
00168    if (!args.fwd || !is_on_phonepad(*args.fwd)) {
00169       char *digit = "#";
00170       if (!is_argument(args.rev, *digit) && !is_argument(args.stop, *digit) && !is_argument(args.pause, *digit) && !is_argument(args.restart, *digit))
00171          args.fwd = digit;
00172       else
00173          args.fwd = NULL;
00174    }
00175    if (!args.rev || !is_on_phonepad(*args.rev)) {
00176       char *digit = "*";
00177       if (!is_argument(args.fwd, *digit) && !is_argument(args.stop, *digit) && !is_argument(args.pause, *digit) && !is_argument(args.restart, *digit))
00178          args.rev = digit;
00179       else
00180          args.rev = NULL;
00181    }
00182    ast_debug(1, "Forward key = %s, Rewind key = %s\n", args.fwd, args.rev);
00183    if (args.stop && !is_on_phonepad(*args.stop))
00184       args.stop = NULL;
00185    if (args.pause && !is_on_phonepad(*args.pause))
00186       args.pause = NULL;
00187    if (args.restart && !is_on_phonepad(*args.restart))
00188       args.restart = NULL;
00189 
00190    if (args.options) {
00191       ast_app_parse_options(cpb_opts, &opts, opt_args, args.options);
00192       if (ast_test_flag(&opts, OPT_OFFSET))
00193          offsetms = atol(opt_args[OPT_ARG_OFFSET]);
00194    }
00195 
00196    res = ast_control_streamfile(chan, args.filename, args.fwd, args.rev, args.stop, args.pause, args.restart, skipms, &offsetms);
00197 
00198    /* If we stopped on one of our stop keys, return 0  */
00199    if (res > 0 && args.stop && strchr(args.stop, res)) {
00200       pbx_builtin_setvar_helper(chan, "CPLAYBACKSTATUS", "USERSTOPPED");
00201       snprintf(stopkeybuf, sizeof(stopkeybuf), "%c", res);
00202       pbx_builtin_setvar_helper(chan, "CPLAYBACKSTOPKEY", stopkeybuf);
00203       res = 0;
00204    } else {
00205       if (res < 0) {
00206          res = 0;
00207          pbx_builtin_setvar_helper(chan, "CPLAYBACKSTATUS", "ERROR");
00208       } else
00209          pbx_builtin_setvar_helper(chan, "CPLAYBACKSTATUS", "SUCCESS");
00210    }
00211 
00212    snprintf(offsetbuf, sizeof(offsetbuf), "%ld", offsetms);
00213    pbx_builtin_setvar_helper(chan, "CPLAYBACKOFFSET", offsetbuf);
00214 
00215    return res;
00216 }

static int is_argument ( const char *  haystack,
int  needle 
) [static]

Definition at line 121 of file app_controlplayback.c.

References ast_strlen_zero().

Referenced by controlplayback_exec().

00122 {
00123    if (ast_strlen_zero(haystack))
00124       return 0;
00125 
00126    if (strchr(haystack, needle))
00127       return -1;
00128 
00129    return 0;
00130 }

static int is_on_phonepad ( char  key  )  [static]

Definition at line 116 of file app_controlplayback.c.

Referenced by controlplayback_exec().

00117 {
00118    return key == 35 || key == 42 || (key >= 48 && key <= 57);
00119 }

static int load_module ( void   )  [static]

Definition at line 225 of file app_controlplayback.c.

References ast_register_application_xml, and controlplayback_exec().

00226 {
00227    return ast_register_application_xml(app, controlplayback_exec);
00228 }

static int unload_module ( void   )  [static]

Definition at line 218 of file app_controlplayback.c.

References ast_unregister_application().

00219 {
00220    int res;
00221    res = ast_unregister_application(app);
00222    return res;
00223 }


Variable Documentation

const char app[] = "ControlPlayback" [static]

Definition at line 99 of file app_controlplayback.c.


Generated on 20 Aug 2013 for Asterisk - The Open Source Telephony Project by  doxygen 1.6.1