]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
func_volume: Add read capability to function.
authorNaveen Albert <mail@interlinked.x10host.com>
Thu, 20 May 2021 13:18:03 +0000 (09:18 -0400)
committerFriendly Automation <jenkins2@gerrit.asterisk.org>
Wed, 26 May 2021 16:19:00 +0000 (11:19 -0500)
Up until now, the VOLUME function has been write
only, so that TX/RX values can be set but not
read afterwards. Now, previously set TX/RX values
can be read later.

ASTERISK-29439

Change-Id: Ia23e92fa2e755c36e9c8e69f2940d2703ccccb5f

doc/CHANGES-staging/func_volume_read.txt [new file with mode: 0644]
funcs/func_volume.c

diff --git a/doc/CHANGES-staging/func_volume_read.txt b/doc/CHANGES-staging/func_volume_read.txt
new file mode 100644 (file)
index 0000000..8ea27cd
--- /dev/null
@@ -0,0 +1,4 @@
+Subject: func_volume now can be read
+
+The VOLUME function can now also be used
+to read existing values previously set.
index 85874794b40355e420415ae78bf6acc569f6912a..a20bb76042ade14050e192a33045fbb85049cdc7 100644 (file)
@@ -42,7 +42,7 @@
 /*** DOCUMENTATION
        <function name="VOLUME" language="en_US">
                <synopsis>
-                       Set the TX or RX volume of a channel.
+                       Set or get the TX or RX volume of a channel.
                </synopsis>
                <syntax>
                        <parameter name="direction" required="true">
@@ -221,9 +221,55 @@ static int volume_write(struct ast_channel *chan, const char *cmd, char *data, c
        return 0;
 }
 
+static int volume_read(struct ast_channel *chan, const char *cmd, char *data, char *buffer, size_t buflen)
+{
+       struct ast_datastore *datastore = NULL;
+       struct volume_information *vi = NULL;
+
+       /* Separate options from argument */
+
+       AST_DECLARE_APP_ARGS(args,
+               AST_APP_ARG(direction);
+               AST_APP_ARG(options);
+       );
+
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
+       AST_STANDARD_APP_ARGS(args, data);
+
+       ast_channel_lock(chan);
+       if (!(datastore = ast_channel_datastore_find(chan, &volume_datastore, NULL))) {
+               ast_channel_unlock(chan);
+               return -1; /* no active audiohook, nothing to read */
+       } else {
+               ast_channel_unlock(chan);
+               vi = datastore->data;
+       }
+
+       /* Obtain current gain using volume information structure */
+       if (ast_strlen_zero(args.direction)) {
+               ast_log(LOG_ERROR, "Direction must be specified for VOLUME function\n");
+               return -1;
+       }
+
+       if (!strcasecmp(args.direction, "tx")) {
+               snprintf(buffer, buflen, "%f", vi->tx_gain);
+       } else if (!strcasecmp(args.direction, "rx")) {
+               snprintf(buffer, buflen, "%f", vi->rx_gain);
+       } else {
+               ast_log(LOG_ERROR, "Direction must be either RX or TX\n");
+       }
+
+       return 0;
+}
+
 static struct ast_custom_function volume_function = {
        .name = "VOLUME",
        .write = volume_write,
+       .read = volume_read,
 };
 
 static int unload_module(void)