diff options
author | Russell Bryant <russell@russellbryant.com> | 2014-04-15 23:21:19 +0000 |
---|---|---|
committer | Russell Bryant <russell@russellbryant.com> | 2014-04-15 23:21:19 +0000 |
commit | 5b7a769fd8b02dcb1d6326ebbe1d4eafcdc75491 (patch) | |
tree | 04a508265c012a493e472d4380bafb7884257896 /res/res_monitor.c | |
parent | ba1db5d8f536807415068810832ab2daed56f3bb (diff) |
(mix)monitor: Add options to enable a periodic beep
Add an option to enable a periodic beep to be played into a call if it
is being recorded. If enabled, it uses the PERIODIC_HOOK() function
internally to play the 'beep' prompt into the call at a specified
interval. This option is provided for both Monitor() and
MixMonitor().
Review: https://reviewboard.asterisk.org/r/3424/
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@412427 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'res/res_monitor.c')
-rw-r--r-- | res/res_monitor.c | 47 |
1 files changed, 42 insertions, 5 deletions
diff --git a/res/res_monitor.c b/res/res_monitor.c index 2eafcb238..f81507285 100644 --- a/res/res_monitor.c +++ b/res/res_monitor.c @@ -50,6 +50,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/utils.h" #include "asterisk/config.h" #include "asterisk/options.h" +#include "asterisk/beep.h" /*** DOCUMENTATION <application name="Monitor" language="en_US"> @@ -84,6 +85,10 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") <option name="b"> <para>Don't begin recording unless a call is bridged to another channel.</para> </option> + <option name="B"> + <para>Play a periodic beep while this call is being recorded.</para> + <argument name="interval"><para>Interval, in seconds. Default is 15.</para></argument> + </option> <option name="i"> <para>Skip recording of input stream (disables <literal>m</literal> option).</para> </option> @@ -290,7 +295,8 @@ static int ast_monitor_set_state(struct ast_channel *chan, int state) * \retval -1 on failure */ int AST_OPTIONAL_API_NAME(ast_monitor_start)(struct ast_channel *chan, const char *format_spec, - const char *fname_base, int need_lock, int stream_action) + const char *fname_base, int need_lock, int stream_action, + const char *beep_id) { int res = 0; RAII_VAR(struct stasis_message *, message, NULL, ao2_cleanup); @@ -309,6 +315,10 @@ int AST_OPTIONAL_API_NAME(ast_monitor_start)(struct ast_channel *chan, const cha return -1; } + if (!ast_strlen_zero(beep_id)) { + ast_copy_string(monitor->beep_id, beep_id, sizeof(monitor->beep_id)); + } + /* Determine file names */ if (!ast_strlen_zero(fname_base)) { int directory = strchr(fname_base, '/') ? 1 : 0; @@ -511,7 +521,11 @@ int AST_OPTIONAL_API_NAME(ast_monitor_stop)(struct ast_channel *chan, int need_l if (ast_safe_system(tmp) == -1) ast_log(LOG_WARNING, "Execute of %s failed.\n",tmp); } - + + if (!ast_strlen_zero(ast_channel_monitor(chan)->beep_id)) { + ast_beep_stop(chan, ast_channel_monitor(chan)->beep_id); + } + ast_free(ast_channel_monitor(chan)->format); ast_free(ast_channel_monitor(chan)); ast_channel_monitor_set(chan, NULL); @@ -644,6 +658,12 @@ enum { MON_FLAG_MIX = (1 << 1), MON_FLAG_DROP_IN = (1 << 2), MON_FLAG_DROP_OUT = (1 << 3), + MON_FLAG_BEEP = (1 << 4), +}; + +enum { + OPT_ARG_BEEP_INTERVAL, + OPT_ARG_ARRAY_SIZE, /* Always last element of the enum */ }; AST_APP_OPTIONS(monitor_opts, { @@ -651,6 +671,7 @@ AST_APP_OPTIONS(monitor_opts, { AST_APP_OPTION('m', MON_FLAG_MIX), AST_APP_OPTION('i', MON_FLAG_DROP_IN), AST_APP_OPTION('o', MON_FLAG_DROP_OUT), + AST_APP_OPTION_ARG('B', MON_FLAG_BEEP, OPT_ARG_BEEP_INTERVAL), }); /*! @@ -672,6 +693,8 @@ static int start_monitor_exec(struct ast_channel *chan, const char *data) int res = 0; char *parse; struct ast_flags flags = { 0 }; + char *opts[OPT_ARG_ARRAY_SIZE] = { NULL, }; + char beep_id[64] = ""; AST_DECLARE_APP_ARGS(args, AST_APP_ARG(format); AST_APP_ARG(fname_base); @@ -688,7 +711,7 @@ static int start_monitor_exec(struct ast_channel *chan, const char *data) AST_STANDARD_APP_ARGS(args, parse); if (!ast_strlen_zero(args.options)) { - ast_app_parse_options(monitor_opts, &flags, NULL, args.options); + ast_app_parse_options(monitor_opts, &flags, opts, args.options); if (ast_test_flag(&flags, MON_FLAG_MIX)) { stream_action |= X_JOIN; @@ -699,6 +722,20 @@ static int start_monitor_exec(struct ast_channel *chan, const char *data) if (ast_test_flag(&flags, MON_FLAG_DROP_OUT)) { stream_action &= ~X_REC_OUT; } + if (ast_test_flag(&flags, MON_FLAG_BEEP)) { + const char *interval_str = S_OR(opts[OPT_ARG_BEEP_INTERVAL], "15"); + unsigned int interval = 15; + + if (sscanf(interval_str, "%30u", &interval) != 1) { + ast_log(LOG_WARNING, "Invalid interval '%s' for periodic beep. Using default of %u\n", + interval_str, interval); + } + + if (ast_beep_start(chan, interval, beep_id, sizeof(beep_id))) { + ast_log(LOG_WARNING, "Unable to enable periodic beep, please ensure func_periodic_hook is loaded.\n"); + return -1; + } + } } arg = strchr(args.format, ':'); @@ -731,7 +768,7 @@ static int start_monitor_exec(struct ast_channel *chan, const char *data) return 0; } - res = ast_monitor_start(chan, args.format, args.fname_base, 1, stream_action); + res = ast_monitor_start(chan, args.format, args.fname_base, 1, stream_action, beep_id); if (res < 0) res = ast_monitor_change_fname(chan, args.fname_base, 1); @@ -790,7 +827,7 @@ static int start_monitor_action(struct mansession *s, const struct message *m) } } - if (ast_monitor_start(c, format, fname, 1, X_REC_IN | X_REC_OUT)) { + if (ast_monitor_start(c, format, fname, 1, X_REC_IN | X_REC_OUT, NULL)) { if (ast_monitor_change_fname(c, fname, 1)) { astman_send_error(s, m, "Could not start monitoring channel"); c = ast_channel_unref(c); |