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
This commit is contained in:
Naveen Albert 2021-05-20 09:18:03 -04:00 committed by George Joseph
parent 59d15c4c2a
commit 033c2a2283
2 changed files with 51 additions and 1 deletions

View File

@ -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.

View 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)