bridge_builtin_features: add beep via touch variable
Add periodic beep option to one-touch recording by setting the touch variable TOUCH_MONITOR_BEEP or TOUCH_MIXMONITOR_BEEP to the desired interval in seconds. If the interval is less than 5 seconds, a minimum of 5 seconds will be imposed. If the interval is set to an invalid value, it will default to 15 seconds. A new test event PERIODIC_HOOK_ENABLED was added to the func_periodic_hook hook_on function to indicate when a hook is started. This is so we can test that the touch variable starts the hook as expected. ASTERISK-30446 Change-Id: I800e494a789ba7a930bbdcd717e89d86040d6661
This commit is contained in:
parent
c4a55322bc
commit
edd7f1b060
|
@ -51,6 +51,7 @@
|
|||
#include "asterisk/mixmonitor.h"
|
||||
#include "asterisk/audiohook.h"
|
||||
#include "asterisk/causes.h"
|
||||
#include "asterisk/beep.h"
|
||||
|
||||
enum set_touch_variables_res {
|
||||
SET_TOUCH_SUCCESS,
|
||||
|
@ -76,22 +77,25 @@ static void set_touch_variable(enum set_touch_variables_res *res, struct ast_cha
|
|||
}
|
||||
}
|
||||
|
||||
static enum set_touch_variables_res set_touch_variables(struct ast_channel *chan, char **touch_format, char **touch_monitor, char **touch_monitor_prefix)
|
||||
static enum set_touch_variables_res set_touch_variables(struct ast_channel *chan, char **touch_format, char **touch_monitor, char **touch_monitor_prefix, char **touch_monitor_beep)
|
||||
{
|
||||
enum set_touch_variables_res res = SET_TOUCH_UNSET;
|
||||
const char *var_format;
|
||||
const char *var_monitor;
|
||||
const char *var_prefix;
|
||||
const char *var_beep;
|
||||
|
||||
SCOPED_CHANNELLOCK(lock, chan);
|
||||
|
||||
var_format = "TOUCH_MIXMONITOR_FORMAT";
|
||||
var_monitor = "TOUCH_MIXMONITOR";
|
||||
var_prefix = "TOUCH_MIXMONITOR_PREFIX";
|
||||
var_beep = "TOUCH_MIXMONITOR_BEEP";
|
||||
|
||||
set_touch_variable(&res, chan, var_format, touch_format);
|
||||
set_touch_variable(&res, chan, var_monitor, touch_monitor);
|
||||
set_touch_variable(&res, chan, var_prefix, touch_monitor_prefix);
|
||||
set_touch_variable(&res, chan, var_beep, touch_monitor_beep);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
@ -122,7 +126,7 @@ static void stop_automixmonitor(struct ast_bridge_channel *bridge_channel, struc
|
|||
|
||||
static void start_automixmonitor(struct ast_bridge_channel *bridge_channel, struct ast_channel *peer_chan, struct ast_features_general_config *features_cfg, const char *start_message)
|
||||
{
|
||||
char *touch_filename;
|
||||
char *touch_filename, mix_options[32] = "b";
|
||||
size_t len;
|
||||
int x;
|
||||
enum set_touch_variables_res set_touch_res;
|
||||
|
@ -130,15 +134,16 @@ static void start_automixmonitor(struct ast_bridge_channel *bridge_channel, stru
|
|||
RAII_VAR(char *, touch_format, NULL, ast_free);
|
||||
RAII_VAR(char *, touch_monitor, NULL, ast_free);
|
||||
RAII_VAR(char *, touch_monitor_prefix, NULL, ast_free);
|
||||
RAII_VAR(char *, touch_monitor_beep, NULL, ast_free);
|
||||
|
||||
set_touch_res = set_touch_variables(bridge_channel->chan, &touch_format,
|
||||
&touch_monitor, &touch_monitor_prefix);
|
||||
&touch_monitor, &touch_monitor_prefix, &touch_monitor_beep);
|
||||
switch (set_touch_res) {
|
||||
case SET_TOUCH_SUCCESS:
|
||||
break;
|
||||
case SET_TOUCH_UNSET:
|
||||
set_touch_res = set_touch_variables(peer_chan, &touch_format, &touch_monitor,
|
||||
&touch_monitor_prefix);
|
||||
&touch_monitor_prefix, &touch_monitor_beep);
|
||||
if (set_touch_res == SET_TOUCH_ALLOC_FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
@ -181,7 +186,22 @@ static void start_automixmonitor(struct ast_bridge_channel *bridge_channel, stru
|
|||
|
||||
ast_verb(4, "AutoMixMonitor used to record call. Filename: %s\n", touch_filename);
|
||||
|
||||
if (ast_start_mixmonitor(peer_chan, touch_filename, "b")) {
|
||||
if (!ast_strlen_zero(touch_monitor_beep)) {
|
||||
unsigned int interval = 15;
|
||||
if (sscanf(touch_monitor_beep, "%30u", &interval) != 1) {
|
||||
ast_log(LOG_WARNING, "Invalid interval '%s' for periodic beep. Using default of %u\n",
|
||||
touch_monitor_beep, interval);
|
||||
}
|
||||
|
||||
if (interval < 5) {
|
||||
interval = 5;
|
||||
ast_log(LOG_WARNING, "Interval '%s' too small for periodic beep. Using minimum of %u\n",
|
||||
touch_monitor_beep, interval);
|
||||
}
|
||||
snprintf(mix_options, sizeof(mix_options), "bB(%d)", interval);
|
||||
}
|
||||
|
||||
if (ast_start_mixmonitor(peer_chan, touch_filename, mix_options)) {
|
||||
ast_verb(4, "AutoMixMonitor feature was tried by '%s' but MixMonitor failed to start.\n",
|
||||
ast_channel_name(bridge_channel->chan));
|
||||
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
Subject: bridge_builtin_features
|
||||
|
||||
Add optional touch variable : TOUCH_MIXMONITOR_BEEP(interval)
|
||||
|
||||
Setting TOUCH_MIXMONITOR_BEEP/TOUCH_MONITOR_BEEP to a valid
|
||||
interval in seconds will result in a periodic beep being
|
||||
played to the monitored channel upon MixMontior/Monitor
|
||||
feature start.
|
||||
|
||||
If an interval less than 5 seconds is specified, the interval
|
||||
will default to 5 seconds. If the value is set to an invalid
|
||||
interval, the default of 15 seconds will be used.
|
|
@ -40,6 +40,7 @@
|
|||
#include "asterisk/pbx.h"
|
||||
#include "asterisk/app.h"
|
||||
#include "asterisk/audiohook.h"
|
||||
#include "asterisk/test.h"
|
||||
#define AST_API_MODULE
|
||||
#include "asterisk/beep.h"
|
||||
|
||||
|
@ -343,6 +344,8 @@ static int hook_on(struct ast_channel *chan, const char *data, unsigned int hook
|
|||
|
||||
ast_debug(1, "hook to %s@%s enabled on %s with interval of %u seconds\n",
|
||||
args.exten, args.context, ast_channel_name(chan), interval);
|
||||
ast_test_suite_event_notify("PERIODIC_HOOK_ENABLED", "Exten: %s\r\nChannel: %s\r\nInterval: %u\r\n",
|
||||
args.exten, ast_channel_name(chan), interval);
|
||||
|
||||
return init_hook(chan, args.context, args.exten, interval, hook_id);
|
||||
}
|
||||
|
|
|
@ -199,6 +199,9 @@
|
|||
channel variable or <literal>auto</literal> if the variable is not set. The timestamp
|
||||
is a UNIX timestamp. The suffix is either the value of the <replaceable>TOUCH_MIXMONITOR</replaceable>
|
||||
channel variable or the callerID of the channels if the variable is not set.</para>
|
||||
<para>To play a periodic beep while this call is being recorded, set the
|
||||
<replaceable>TOUCH_MIXMONITOR_BEEP</replaceable> to the interval in seconds. The interval will default
|
||||
to 15 seconds if invalid. The minimum interval is 5 seconds.</para>
|
||||
</description>
|
||||
</configOption>
|
||||
</configObject>
|
||||
|
|
Loading…
Reference in New Issue