summaryrefslogtreecommitdiff
authorZhe Wang <Zhe.Wang@amlogic.com>2019-05-28 11:56:20 (GMT)
committer Zhe Wang <Zhe.Wang@amlogic.com>2019-05-30 02:49:43 (GMT)
commit2981f768ea89caa626d166d5a986c70d988c9323 (patch)
treedfe071f9cf6add5fab999d1d7bfadf7920b04250
parent03a30138b7b7a6888bfa51727fcb931ddf910a27 (diff)
downloadav-2981f768ea89caa626d166d5a986c70d988c9323.zip
av-2981f768ea89caa626d166d5a986c70d988c9323.tar.gz
av-2981f768ea89caa626d166d5a986c70d988c9323.tar.bz2
audio: optimize agc [1/3]
PD#TV-5933 Problem: release time and attack need change by ini Solution: optimize agc Verify: verrify by marconi Change-Id: I53f2a6460d376faccb532341b38cedcea7c08e3e Signed-off-by: Zhe Wang <Zhe.Wang@amlogic.com>
Diffstat
-rw-r--r--libaudioeffect/AVL/Avl.cpp254
-rw-r--r--libaudioeffect/AVL/aml_agc.h26
-rw-r--r--libaudioeffect/AVL/lib_aml_agc.a116
3 files changed, 199 insertions, 197 deletions
diff --git a/libaudioeffect/AVL/Avl.cpp b/libaudioeffect/AVL/Avl.cpp
index bab03cd..9962df2 100644
--- a/libaudioeffect/AVL/Avl.cpp
+++ b/libaudioeffect/AVL/Avl.cpp
@@ -80,17 +80,19 @@ typedef enum {
} Avlparams;
typedef struct Avlcfg_s{
+ /*in dB*/
float peak_level;
float dynamic_threshold;
float noise_threshold;
+ /*in ms*/
int response_time;
+ /*in ms*/
int release_time;
} Avlcfg;
typedef struct Avldata_s {
-
- /* avl API needed data */
- AmlAGC *agc;
+ /* avl API needed data */
+ void *agc;
Avlcfg tbcfg;
int32_t enable;
int32_t *usr_cfg;
@@ -119,6 +121,7 @@ int Avl_get_model_name(char *model_name, int size)
snprintf(model_name, size, "DEFAULT");
else
snprintf(model_name, size, "%s", node);
+
ALOGD("%s: Model Name -> %s", __FUNCTION__, model_name);
return ret;
}
@@ -143,6 +146,7 @@ int Avl_get_ini_file(char *ini_name, int size)
ALOGD("%s: INI File is not exist", __FUNCTION__);
goto exit;
}
+
ALOGD("%s: INI File -> %s", __FUNCTION__, ini_value);
strncpy(ini_name, ini_value, size);
@@ -153,21 +157,21 @@ exit:
return result;
}
-int Avl_parse_mode_config(AvlContext *pContext, int source_num, int param_num, const char *buffer)
+int Avl_parse_mode_config(AvlContext *pContext, int param_num, const char *buffer)
{
int i;
char *Rch = (char *)buffer;
Avldata *data = &pContext->gAvldata;
if (data->usr_cfg == NULL) {
- data->usr_cfg = (int *)calloc(source_num * param_num, sizeof(int));
+ data->usr_cfg = (int *)calloc(param_num, sizeof(int));
if (!data->usr_cfg) {
ALOGE("%s: alloc failed", __FUNCTION__);
return -EINVAL;
}
}
- for (i = 0; i < source_num * param_num; i++) {
+ for (i = 0; i < param_num; i++) {
if (i == 0)
Rch = strtok(Rch, ",");
else
@@ -179,6 +183,15 @@ int Avl_parse_mode_config(AvlContext *pContext, int source_num, int param_num, c
data->usr_cfg[i] = atoi(Rch);
}
+ if (param_num != 5)
+ return -1;
+
+ pContext->gAvldata.tbcfg.peak_level = data->usr_cfg[0];
+ pContext->gAvldata.tbcfg.dynamic_threshold = data->usr_cfg[1];
+ pContext->gAvldata.tbcfg.noise_threshold = data->usr_cfg[2];
+ pContext->gAvldata.tbcfg.response_time = data->usr_cfg[3];
+ pContext->gAvldata.tbcfg.release_time = data->usr_cfg[4];
+
return 0;
}
@@ -189,6 +202,7 @@ int Avl_load_ini_file(AvlContext *pContext)
const char *ini_value = NULL;
Avldata *data = &pContext->gAvldata;
IniParser* pIniParser = NULL;
+
if (Avl_get_ini_file(ini_name, sizeof(ini_name)) < 0)
goto error;
@@ -197,41 +211,53 @@ int Avl_load_ini_file(AvlContext *pContext)
ALOGD("%s: %s load failed", __FUNCTION__, ini_name);
goto error;
}
- /*
- ini_value = pIniParser->GetString("Avl", "Avl_enable", "1");
+
+ ini_value = pIniParser->GetString("Avl", "Avl_enable", "0");
if (ini_value == NULL)
goto error;
ALOGD("%s: enable -> %s", __FUNCTION__, ini_value);
data->enable = atoi(ini_value);
- */
- ini_value = pIniParser->GetString("Avl", "avl_sourcenum", "5");
- if (ini_value == NULL)
- goto error;
- ALOGD("%s: sound mode num -> %s", __FUNCTION__, ini_value);
- data->source_num = atoi(ini_value);
+
ini_value = pIniParser->GetString("Avl", "avl_paramnum", "5");
if (ini_value == NULL)
goto error;
ALOGD("%s: sound band num -> %s", __FUNCTION__, ini_value);
data->param_num = atoi(ini_value);
- //record different source init value
+
ini_value = pIniParser->GetString("Avl", "avl_config", "NULL");
if (ini_value == NULL)
goto error;
- ALOGD("%s: condig -> %s", __FUNCTION__, ini_value);
- result = Avl_parse_mode_config(pContext, data->source_num, data->param_num, ini_value);
+ ALOGD("%s: condig -> %s", __FUNCTION__, ini_value);
+
+ result = Avl_parse_mode_config(pContext, data->param_num, ini_value);
+ if (result != 0)
+ goto error;
+
+ ALOGD("%s: %s", __FUNCTION__, result == 0 ? "sucessful" : "failed");
+ delete pIniParser;
+ pIniParser = NULL;
+
+ return 0;
- result = 0;
error:
ALOGD("%s: %s", __FUNCTION__, result == 0 ? "sucessful" : "failed");
delete pIniParser;
pIniParser = NULL;
+
+ /*parser ini fail, use default value*/
+ pContext->gAvldata.tbcfg.peak_level = -12;
+ pContext->gAvldata.tbcfg.dynamic_threshold = -12;
+ pContext->gAvldata.tbcfg.noise_threshold = -60;
+ pContext->gAvldata.tbcfg.response_time = 100;
+ pContext->gAvldata.tbcfg.release_time = 3000;
+
return result;
}
int Avl_init(AvlContext *pContext)
{
- Avldata *data=&pContext->gAvldata;
+ Avldata *data = &pContext->gAvldata;
+
pContext->config.inputCfg.accessMode = EFFECT_BUFFER_ACCESS_READ;
pContext->config.inputCfg.channels = AUDIO_CHANNEL_OUT_STEREO;
pContext->config.inputCfg.format = AUDIO_FORMAT_PCM_16_BIT;
@@ -249,46 +275,45 @@ int Avl_init(AvlContext *pContext)
pContext->config.outputCfg.bufferProvider.cookie = NULL;
pContext->config.outputCfg.mask = EFFECT_CONFIG_ALL;
- pContext->gAvldata.tbcfg.dynamic_threshold=-24;
- pContext->gAvldata.tbcfg.noise_threshold=-40;
- pContext->gAvldata.tbcfg.peak_level=-18;
- pContext->gAvldata.tbcfg.response_time=512;
- pContext->gAvldata.tbcfg.release_time=2;
-
DeleteAmlAGC(data->agc);
if (data->agc == NULL) {
- data->agc=NewAmlAGC(data->tbcfg.peak_level,data->tbcfg.dynamic_threshold,data->tbcfg.noise_threshold,data->tbcfg.response_time,data->tbcfg.release_time);
+ data->agc = NewAmlAGC();
+ SetAmlAGC(data->agc, data->tbcfg.peak_level, data->tbcfg.dynamic_threshold,
+ data->tbcfg.noise_threshold, data->tbcfg.response_time, data->tbcfg.release_time);
- ALOGD("agc->agc_enable=%d",data->agc->agc_enable);
- ALOGI("Avl_init! peak_level = %fdB, dynamic_theshold = %fdB, noise_threshold = %fdB\n",
- data->tbcfg.peak_level,data->tbcfg.dynamic_threshold,data->tbcfg.noise_threshold);
- }else
+ ALOGI("Avl_init! peak_level = %fdB, dynamic_theshold = %fdB, noise_threshold = %fdB\n",
+ data->tbcfg.peak_level, data->tbcfg.dynamic_threshold, data->tbcfg.noise_threshold);
+ } else {
ALOGE("%s, AGC is exist\n", __FUNCTION__);
- ALOGD("%s: sucessful", __FUNCTION__);
- return 0;
+ }
+
+ ALOGD("%s: sucessful", __FUNCTION__);
+ return 0;
}
/*Set I/O configuration: sample rate, channel, format, etc.*/
int Avl_configure(AvlContext *pContext, effect_config_t *pConfig)
{
if (pConfig->inputCfg.samplingRate != pConfig->outputCfg.samplingRate)
- return -EINVAL;
+ return -EINVAL;
if (pConfig->inputCfg.channels != pConfig->outputCfg.channels)
- return -EINVAL;
+ return -EINVAL;
if (pConfig->inputCfg.format != pConfig->outputCfg.format)
- return -EINVAL;
+ return -EINVAL;
if (pConfig->inputCfg.channels != AUDIO_CHANNEL_OUT_STEREO) {
- ALOGW("%s: channels in = 0x%x channels out = 0x%x", __FUNCTION__, pConfig->inputCfg.channels, pConfig->outputCfg.channels);
- pConfig->inputCfg.channels = pConfig->outputCfg.channels = AUDIO_CHANNEL_OUT_STEREO;
- }
+ ALOGW("%s: channels in = 0x%x channels out = 0x%x", __FUNCTION__,
+ pConfig->inputCfg.channels, pConfig->outputCfg.channels);
+ pConfig->inputCfg.channels = pConfig->outputCfg.channels = AUDIO_CHANNEL_OUT_STEREO;
+ }
if (pConfig->outputCfg.accessMode != EFFECT_BUFFER_ACCESS_WRITE &&
- pConfig->outputCfg.accessMode != EFFECT_BUFFER_ACCESS_ACCUMULATE)
- return -EINVAL;
+ pConfig->outputCfg.accessMode != EFFECT_BUFFER_ACCESS_ACCUMULATE)
+ return -EINVAL;
if (pConfig->inputCfg.format != AUDIO_FORMAT_PCM_16_BIT) {
- ALOGW("%s: format in = 0x%x format out = 0x%x", __FUNCTION__, pConfig->inputCfg.format, pConfig->outputCfg.format);
- pConfig->inputCfg.format = pConfig->outputCfg.format = AUDIO_FORMAT_PCM_16_BIT;
- }
- memcpy(&pContext->config, pConfig, sizeof(effect_config_t));
+ ALOGW("%s: format in = 0x%x format out = 0x%x", __FUNCTION__,
+ pConfig->inputCfg.format, pConfig->outputCfg.format);
+ pConfig->inputCfg.format = pConfig->outputCfg.format = AUDIO_FORMAT_PCM_16_BIT;
+ }
+ memcpy(&pContext->config, pConfig, sizeof(effect_config_t));
return 0;
}
@@ -296,63 +321,59 @@ int Avl_configure(AvlContext *pContext, effect_config_t *pConfig)
int Avl_setParameter(AvlContext *pContext, void *pParam, void *pValue)
{
int32_t param = *(int32_t *)pParam;
- int32_t i, value;
+ int32_t value;
Avldata *data=&pContext->gAvldata;
Avlcfg *tbcfg=&data->tbcfg;
switch (param) {
case AVL_PARAM_PEAK_LEVEL:
value = *(int32_t *)pValue;
- tbcfg->peak_level=(float)value;
- SetAmlAGC(data->agc,tbcfg->peak_level, tbcfg->dynamic_threshold, tbcfg->noise_threshold, tbcfg->response_time,tbcfg->release_time);
+ tbcfg->peak_level = (float)value;
+ SetAmlAGC(data->agc,tbcfg->peak_level, tbcfg->dynamic_threshold,
+ tbcfg->noise_threshold, tbcfg->response_time,tbcfg->release_time);
ALOGD("%s: set peak_level -> %f ", __FUNCTION__, tbcfg->peak_level);
break;
case AVL_PARAM_DYNAMIC_THRESHOLD:
value = *(int32_t *)pValue;
- tbcfg->dynamic_threshold=(float)value;
- SetAmlAGC(data->agc,tbcfg->peak_level, tbcfg->dynamic_threshold, tbcfg->noise_threshold, tbcfg->response_time,tbcfg->release_time);
+ tbcfg->dynamic_threshold = (float)value;
+ SetAmlAGC(data->agc,tbcfg->peak_level, tbcfg->dynamic_threshold,
+ tbcfg->noise_threshold, tbcfg->response_time,tbcfg->release_time);
ALOGD("%s: set dynamic_threshold -> %f ", __FUNCTION__, tbcfg->dynamic_threshold);
break;
case AVL_PARAM_NOISE_THRESHOLD :
value = *(int32_t *)pValue;
- tbcfg->noise_threshold=(float)value;
- SetAmlAGC(data->agc,tbcfg->peak_level, tbcfg->dynamic_threshold, tbcfg->noise_threshold, tbcfg->response_time,tbcfg->release_time);
+ tbcfg->noise_threshold = (float)value;
+ SetAmlAGC(data->agc,tbcfg->peak_level, tbcfg->dynamic_threshold,
+ tbcfg->noise_threshold, tbcfg->response_time,tbcfg->release_time);
ALOGD("%s: set noise_threshold -> %f ", __FUNCTION__, tbcfg->noise_threshold);
break;
case AVL_PARAM_RESPONSE_TIME:
value = *(int32_t *)pValue;
- tbcfg->response_time=value;
- SetAmlAGC(data->agc,tbcfg->peak_level, tbcfg->dynamic_threshold, tbcfg->noise_threshold, tbcfg->response_time,tbcfg->release_time);
+ tbcfg->response_time = value / 48; // UI set sample
+ SetAmlAGC(data->agc,tbcfg->peak_level, tbcfg->dynamic_threshold,
+ tbcfg->noise_threshold, tbcfg->response_time,tbcfg->release_time);
ALOGD("%s: set response_time-> %d ", __FUNCTION__, tbcfg->response_time);
break;
case AVL_PARAM_ENABLE:
value = *(int32_t *)pValue;
data->enable = value;
- ALOGD("%s: Set status -> %s", __FUNCTION__,AvlStatusstr[value]);
+ ALOGD("%s: Set status -> %s", __FUNCTION__, AvlStatusstr[value]);
break;
case AVL_PARAM_RELEASE_TIME:
value = *(int32_t *)pValue;
- tbcfg->release_time=value;
- SetAmlAGC(data->agc,tbcfg->peak_level, tbcfg->dynamic_threshold, tbcfg->noise_threshold, tbcfg->response_time,tbcfg->release_time);
+ tbcfg->release_time = value * 1000; // UI set s, here change s to ms
+ SetAmlAGC(data->agc,tbcfg->peak_level, tbcfg->dynamic_threshold,
+ tbcfg->noise_threshold, tbcfg->response_time,tbcfg->release_time);
ALOGD("%s: set release_time-> %d ", __FUNCTION__, tbcfg->release_time);
break;
case AVL_PARAM_SOURCE_IN:
value = *(int32_t *)pValue;
- if (value < 0 || value > data->source_num) {
- ALOGE("%s: incorrect mode value %d", __FUNCTION__, value);
- return -EINVAL;
+ if (value < 0) {
+ ALOGE("%s: incorrect mode value %d", __FUNCTION__, value);
+ return -EINVAL;
}
data->soure_id = value;
ALOGD("%s: Set source_id -> %d", __FUNCTION__, value);
- for (i = 0; i < data->param_num; i++) {
- ALOGD("%s: Set band[%d] -> %d", __FUNCTION__, i + 1, data->usr_cfg[value * data->param_num + i]);
- }
- tbcfg->peak_level =data->usr_cfg[value * data->param_num];
- tbcfg->dynamic_threshold =data->usr_cfg[value * data->param_num + 1];
- tbcfg->noise_threshold =data->usr_cfg[value * data->param_num + 2];
- tbcfg->response_time =data->usr_cfg[value * data->param_num + 3];
- tbcfg->release_time =data->usr_cfg[value * data->param_num + 4];
- SetAmlAGC(data->agc,tbcfg->peak_level, tbcfg->dynamic_threshold, tbcfg->noise_threshold, tbcfg->response_time,tbcfg->release_time);
break;
default:
ALOGE("%s: unknown param %08x", __FUNCTION__, param);
@@ -374,64 +395,64 @@ int Avl_getParameter(AvlContext*pContext, void *pParam, size_t *pValueSize, void
*pValueSize = 0;
return -EINVAL;
}
- *(int*)pValue=(int)tbcfg->peak_level;
+ *(int*)pValue = (int)tbcfg->peak_level;
ALOGD("%s: Get peak_level -> %f ", __FUNCTION__, tbcfg->peak_level);
break;
- case AVL_PARAM_DYNAMIC_THRESHOLD:
+ case AVL_PARAM_DYNAMIC_THRESHOLD:
if (*pValueSize < sizeof(int32_t)) {
- *pValueSize = 0;
- return -EINVAL;
- }
- *(float*)pValue=tbcfg->dynamic_threshold;
- ALOGD("%s: Get dynamic_threshold -> %f ", __FUNCTION__, tbcfg->dynamic_threshold);
- break;
+ *pValueSize = 0;
+ return -EINVAL;
+ }
+ *(float*)pValue = tbcfg->dynamic_threshold;
+ ALOGD("%s: Get dynamic_threshold -> %f ", __FUNCTION__, tbcfg->dynamic_threshold);
+ break;
- case AVL_PARAM_NOISE_THRESHOLD:
+ case AVL_PARAM_NOISE_THRESHOLD:
if (*pValueSize < sizeof(int32_t)) {
- *pValueSize = 0;
- return -EINVAL;
+ *pValueSize = 0;
+ return -EINVAL;
}
- *(float*)pValue=tbcfg->noise_threshold;
+ *(float*)pValue = tbcfg->noise_threshold;
ALOGD("%s: Get noise_threshold -> %f ", __FUNCTION__, tbcfg->noise_threshold);
break;
- case AVL_PARAM_RESPONSE_TIME:
- if (*pValueSize < sizeof(int32_t)) {
+ case AVL_PARAM_RESPONSE_TIME:
+ if (*pValueSize < sizeof(int32_t)) {
*pValueSize = 0;
return -EINVAL;
}
- *(int32_t *) pValue = tbcfg->response_time;
+ *(int32_t *) pValue = tbcfg->response_time * 48; // UI set sample
ALOGD("%s: Get response_time-> %d ", __FUNCTION__, tbcfg->response_time);
break;
- case AVL_PARAM_ENABLE:
- if (*pValueSize < sizeof(int32_t)) {
- *pValueSize = 0;
- return -EINVAL;
+ case AVL_PARAM_ENABLE:
+ if (*pValueSize < sizeof(int32_t)) {
+ *pValueSize = 0;
+ return -EINVAL;
}
value = data->enable;
*(int32_t *) pValue = value;
ALOGD("%s: Get status -> %s", __FUNCTION__, AvlStatusstr[value]);
break;
- case AVL_PARAM_RELEASE_TIME:
- if (*pValueSize < sizeof(int32_t)) {
- *pValueSize = 0;
- return -EINVAL;
- }
- *(int32_t *) pValue = tbcfg->release_time;
- ALOGD("%s: Get release_time-> %d ", __FUNCTION__, tbcfg->release_time);
- break;
- case AVL_PARAM_SOURCE_IN:
- if (*pValueSize < sizeof(int32_t)) {
- *pValueSize = 0;
- return -EINVAL;
- }
- value = data->soure_id;
- *(int32_t *) pValue = value;
- ALOGD("%s: Get aource_id -> %d", __FUNCTION__, value);
- break;
- default:
+ case AVL_PARAM_RELEASE_TIME:
+ if (*pValueSize < sizeof(int32_t)) {
+ *pValueSize = 0;
+ return -EINVAL;
+ }
+ *(int32_t *) pValue = tbcfg->release_time / 1000; // UI get s, here change ms to s
+ ALOGD("%s: Get release_time-> %d ", __FUNCTION__, tbcfg->release_time);
+ break;
+ case AVL_PARAM_SOURCE_IN:
+ if (*pValueSize < sizeof(int32_t)) {
+ *pValueSize = 0;
+ return -EINVAL;
+ }
+ value = data->soure_id;
+ *(int32_t *) pValue = value;
+ ALOGD("%s: Get aource_id -> %d", __FUNCTION__, value);
+ break;
+ default:
ALOGE("%s: unknown param %d", __FUNCTION__, param);
return -EINVAL;
}
@@ -440,9 +461,10 @@ int Avl_getParameter(AvlContext*pContext, void *pParam, size_t *pValueSize, void
int Avl_release(AvlContext *pContext)
{
- Avldata *data=&pContext->gAvldata;
+ Avldata *data = &pContext->gAvldata;
+
DeleteAmlAGC(data->agc);
- (data->agc)->agc_enable=0;
+
if (data->usr_cfg != NULL) {
free(data->usr_cfg);
data->usr_cfg = NULL;
@@ -471,16 +493,17 @@ int Avl_process(effect_handle_t self, audio_buffer_t *inBuffer, audio_buffer_t *
int16_t *in = (int16_t *)inBuffer->raw;
int16_t *out = (int16_t *)outBuffer->raw;
Avldata*data = &pContext->gAvldata;
- (data->agc)->agc_enable=1;
+
if (!data->enable) {
for (size_t i = 0; i < inBuffer->frameCount; i++) {
*out++ = *in++;
*out++ = *in++;
}
} else {
- DoAmlAGC(data->agc, (void *)in, (inBuffer->frameCount)<<1);
+ DoAmlAGC(data->agc, (void *)in, (inBuffer->frameCount) << 1);
}
- return 0;
+
+ return 0;
}
int Avl_command(effect_handle_t self, uint32_t cmdCode, uint32_t cmdSize,
@@ -501,12 +524,12 @@ int Avl_command(effect_handle_t self, uint32_t cmdCode, uint32_t cmdSize,
*(int *) pReplyData = Avl_init(pContext);
break;
case EFFECT_CMD_SET_CONFIG:
- if (pCmdData == NULL || cmdSize != sizeof(effect_config_t) || pReplyData == NULL || replySize == NULL || *replySize != sizeof(int))
+ if (pCmdData == NULL || cmdSize != sizeof(effect_config_t) ||
+ pReplyData == NULL || replySize == NULL || *replySize != sizeof(int))
return -EINVAL;
*(int *) pReplyData = Avl_configure(pContext, (effect_config_t *) pCmdData);
break;
case EFFECT_CMD_RESET:
- //HPEQ_reset(pContext);
break;
case EFFECT_CMD_ENABLE:
if (pReplyData == NULL || replySize == NULL || *replySize != sizeof(int))
@@ -601,7 +624,7 @@ int AvlLib_Create(const effect_uuid_t * uuid, int32_t sessionId __unused, int32_
memset(pContext, 0, sizeof(AvlContext));
if (Avl_load_ini_file(pContext) < 0) {
ALOGE("%s: Load INI File faied, use default param", __FUNCTION__);
- pContext->gAvldata.enable=1;
+ pContext->gAvldata.enable = 0;
}
pContext->itfe = &AvlInterface;
@@ -666,8 +689,3 @@ audio_effect_library_t AUDIO_EFFECT_LIBRARY_INFO_SYM = {
};//extern "C"
-
-
-
-
-
diff --git a/libaudioeffect/AVL/aml_agc.h b/libaudioeffect/AVL/aml_agc.h
index 2eb2075..b08bbd1 100644
--- a/libaudioeffect/AVL/aml_agc.h
+++ b/libaudioeffect/AVL/aml_agc.h
@@ -21,28 +21,12 @@
extern "C" {
#endif
-typedef struct {
- int agc_enable;
- int response_time;
- int release_time;
- int sample_max[2];
- int counter[2];
- float gain[2];
- float CompressionRatio;
- int silence_counter[2];
- long peak;
- long silence_threshold;
- long active_threshold;
- float sample_sum[2];
- long last_sample[2];
- float average_level[2];
- float cross_zero_num[2];
-}AmlAGC;
+void* NewAmlAGC(void);
+void DoAmlAGC(void *handle, void *buffer, int len);
+void DeleteAmlAGC(void *handle);
+int SetAmlAGC(void *handle, float peak_level, float dynamic_threshold,
+ float noise_threshold, int response_time,int release_time);
-AmlAGC* NewAmlAGC(float peak_level, float dynamic_theshold, float noise_threshold, int response_time, int release_time);
-void DoAmlAGC(AmlAGC *agc, void *buffer, int len);
-void DeleteAmlAGC(AmlAGC *agc);
-int SetAmlAGC(AmlAGC *agc, float peak_level, float dynamic_threshold, float noise_threshold, int response_time, int release_time);
#ifdef __cplusplus
}
#endif
diff --git a/libaudioeffect/AVL/lib_aml_agc.a b/libaudioeffect/AVL/lib_aml_agc.a
index d257b74..3377ca9 100644
--- a/libaudioeffect/AVL/lib_aml_agc.a
+++ b/libaudioeffect/AVL/lib_aml_agc.a
@@ -1,61 +1,61 @@
!<arch>
/ 0 0 0 0 62 `
-
-ELF
-O~P
-"""m@
-
-H@H
-Z Ի
-8
-ȿA
-Ȋ  0
-+V2[S0+
-Z1{(F1FH@FF(F1F:FSFʪFF(F1F S0+԰F4J FD zD
-c+@YF
-
-
-
- 
-+;#h  :*
-
-
-
-fz:jj&
- z7!z:HSa[szU(ϜE*{7Fz'zjjb݆hB&j
-T z z7j
-ף;p}?
-Version 0.1
-Date:2018.1.18
-Parameter: %fdB,%fdB,%fdB
-
-I
-
-2
-b
-X
+
+ELF
+\P
+
+`
+A
+
+B
+N@:
+:
+
+
+ 0+S, A
+ `+
+
+
+ `
+33C
++;\
+
+ : * Ѝ
+P
+C@ 
+A0
+A 
+A<
+A
+C
+
+0
+
+p
+j jZ
+
+Version 1.1
+Date:2019.5.29
+Parameter: %fdB, %fdB, %fdB
+attack time = %d ms, release time = %d ms
+
+
+
+!
+I
+I
+I
A 
- 
-c.4o.Mfnf2GPPMLo.Ji 
-nd5yJQwJ J.f&  J 
-J
-/K 
-Of.f(I$MH$L,$0H  f yJ$0 G&i9$J9J J42LTHLH%LJ)IKK)i J7MJeLMJ9KKK)I3KFL'GFM3LJ1,/J#IM:/NJ,
-f//,/gX..&/
-v@d~J-$Q!-$KL!JI$2F N$0Lf.
-R
-R
-U
-U
-U
-R
-R
-T
-O
-R
-R
-S
-
-
-
+ 
+ DX
+M
+wJ JvJ
+JpJKLKyJ JJ
+
+, $zKI"JK$JO"zPz"KJO4K1KIIJKI:KIKKHKKJ/QJyJQRJJJEJHJGKKFGLIP
+K  h bJ bJt bJJ bJL y~
+NL~
+ J
+
+
+