author | Zhe 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) |
commit | 2981f768ea89caa626d166d5a986c70d988c9323 (patch) | |
tree | dfe071f9cf6add5fab999d1d7bfadf7920b04250 | |
parent | 03a30138b7b7a6888bfa51727fcb931ddf910a27 (diff) | |
download | av-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>
-rw-r--r-- | libaudioeffect/AVL/Avl.cpp | 254 | ||||
-rw-r--r-- | libaudioeffect/AVL/aml_agc.h | 26 | ||||
-rw-r--r-- | libaudioeffect/AVL/lib_aml_agc.a | 116 |
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
fyJ$0
G&i9$J9J
J42LTHLH%LJ)IKK)i
J7MJeLMJ9KKK)I3KFL'GFM3LJ1,/J#IM:/NJ, -f//,/gX..&/ -v@d~J-$Q!-$KL!JI$2FN$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 hbJbJtbJJbJL y~ +NL~ + J + + + |