Provide the ability to adjust txgain/rxgain on a channel level via the CHANNEL() function

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@24621 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.4
BJ Weschke 19 years ago
parent 282eb80ed4
commit a7b1476058

@ -698,6 +698,7 @@ struct ast_frame *zt_exception(struct ast_channel *ast);
static int zt_indicate(struct ast_channel *chan, int condition); static int zt_indicate(struct ast_channel *chan, int condition);
static int zt_fixup(struct ast_channel *oldchan, struct ast_channel *newchan); static int zt_fixup(struct ast_channel *oldchan, struct ast_channel *newchan);
static int zt_setoption(struct ast_channel *chan, int option, void *data, int datalen); static int zt_setoption(struct ast_channel *chan, int option, void *data, int datalen);
static int zt_func_read(struct ast_channel *chan, char *function, char *data, char *buf, size_t len);
static const struct ast_channel_tech zap_tech = { static const struct ast_channel_tech zap_tech = {
.type = "Zap", .type = "Zap",
@ -716,6 +717,7 @@ static const struct ast_channel_tech zap_tech = {
.indicate = zt_indicate, .indicate = zt_indicate,
.fixup = zt_fixup, .fixup = zt_fixup,
.setoption = zt_setoption, .setoption = zt_setoption,
.func_channel_read = zt_func_read,
}; };
#ifdef HAVE_LIBPRI #ifdef HAVE_LIBPRI
@ -2904,6 +2906,25 @@ static int zt_setoption(struct ast_channel *chan, int option, void *data, int da
return 0; return 0;
} }
static int zt_func_read(struct ast_channel *chan, char *function, char *data, char *buf, size_t len)
{
struct zt_pvt *p = chan->tech_pvt;
if (!strcasecmp(data, "rxgain")) {
ast_mutex_lock(&p->lock);
snprintf(buf, len, "%f", p->rxgain);
ast_mutex_unlock(&p->lock);
} else if (!strcasecmp(data, "txgain")) {
ast_mutex_lock(&p->lock);
snprintf(buf, len, "%f", p->txgain);
ast_mutex_unlock(&p->lock);
} else {
ast_copy_string(buf, "", len);
}
return 0;
}
static void zt_unlink(struct zt_pvt *slave, struct zt_pvt *master, int needlock) static void zt_unlink(struct zt_pvt *slave, struct zt_pvt *master, int needlock)
{ {
/* Unlink a specific slave or all slaves/masters from a given master */ /* Unlink a specific slave or all slaves/masters from a given master */

@ -23,6 +23,7 @@
*/ */
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h>
#include <string.h> #include <string.h>
#include <sys/types.h> #include <sys/types.h>
@ -93,6 +94,7 @@ static int func_channel_write(struct ast_channel *chan, char *function,
char *data, const char *value) char *data, const char *value)
{ {
int ret = 0; int ret = 0;
signed char gainset;
if (!strcasecmp(data, "language")) if (!strcasecmp(data, "language"))
locked_string_field_set(chan, language, value); locked_string_field_set(chan, language, value);
@ -100,7 +102,13 @@ static int func_channel_write(struct ast_channel *chan, char *function,
locked_string_field_set(chan, musicclass, value); locked_string_field_set(chan, musicclass, value);
else if (!strcasecmp(data, "callgroup")) else if (!strcasecmp(data, "callgroup"))
chan->callgroup = ast_get_group(data); chan->callgroup = ast_get_group(data);
else if (!chan->tech->func_channel_write else if (!strcasecmp(data, "txgain")) {
sscanf(value, "%hhd", &gainset);
ast_channel_setoption(chan, AST_OPTION_TXGAIN, &gainset, sizeof(gainset), 0);
} else if (!strcasecmp(data, "rxgain")) {
sscanf(value, "%hhd", &gainset);
ast_channel_setoption(chan, AST_OPTION_RXGAIN, &gainset, sizeof(gainset), 0);
} else if (!chan->tech->func_channel_write
|| chan->tech->func_channel_write(chan, function, data, value)) { || chan->tech->func_channel_write(chan, function, data, value)) {
ast_log(LOG_WARNING, "Unknown or unavailable item requested: '%s'\n", ast_log(LOG_WARNING, "Unknown or unavailable item requested: '%s'\n",
data); data);
@ -123,8 +131,10 @@ static struct ast_custom_function channel_function = {
"R/O channeltype technology used for channel\n" "R/O channeltype technology used for channel\n"
"R/W language language for sounds played\n" "R/W language language for sounds played\n"
"R/W musicclass class (from musiconhold.conf) for hold music\n" "R/W musicclass class (from musiconhold.conf) for hold music\n"
"R/W rxgain set rxgain level on channel drivers that support it\n"
"R/O state state for channel\n" "R/O state state for channel\n"
"R/O tonezone zone for indications played\n" "R/O tonezone zone for indications played\n"
"R/W txgain set txgain level on channel drivers that support it\n"
"R/O videonativeformat format used natively for video\n" "R/O videonativeformat format used natively for video\n"
"\n" "\n"
"Additional items may be available from the channel driver providing\n" "Additional items may be available from the channel driver providing\n"

Loading…
Cancel
Save