From cf7dd4c53ab358f9010b82af79e68c759c0f979e Mon Sep 17 00:00:00 2001 From: bweschke Date: Wed, 3 May 2006 22:02:50 +0000 Subject: [PATCH] Provide the ability to adjust txgain/rxgain on a channel level via the CHANNEL() function git-svn-id: http://svn.digium.com/svn/asterisk/trunk@24621 f38db490-d61c-443f-a65b-d21fe96a405b --- channels/chan_zap.c | 21 +++++++++++++++++++++ funcs/func_channel.c | 12 +++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/channels/chan_zap.c b/channels/chan_zap.c index f1a956638..86cf8bdb5 100644 --- a/channels/chan_zap.c +++ b/channels/chan_zap.c @@ -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_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_func_read(struct ast_channel *chan, char *function, char *data, char *buf, size_t len); static const struct ast_channel_tech zap_tech = { .type = "Zap", @@ -716,6 +717,7 @@ static const struct ast_channel_tech zap_tech = { .indicate = zt_indicate, .fixup = zt_fixup, .setoption = zt_setoption, + .func_channel_read = zt_func_read, }; #ifdef HAVE_LIBPRI @@ -2904,6 +2906,25 @@ static int zt_setoption(struct ast_channel *chan, int option, void *data, int da 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) { /* Unlink a specific slave or all slaves/masters from a given master */ diff --git a/funcs/func_channel.c b/funcs/func_channel.c index 16aebb4c2..3fe5db240 100644 --- a/funcs/func_channel.c +++ b/funcs/func_channel.c @@ -23,6 +23,7 @@ */ #include +#include #include #include @@ -93,6 +94,7 @@ static int func_channel_write(struct ast_channel *chan, char *function, char *data, const char *value) { int ret = 0; + signed char gainset; if (!strcasecmp(data, "language")) 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); else if (!strcasecmp(data, "callgroup")) 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)) { ast_log(LOG_WARNING, "Unknown or unavailable item requested: '%s'\n", data); @@ -123,8 +131,10 @@ static struct ast_custom_function channel_function = { "R/O channeltype technology used for channel\n" "R/W language language for sounds played\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 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" "\n" "Additional items may be available from the channel driver providing\n"