From 033c2a22839698be0c0f54419169c76c4eac6046 Mon Sep 17 00:00:00 2001 From: Naveen Albert Date: Thu, 20 May 2021 09:18:03 -0400 Subject: [PATCH] func_volume: Add read capability to function. 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 | 4 ++ funcs/func_volume.c | 48 +++++++++++++++++++++++- 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 doc/CHANGES-staging/func_volume_read.txt diff --git a/doc/CHANGES-staging/func_volume_read.txt b/doc/CHANGES-staging/func_volume_read.txt new file mode 100644 index 0000000000..8ea27cdce3 --- /dev/null +++ b/doc/CHANGES-staging/func_volume_read.txt @@ -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. diff --git a/funcs/func_volume.c b/funcs/func_volume.c index 85874794b4..a20bb76042 100644 --- a/funcs/func_volume.c +++ b/funcs/func_volume.c @@ -42,7 +42,7 @@ /*** DOCUMENTATION - Set the TX or RX volume of a channel. + Set or get the TX or RX volume of a channel. @@ -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)