From 3aaef20558e4719b12ad3acbd0a7e775dd4d9f8d Mon Sep 17 00:00:00 2001 From: bbryant Date: Thu, 1 May 2008 18:28:38 +0000 Subject: Add "read" capability to new libspeex functions in func_speex.c. func_speex.c is based on contributions from Switchvox. git-svn-id: http://svn.digium.com/svn/asterisk/trunk@114977 f38db490-d61c-443f-a65b-d21fe96a405b --- funcs/func_speex.c | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) (limited to 'funcs') diff --git a/funcs/func_speex.c b/funcs/func_speex.c index 33282a1f5..81cba38f5 100644 --- a/funcs/func_speex.c +++ b/funcs/func_speex.c @@ -209,7 +209,7 @@ static int speex_write(struct ast_channel *chan, const char *cmd, char *data, co } } } else if (!strcasecmp(cmd, "denoise")) { - (*sdi)->denoise = ast_true(value); + (*sdi)->denoise = (ast_true(value) != 0); if ((*sdi)->state) { speex_preprocess_ctl((*sdi)->state, SPEEX_PREPROCESS_SET_DENOISE, &(*sdi)->denoise); @@ -249,6 +249,43 @@ static int speex_write(struct ast_channel *chan, const char *cmd, char *data, co return 0; } +static int speex_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) +{ + struct ast_datastore *datastore = NULL; + struct speex_info *si = NULL; + struct speex_direction_info *sdi = NULL; + + if (!chan) { + ast_log(LOG_ERROR, "%s cannot be used without a channel!\n", cmd); + return -1; + } + + ast_channel_lock(chan); + if (!(datastore = ast_channel_datastore_find(chan, &speex_datastore, NULL))) { + ast_channel_unlock(chan); + return -1; + } + ast_channel_unlock(chan); + + si = datastore->data; + + if (!strcasecmp(data, "tx")) + sdi = si->tx; + else if (!strcasecmp(data, "rx")) + sdi = si->rx; + else { + ast_log(LOG_ERROR, "%s(%s) must either \"tx\" or \"rx\"\n", cmd, data); + return -1; + } + + if (!strcasecmp(cmd, "agc")) + snprintf(buf, len, "%.01f", sdi ? sdi->agclevel : 0.0); + else + snprintf(buf, len, "%d", sdi ? sdi->denoise : 0); + + return 0; +} + static struct ast_custom_function agc_function = { .name = "AGC", .synopsis = "Apply automatic gain control to audio on a channel", @@ -266,6 +303,7 @@ static struct ast_custom_function agc_function = { " Set(AGC(tx)=off)\n" "", .write = speex_write, + .read = speex_read }; static struct ast_custom_function denoise_function = { @@ -284,6 +322,7 @@ static struct ast_custom_function denoise_function = { " Set(DENOISE(tx)=off)\n" "", .write = speex_write, + .read = speex_read }; static int unload_module(void) -- cgit v1.2.3