Mon Mar 19 11:30:31 2012

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

static void __reg_module (void)
static void __unreg_module (void)
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 struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Control Playback 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 = "88eaa8f5c1bd988bedd71113385e0886" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, }
static const char app [] = "ControlPlayback"
static struct ast_module_infoast_module_info = &__mod_info
static struct ast_app_option cpb_opts [128] = { [ 'o' ] = { .flag = OPT_OFFSET , .arg_index = OPT_ARG_OFFSET + 1 }, }


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

static void __reg_module ( void   )  [static]

Definition at line 230 of file app_controlplayback.c.

static void __unreg_module ( void   )  [static]

Definition at line 230 of file app_controlplayback.c.

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, cpb_opts, 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

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Control Playback 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 = "88eaa8f5c1bd988bedd71113385e0886" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, } [static]

Definition at line 230 of file app_controlplayback.c.

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

Definition at line 99 of file app_controlplayback.c.

struct ast_module_info* ast_module_info = &__mod_info [static]

Definition at line 230 of file app_controlplayback.c.

struct ast_app_option cpb_opts[128] = { [ 'o' ] = { .flag = OPT_OFFSET , .arg_index = OPT_ARG_OFFSET + 1 }, } [static]

Definition at line 114 of file app_controlplayback.c.

Referenced by controlplayback_exec().


Generated on Mon Mar 19 11:30:31 2012 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7