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" |
Trivial application to control playback of a sound file.
Definition in file app_controlplayback.c.
anonymous enum |
Definition at line 101 of file app_controlplayback.c.
00101 { 00102 OPT_OFFSET = (1 << 1), 00103 };
anonymous enum |
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 };
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().
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 }
const char app[] = "ControlPlayback" [static] |
Definition at line 99 of file app_controlplayback.c.