45a46,49 > #include "asterisk/options.h" > #include "asterisk/config.h" > #include "asterisk/utils.h" > #include "asterisk/app.h" 54a59,62 > "Available options:\n" > " 'n(x)': number of digits (x) to wait for \n" > " 'S(x)': set variable of name x (with DTMFs) rather than go to extension \n" > "\n" 56c64,67 < " mp4play(/tmp/video.mp4) play video file to user\n"; --- > " mp4play(/tmp/video.mp4) play video file to user\n" > " mp4play(/tmp/test.mp4,'n(3)') play video file to user and wait for 3 digits \n" > " mp4play(/tmp/test.mp4,'n(3)S{DTMF_INPUT)') play video file to user and wait for 3 digits and \n" > " sets them as value of variable DTMF_INPUT\n"; 91a103,123 > > enum { > OPT_DFTMINTOVAR = (1 << 0), > OPT_NOOFDTMF = (1 << 1), > } mp4play_exec_option_flags; > > enum { > OPT_ARG_DFTMINTOVAR = 0, > OPT_ARG_NOOFDTMF, > /* note: this entry _MUST_ be the last one in the enum */ > OPT_ARG_ARRAY_SIZE, > } mp4play_exec_option_args; > > AST_APP_OPTIONS(mp4play_exec_options, { > AST_APP_OPTION_ARG('S', OPT_DFTMINTOVAR, OPT_ARG_DFTMINTOVAR), > AST_APP_OPTION_ARG('n', OPT_NOOFDTMF, OPT_ARG_NOOFDTMF), > }); > > > #define MAX_DTMF_BUFFER_SIZE 25 > 257c289 < } --- > } 360a393,407 > char *parse; > int numberofDigits = -1; > char *varName = NULL; > char dtmfBuffer[MAX_DTMF_BUFFER_SIZE]; > > > memset(dtmfBuffer,0,MAX_DTMF_BUFFER_SIZE); > > AST_DECLARE_APP_ARGS(args, > AST_APP_ARG(filename); > AST_APP_ARG(options); > ); > struct ast_flags opts = { 0, }; > char *opt_args[OPT_ARG_ARRAY_SIZE]; > 362,363c409,412 < if (!data) < return -1; --- > if (ast_strlen_zero(data)) { > ast_log(LOG_WARNING, "mp4play requires an argument (filename)\n"); > return -1; > } 370a420,453 > parse = ast_strdupa(data); > > AST_STANDARD_APP_ARGS(args, parse); > > if (!ast_strlen_zero(args.options) && > ast_app_parse_options(mp4play_exec_options, &opts, opt_args, args.options)) { > return -1; > } > > if (ast_strlen_zero(args.filename)) { > ast_log(LOG_WARNING, "mp4play requires an argument (filename)\n"); > return -1; > } > > if (ast_test_flag(&opts, OPT_NOOFDTMF) && !ast_strlen_zero(opt_args[OPT_ARG_NOOFDTMF])) { > numberofDigits = atoi(opt_args[OPT_ARG_NOOFDTMF]); > if (!numberofDigits) { > ast_log(LOG_WARNING, "mp4play does not accept n(%s), hanging up.\n", opt_args[OPT_ARG_NOOFDTMF]); > return -1; > } > if (numberofDigits>MAX_DTMF_BUFFER_SIZE-1) { > numberofDigits = MAX_DTMF_BUFFER_SIZE-1; > ast_log(LOG_WARNING, "mp4play does not accept n(%s), buffer is too short cutting to %d .\n", opt_args[OPT_ARG_NOOFDTMF],MAX_DTMF_BUFFER_SIZE-1); > } > if (option_verbose > 2) > ast_verbose(VERBOSE_PREFIX_3 "Setting number of digits to %d seconds.\n", numberofDigits); > } > > if (ast_test_flag(&opts, OPT_DFTMINTOVAR) && !ast_strlen_zero(opt_args[OPT_ARG_DFTMINTOVAR])) { > varName = opt_args[OPT_ARG_DFTMINTOVAR]; > if (option_verbose > 2) > ast_verbose(VERBOSE_PREFIX_3 "Setting variable name to %s .\n", varName); > } > 372c455 < mp4 = MP4Read((char *) data, 9); --- > mp4 = MP4Read((char *) args.filename, 9); 515,516d597 < char dtmf[2]; < int res; 517a599 > int res; 520,521d601 < dtmf[0] = res; < dtmf[1] = 0; 522a603,604 > dtmfBuffer[strlen(dtmfBuffer)] = res; > int currentNumberOfDigits = strlen(dtmfBuffer); 524,529c606,620 < /* Check for dtmf extension in context */ < if (ast_exists_extension(chan, chan->context, dtmf, 1, NULL)) { < /* Free frame */ < ast_frfree(f); < /* exit */ < return res; --- > if ( currentNumberOfDigits >= numberofDigits ) { > if ( varName == NULL ) { > /* Check for dtmf extension in context */ > if (ast_exists_extension(chan, chan->context, dtmfBuffer, 1, NULL)) { > /* Free frame */ > ast_frfree(f); > /* exit */ > return res; > } else { > memset(dtmfBuffer, 0, sizeof(dtmfBuffer)); > } > } else { > pbx_builtin_setvar_helper(chan, varName, dtmfBuffer); > return 0; > } 531c622 < } --- > } >