]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
bridge_builtin_features: add beep via touch variable
authorMike Bradeen <mbradeen@sangoma.com>
Wed, 1 Mar 2023 22:39:15 +0000 (15:39 -0700)
committerGeorge Joseph <gjoseph@digium.com>
Mon, 20 Mar 2023 15:46:17 +0000 (10:46 -0500)
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

bridges/bridge_builtin_features.c
doc/CHANGES-staging/bridge_builtin_features_beep_on_monitor.txt [new file with mode: 0644]
funcs/func_periodic_hook.c
main/features_config.c

index 2aaa2e82ba2e4833ce95f3d2f3f78a46f5b0747f..a5b2330fa0679f861fc8f009df467499a79c146a 100644 (file)
@@ -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));
 
diff --git a/doc/CHANGES-staging/bridge_builtin_features_beep_on_monitor.txt b/doc/CHANGES-staging/bridge_builtin_features_beep_on_monitor.txt
new file mode 100644 (file)
index 0000000..39bf9a7
--- /dev/null
@@ -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.
index 3c7b93e6a79a7e904320da918f72019f11a54ccf..ec4b9ba4de9392b1012b564340e9d8095a63ed76 100644 (file)
@@ -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);
 }
index 2144999a29656eb8ea55770003913447f6896043..5b6e20946397dccc1b84d623506107ee2c522c29 100644 (file)
                                                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>