From 50c945ef74bdb3c24c332936bf4410afe0dd9fe0 Mon Sep 17 00:00:00 2001 From: markster Date: Fri, 1 Oct 2004 03:18:48 +0000 Subject: Add configurable options to Speex (from anthm) (bug #2536) git-svn-id: http://svn.digium.com/svn/asterisk/trunk@3868 f38db490-d61c-443f-a65b-d21fe96a405b --- codecs/codec_speex.c | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 123 insertions(+), 1 deletion(-) (limited to 'codecs/codec_speex.c') diff --git a/codecs/codec_speex.c b/codecs/codec_speex.c index 5c44a0aef..3650e4699 100755 --- a/codecs/codec_speex.c +++ b/codecs/codec_speex.c @@ -11,8 +11,21 @@ * the GNU General Public License * * This work was motivated by Jeremy McNamara + * hacked to be configurable by anthm and bkw 9/28/2004 */ +static int quality = 8; +static int complexity = 2; +static int enhancement = 0; +static int vad = 0; +static int vbr = 0; +static int vbr_quality = 0; +static int abr = 0; +static int abr_quality = 0; +static int dtx = 0; + + + #define TYPE_SILENCE 0x2 #define TYPE_HIGH 0x0 #define TYPE_LOW 0x1 @@ -21,6 +34,8 @@ #include #include #include +#include +#include #include #include #include @@ -69,6 +84,22 @@ static struct ast_translator_pvt *lintospeex_new(void) speex_bits_init(&tmp->bits); speex_bits_reset(&tmp->bits); speex_encoder_ctl(tmp->speex, SPEEX_GET_FRAME_SIZE, &tmp->framesize); + speex_encoder_ctl(tmp->speex, SPEEX_SET_QUALITY, &quality); + speex_encoder_ctl(tmp->speex, SPEEX_SET_COMPLEXITY, &complexity); + + if(vad) + speex_encoder_ctl(tmp->speex, SPEEX_SET_VAD, &vad); + if(dtx) + speex_encoder_ctl(tmp->speex, SPEEX_SET_DTX, &vad); + if(vbr) { + speex_encoder_ctl(tmp->speex, SPEEX_SET_VBR, &vbr); + speex_encoder_ctl(tmp->speex, SPEEX_SET_VBR_QUALITY, &vbr_quality); + } + if(abr) { + speex_encoder_ctl(tmp->speex, SPEEX_SET_VBR, &abr); + speex_encoder_ctl(tmp->speex, SPEEX_SET_VBR_QUALITY, &abr_quality); + } + tmp->tail = 0; } localusecnt++; @@ -87,6 +118,8 @@ static struct ast_translator_pvt *speextolin_new(void) } else { speex_bits_init(&tmp->bits); speex_decoder_ctl(tmp->speex, SPEEX_GET_FRAME_SIZE, &tmp->framesize); + if(enhancement) + speex_decoder_ctl(tmp->speex, SPEEX_SET_ENH, &enhancement); tmp->tail = 0; } localusecnt++; @@ -269,7 +302,95 @@ static struct ast_translator lintospeex = lintospeex_frameout, lintospeex_destroy, lintospeex_sample - }; + }; + + +static void parse_config(void) { + struct ast_config *cfg; + struct ast_variable *var; + int res; + if ((cfg = ast_load("codecs.conf"))) { + if ((var = ast_variable_browse(cfg, "speex"))) { + while (var) { + if (!strcasecmp(var->name, "quality")) { + res = abs(atoi(var->value)); + if(res > -1 && res < 11) { + if (option_verbose > 2) + ast_verbose(VERBOSE_PREFIX_3 "CODEC SPEEX: Setting Quality to %d\n",res); + ast_mutex_lock(&localuser_lock); + quality = res; + ast_mutex_unlock(&localuser_lock); + } else ast_log(LOG_ERROR,"Error Quality must be 0-10\n"); + + } else if (!strcasecmp(var->name, "complexity")) { + res = abs(atoi(var->value)); + if (option_verbose > 2) + ast_verbose(VERBOSE_PREFIX_3 "CODEC SPEEX: Setting Complexity to %d\n",res); + if(res > -1 && res < 11) { + ast_mutex_lock(&localuser_lock); + complexity = res; + ast_mutex_unlock(&localuser_lock); + } else ast_log(LOG_ERROR,"Error! Complexity must be 0-10\n"); + } else if (!strcasecmp(var->name, "vbr_quality")) { + res = abs(atoi(var->value)); + if (option_verbose > 2) + ast_verbose(VERBOSE_PREFIX_3 "CODEC SPEEX: Setting VBR Quality to %d\n",res); + if(res > -1 && res < 11) { + ast_mutex_lock(&localuser_lock); + vbr_quality = res; + ast_mutex_unlock(&localuser_lock); + } else ast_log(LOG_ERROR,"Error! VBR Quality must be 0-10\n"); + } else if (!strcasecmp(var->name, "abr_quality")) { + res = abs(atoi(var->value)); + if (option_verbose > 2) + ast_verbose(VERBOSE_PREFIX_3 "CODEC SPEEX: Setting ABR Quality to %d\n",res); + if(res > -1 && res < 11) { + ast_mutex_lock(&localuser_lock); + abr_quality = res; + ast_mutex_unlock(&localuser_lock); + } else ast_log(LOG_ERROR,"Error! ABR Quality must be 0-10\n"); + + } else if (!strcasecmp(var->name, "enhancement")) { + ast_mutex_lock(&localuser_lock); + enhancement = ast_true(var->value) ? 1 : 0; + if (option_verbose > 2) + ast_verbose(VERBOSE_PREFIX_3 "CODEC SPEEX: Perceptual Enhancement Mode. [%s]\n",enhancement ? "on" : "off"); + ast_mutex_unlock(&localuser_lock); + } else if (!strcasecmp(var->name, "vbr")) { + ast_mutex_lock(&localuser_lock); + vbr = ast_true(var->value) ? 1 : 0; + if (option_verbose > 2) + ast_verbose(VERBOSE_PREFIX_3 "CODEC SPEEX: VBR Mode. [%s]\n",vbr ? "on" : "off"); + ast_mutex_unlock(&localuser_lock); + } else if (!strcasecmp(var->name, "abr")) { + ast_mutex_lock(&localuser_lock); + abr = ast_true(var->value) ? 1 : 0; + if (option_verbose > 2) + ast_verbose(VERBOSE_PREFIX_3 "CODEC SPEEX: ABR Mode. [%s]\n",vbr ? "on" : "off"); + ast_mutex_unlock(&localuser_lock); + } else if (!strcasecmp(var->name, "vad")) { + ast_mutex_lock(&localuser_lock); + vad = ast_true(var->value) ? 1 : 0; + if (option_verbose > 2) + ast_verbose(VERBOSE_PREFIX_3 "CODEC SPEEX: VAD Mode. [%s]\n",vbr ? "on" : "off"); + ast_mutex_unlock(&localuser_lock); + } else if (!strcasecmp(var->name, "dtx")) { + ast_mutex_lock(&localuser_lock); + dtx = ast_true(var->value) ? 1 : 0; + if (option_verbose > 2) + ast_verbose(VERBOSE_PREFIX_3 "CODEC SPEEX: DTX Mode. [%s]\n",dtx ? "on" : "off"); + ast_mutex_unlock(&localuser_lock); + } + var = var->next; + } + } + } +} + +int reload(void) { + parse_config(); + return 0; +} int unload_module(void) { @@ -287,6 +408,7 @@ int unload_module(void) int load_module(void) { int res; + parse_config(); res=ast_register_translator(&speextolin); if (!res) res=ast_register_translator(&lintospeex); -- cgit v1.2.3