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, void *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 __MODULE_INFO_SECTION | __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Control Playback Application" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } |
static const char * | app = "ControlPlayback" |
static struct ast_module_info * | ast_module_info = &__mod_info |
static struct ast_app_option | cpb_opts [128] = { [ 'o' ] = { .flag = OPT_OFFSET , .arg_index = OPT_ARG_OFFSET + 1 }, } |
Trivial application to control playback of a sound file.
Definition in file app_controlplayback.c.
anonymous enum |
Definition at line 97 of file app_controlplayback.c.
{ OPT_OFFSET = (1 << 1), };
anonymous enum |
Definition at line 101 of file app_controlplayback.c.
{ OPT_ARG_OFFSET = 0, /* must stay as the last entry ... */ OPT_ARG_ARRAY_LEN, };
static void __reg_module | ( | void | ) | [static] |
Definition at line 226 of file app_controlplayback.c.
static void __unreg_module | ( | void | ) | [static] |
Definition at line 226 of file app_controlplayback.c.
static int controlplayback_exec | ( | struct ast_channel * | chan, |
void * | data | ||
) | [static] |
Definition at line 128 of file app_controlplayback.c.
References 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().
{ int res = 0; int skipms = 0; long offsetms = 0; char offsetbuf[20]; char stopkeybuf[2]; char *tmp; struct ast_flags opts = { 0, }; char *opt_args[OPT_ARG_ARRAY_LEN]; AST_DECLARE_APP_ARGS(args, AST_APP_ARG(filename); AST_APP_ARG(skip); AST_APP_ARG(fwd); AST_APP_ARG(rev); AST_APP_ARG(stop); AST_APP_ARG(pause); AST_APP_ARG(restart); AST_APP_ARG(options); ); if (ast_strlen_zero(data)) { ast_log(LOG_WARNING, "ControlPlayback requires an argument (filename)\n"); return -1; } tmp = ast_strdupa(data); AST_STANDARD_APP_ARGS(args, tmp); if (args.argc < 1) { ast_log(LOG_WARNING, "ControlPlayback requires an argument (filename)\n"); return -1; } skipms = args.skip ? (atoi(args.skip) ? atoi(args.skip) : 3000) : 3000; if (!args.fwd || !is_on_phonepad(*args.fwd)) { char *digit = "#"; if (!is_argument(args.rev, *digit) && !is_argument(args.stop, *digit) && !is_argument(args.pause, *digit) && !is_argument(args.restart, *digit)) args.fwd = digit; else args.fwd = NULL; } if (!args.rev || !is_on_phonepad(*args.rev)) { char *digit = "*"; if (!is_argument(args.fwd, *digit) && !is_argument(args.stop, *digit) && !is_argument(args.pause, *digit) && !is_argument(args.restart, *digit)) args.rev = digit; else args.rev = NULL; } ast_debug(1, "Forward key = %s, Rewind key = %s\n", args.fwd, args.rev); if (args.stop && !is_on_phonepad(*args.stop)) args.stop = NULL; if (args.pause && !is_on_phonepad(*args.pause)) args.pause = NULL; if (args.restart && !is_on_phonepad(*args.restart)) args.restart = NULL; if (args.options) { ast_app_parse_options(cpb_opts, &opts, opt_args, args.options); if (ast_test_flag(&opts, OPT_OFFSET)) offsetms = atol(opt_args[OPT_ARG_OFFSET]); } res = ast_control_streamfile(chan, args.filename, args.fwd, args.rev, args.stop, args.pause, args.restart, skipms, &offsetms); /* If we stopped on one of our stop keys, return 0 */ if (res > 0 && args.stop && strchr(args.stop, res)) { pbx_builtin_setvar_helper(chan, "CPLAYBACKSTATUS", "USERSTOPPED"); snprintf(stopkeybuf, sizeof(stopkeybuf), "%c", res); pbx_builtin_setvar_helper(chan, "CPLAYBACKSTOPKEY", stopkeybuf); res = 0; } else { if (res < 0) { res = 0; pbx_builtin_setvar_helper(chan, "CPLAYBACKSTATUS", "ERROR"); } else pbx_builtin_setvar_helper(chan, "CPLAYBACKSTATUS", "SUCCESS"); } snprintf(offsetbuf, sizeof(offsetbuf), "%ld", offsetms); pbx_builtin_setvar_helper(chan, "CPLAYBACKOFFSET", offsetbuf); return res; }
static int is_argument | ( | const char * | haystack, |
int | needle | ||
) | [static] |
Definition at line 117 of file app_controlplayback.c.
References ast_strlen_zero().
Referenced by controlplayback_exec().
{ if (ast_strlen_zero(haystack)) return 0; if (strchr(haystack, needle)) return -1; return 0; }
static int is_on_phonepad | ( | char | key | ) | [static] |
Definition at line 112 of file app_controlplayback.c.
Referenced by controlplayback_exec().
{
return key == 35 || key == 42 || (key >= 48 && key <= 57);
}
static int load_module | ( | void | ) | [static] |
Definition at line 221 of file app_controlplayback.c.
References ast_register_application_xml, and controlplayback_exec().
{ return ast_register_application_xml(app, controlplayback_exec); }
static int unload_module | ( | void | ) | [static] |
Definition at line 214 of file app_controlplayback.c.
References ast_unregister_application().
{ int res; res = ast_unregister_application(app); return res; }
struct ast_module_info __MODULE_INFO_SECTION __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Control Playback Application" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } [static] |
Definition at line 226 of file app_controlplayback.c.
const char* app = "ControlPlayback" [static] |
Definition at line 95 of file app_controlplayback.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 226 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 110 of file app_controlplayback.c.
Referenced by controlplayback_exec().