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:
parent
59d15c4c2a
commit
033c2a2283
|
@ -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.
|
|
@ -42,7 +42,7 @@
|
||||||
/*** DOCUMENTATION
|
/*** DOCUMENTATION
|
||||||
<function name="VOLUME" language="en_US">
|
<function name="VOLUME" language="en_US">
|
||||||
<synopsis>
|
<synopsis>
|
||||||
Set the TX or RX volume of a channel.
|
Set or get the TX or RX volume of a channel.
|
||||||
</synopsis>
|
</synopsis>
|
||||||
<syntax>
|
<syntax>
|
||||||
<parameter name="direction" required="true">
|
<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;
|
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 = {
|
static struct ast_custom_function volume_function = {
|
||||||
.name = "VOLUME",
|
.name = "VOLUME",
|
||||||
.write = volume_write,
|
.write = volume_write,
|
||||||
|
.read = volume_read,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int unload_module(void)
|
static int unload_module(void)
|
||||||
|
|
Loading…
Reference in New Issue