369 lines
15 KiB
C
369 lines
15 KiB
C
#include "media/effects_adj.h"
|
|
#include "audio_eff_default_parm.h"
|
|
#include "app_config.h"
|
|
#include "math.h"
|
|
float powf(float x, float y);
|
|
extern struct mode_list *get_group_list(u16 module_name);
|
|
extern const struct eq_seg_info phone_eq_tab_normal[3];
|
|
extern const struct eq_seg_info ul_eq_tab_normal[3];
|
|
extern const struct eq_seg_info eq_tab_normal[10];
|
|
const struct eq_seg_info mic_eff_eq_tab[5] = {
|
|
{0, EQ_IIR_TYPE_BAND_PASS, 200, 0, 0.7f},
|
|
{1, EQ_IIR_TYPE_BAND_PASS, 300, 0, 0.7f},
|
|
{2, EQ_IIR_TYPE_BAND_PASS, 400, 0, 0.7f},
|
|
{3, EQ_IIR_TYPE_BAND_PASS, 400, 0, 0.7f},
|
|
{4, EQ_IIR_TYPE_BAND_PASS, 500, 0, 0.7f},
|
|
};
|
|
|
|
void phone_eff_default_parm(void)
|
|
{
|
|
#if defined(TCFG_EQ_ENABLE) && TCFG_EQ_ENABLE
|
|
//通话下行eq
|
|
for (u8 tar = 0; tar < 2; tar++) {
|
|
phone_mode[tar].eq_parm.global_gain = 0;
|
|
phone_mode[tar].eq_parm.seg_num = ARRAY_SIZE(phone_eq_tab_normal);
|
|
memcpy(phone_mode[tar].eq_parm.seg, phone_eq_tab_normal, sizeof(phone_eq_tab_normal));
|
|
}
|
|
//通话上行eq
|
|
for (u8 tar = 2; tar < 4; tar++) {
|
|
phone_mode[tar].eq_parm.global_gain = 0;
|
|
phone_mode[tar].eq_parm.seg_num = ARRAY_SIZE(ul_eq_tab_normal);
|
|
memcpy(phone_mode[tar].eq_parm.seg, ul_eq_tab_normal, sizeof(ul_eq_tab_normal));
|
|
}
|
|
#endif
|
|
|
|
//通话下行drc
|
|
struct threshold_group group[] = {{0, 0}, {50, 50}, {90, 90}};
|
|
for (u8 tar = 0; tar < 2; tar++) {
|
|
phone_mode[tar].drc_parm.is_bypass = 0;
|
|
phone_mode[tar].drc_parm.parm.attacktime = 10;
|
|
phone_mode[tar].drc_parm.parm.releasetime = 300;
|
|
phone_mode[tar].drc_parm.parm.inputgain = 0;
|
|
phone_mode[tar].drc_parm.parm.outputgain = 0;
|
|
phone_mode[tar].drc_parm.parm.threshold_num = ARRAY_SIZE(group);
|
|
memcpy(phone_mode[tar].drc_parm.parm.threshold, group, sizeof(group));
|
|
phone_mode[tar].drc_parm.parm.rms_time = 25;
|
|
phone_mode[tar].drc_parm.parm.algorithm = 0;
|
|
phone_mode[tar].drc_parm.parm.mode = 1;
|
|
}
|
|
|
|
//通话上行行drc
|
|
struct threshold_group group2[] = {{0, 0}, {50, 50}, {90, 90}};
|
|
for (u8 tar = 2; tar < 4; tar++) {
|
|
phone_mode[tar].drc_parm.is_bypass = 0;
|
|
phone_mode[tar].drc_parm.parm.attacktime = 10;
|
|
phone_mode[tar].drc_parm.parm.releasetime = 300;
|
|
phone_mode[tar].drc_parm.parm.inputgain = 0;
|
|
phone_mode[tar].drc_parm.parm.outputgain = 0;
|
|
phone_mode[tar].drc_parm.parm.threshold_num = ARRAY_SIZE(group2);
|
|
memcpy(phone_mode[tar].drc_parm.parm.threshold, group2, sizeof(group2));
|
|
phone_mode[tar].drc_parm.parm.rms_time = 25;
|
|
phone_mode[tar].drc_parm.parm.algorithm = 0;
|
|
phone_mode[tar].drc_parm.parm.mode = 1;
|
|
}
|
|
|
|
#if defined(TCFG_DRC_PRO_ENABLE) && TCFG_DRC_PRO_ENABLE
|
|
//通话drc pro
|
|
struct threshold_group group3[] = {{0.0f, 0.0f}, {50.0f, 50.0f}, {90.0f, 90.0f}};
|
|
for (u8 tar = 0; tar < 4; tar++) {
|
|
phone_drc_pro_parm[tar].is_bypass = 0;
|
|
phone_drc_pro_parm[tar].parm.attack_time = 5.0f;
|
|
phone_drc_pro_parm[tar].parm.release_time = 300.0f;
|
|
phone_drc_pro_parm[tar].parm.compress_attack_time = 0.0f;
|
|
phone_drc_pro_parm[tar].parm.compress_release_time = 0.0f;
|
|
phone_drc_pro_parm[tar].parm.rms_time = 0.0f;
|
|
phone_drc_pro_parm[tar].parm.detect_time = 0.0f;
|
|
phone_drc_pro_parm[tar].parm.input_gain = 0.0f;
|
|
phone_drc_pro_parm[tar].parm.output_gain = 0.0f;
|
|
phone_drc_pro_parm[tar].parm.threshold_num = ARRAY_SIZE(group3);
|
|
phone_drc_pro_parm[tar].parm.algorithm = PEAK;
|
|
phone_drc_pro_parm[tar].parm.mode = TWOPOINT;
|
|
memcpy(phone_drc_pro_parm[tar].parm.threshold, group3, sizeof(group3));
|
|
}
|
|
#endif
|
|
}
|
|
|
|
|
|
|
|
void music_eff_default_parm(void)
|
|
{
|
|
|
|
|
|
float gain = 0;
|
|
#if AUDIO_VBASS_CONFIG
|
|
//gain
|
|
vbass_prev_gain_parm.is_bypass = 0;
|
|
vbass_prev_gain_parm.parm.gain = powf(10, gain / 20.0f); //db转mag,工具传下来的值
|
|
|
|
vbass_parm.is_bypass = 0;
|
|
vbass_parm.parm.ratio = 10;
|
|
vbass_parm.parm.boost = 1;
|
|
vbass_parm.parm.fc = 100;
|
|
#endif
|
|
|
|
#if defined(TCFG_EQ_ENABLE) && TCFG_EQ_ENABLE
|
|
//eq
|
|
music_mode.eq_parm.global_gain = 0;
|
|
music_mode.eq_parm.seg_num = ARRAY_SIZE(eq_tab_normal);
|
|
memcpy(music_mode.eq_parm.seg, eq_tab_normal, sizeof(eq_tab_normal));
|
|
#endif
|
|
|
|
//wdcrc
|
|
struct mode_list *list = get_group_list(AEID_MUSIC_DRC);
|
|
if (list) {
|
|
struct threshold_group group[] = {{0, 0}, {50, 50}, {90, 90}};
|
|
for (int i = 0; i < list->group_num; i++) {
|
|
if (i == (list->group_num - 1)) { //最后一个存分频器系数
|
|
music_mode.drc_parm.crossover.way_num = 2;
|
|
music_mode.drc_parm.crossover.N = 2;
|
|
music_mode.drc_parm.crossover.low_freq = 200;
|
|
} else {
|
|
music_mode.drc_parm.wdrc_parm[i].is_bypass = 0;
|
|
music_mode.drc_parm.wdrc_parm[i].parm.attacktime = 10;
|
|
music_mode.drc_parm.wdrc_parm[i].parm.releasetime = 300;
|
|
music_mode.drc_parm.wdrc_parm[i].parm.inputgain = 0;
|
|
music_mode.drc_parm.wdrc_parm[i].parm.outputgain = 0;
|
|
music_mode.drc_parm.wdrc_parm[i].parm.threshold_num = ARRAY_SIZE(group);
|
|
memcpy(music_mode.drc_parm.wdrc_parm[i].parm.threshold, group, sizeof(group));
|
|
music_mode.drc_parm.wdrc_parm[i].parm.rms_time = 25;
|
|
music_mode.drc_parm.wdrc_parm[i].parm.algorithm = 0;
|
|
music_mode.drc_parm.wdrc_parm[i].parm.mode = 1;
|
|
}
|
|
}
|
|
}
|
|
#if defined(TCFG_DRC_PRO_ENABLE) && TCFG_DRC_PRO_ENABLE
|
|
struct mode_list *drc_pro_list = get_group_list(AEID_MUSIC_DRC_PRO);
|
|
if (drc_pro_list) {
|
|
struct threshold_group group[] = {{0.0f, 0.0f}, {50.0f, 50.0f}, {90.0f, 90.0f}};
|
|
for (int i = 0; i < list->group_num; i++) {
|
|
if (i == (list->group_num - 1)) { //最后一个存分频器系数
|
|
music_drc_pro_parm.crossover.way_num = 2;
|
|
music_drc_pro_parm.crossover.N = 2;
|
|
music_drc_pro_parm.crossover.low_freq = 200;
|
|
} else {
|
|
music_drc_pro_parm.wdrc_pro_parm[i].is_bypass = 0;
|
|
music_drc_pro_parm.wdrc_pro_parm[i].parm.attack_time = 5.0f;
|
|
music_drc_pro_parm.wdrc_pro_parm[i].parm.release_time = 300.0f;
|
|
music_drc_pro_parm.wdrc_pro_parm[i].parm.compress_attack_time = 0.0f;
|
|
music_drc_pro_parm.wdrc_pro_parm[i].parm.compress_release_time = 0.0f;
|
|
music_drc_pro_parm.wdrc_pro_parm[i].parm.rms_time = 0.0f;
|
|
music_drc_pro_parm.wdrc_pro_parm[i].parm.detect_time = 0.0f;
|
|
music_drc_pro_parm.wdrc_pro_parm[i].parm.input_gain = 0.0f;
|
|
music_drc_pro_parm.wdrc_pro_parm[i].parm.output_gain = 0.0f;
|
|
music_drc_pro_parm.wdrc_pro_parm[i].parm.threshold_num = ARRAY_SIZE(group);
|
|
music_drc_pro_parm.wdrc_pro_parm[i].parm.algorithm = PEAK;
|
|
music_drc_pro_parm.wdrc_pro_parm[i].parm.mode = TWOPOINT;
|
|
memcpy(music_drc_pro_parm.wdrc_pro_parm[i].parm.threshold, group, sizeof(group));
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
|
|
#if TCFG_DYNAMIC_EQ_ENABLE
|
|
#if defined(TCFG_EQ_ENABLE) && TCFG_EQ_ENABLE
|
|
//eq2
|
|
music_eq2_parm.global_gain = 0;
|
|
music_eq2_parm.seg_num = ARRAY_SIZE(eq_tab_normal);
|
|
memcpy(music_eq2_parm.seg, eq_tab_normal, sizeof(eq_tab_normal));
|
|
#endif
|
|
|
|
//dynamic eq
|
|
dynamic_eq.is_bypass = 0;
|
|
dynamic_eq.nSection = 1;
|
|
dynamic_eq.detect_mode = 1;
|
|
for (u8 i = 0; i < dynamic_eq.nSection; i++) {
|
|
dynamic_eq.effect_param[i].fc = 1000;
|
|
dynamic_eq.effect_param[i].Q = 0.7f;
|
|
dynamic_eq.effect_param[i].gain = 0.0f;
|
|
dynamic_eq.effect_param[i].type = 0x2;
|
|
dynamic_eq.effect_param[i].attackTime = 5;
|
|
dynamic_eq.effect_param[i].releaseTime = 300;
|
|
dynamic_eq.effect_param[i].rmsTime = 25;
|
|
dynamic_eq.effect_param[i].threshold = 0.0f;
|
|
dynamic_eq.effect_param[i].ratio = 1.0f;
|
|
dynamic_eq.effect_param[i].noisegate_threshold = -90.3f;
|
|
dynamic_eq.effect_param[i].fixGain = 0.0f;
|
|
dynamic_eq.effect_param[i].algorithm = 1;
|
|
}
|
|
#endif
|
|
|
|
#if GAIN_PROCESS_EN
|
|
//gain
|
|
gain_parm.is_bypass = 0;
|
|
gain = 0;
|
|
gain_parm.parm.gain = powf(10, gain / 20.0f); //db转mag,工具传下来的值
|
|
#endif
|
|
|
|
#if defined(SOUND_TRACK_2_P_X_CH_CONFIG) &&SOUND_TRACK_2_P_X_CH_CONFIG
|
|
//low pass
|
|
low_pass_parm.is_bypass = 0;
|
|
low_pass_parm.low_pass.fc = 100;
|
|
low_pass_parm.low_pass.order = 4;
|
|
low_pass_parm.low_pass.type = 1;
|
|
#endif
|
|
//rl_wdrc
|
|
|
|
#if (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_FRONT_LR_REAR_LR)
|
|
struct threshold_group group2[] = {{0, 0}, {50, 50}, {90, 90}};
|
|
for (int i = 0; i < 4; i++) {
|
|
rl_drc_parm.wdrc_parm[i].is_bypass = 0;
|
|
rl_drc_parm.wdrc_parm[i].parm.attacktime = 10;
|
|
rl_drc_parm.wdrc_parm[i].parm.releasetime = 300;
|
|
rl_drc_parm.wdrc_parm[i].parm.inputgain = 0;
|
|
rl_drc_parm.wdrc_parm[i].parm.outputgain = 0;
|
|
rl_drc_parm.wdrc_parm[i].parm.threshold_num = ARRAY_SIZE(group2);
|
|
memcpy(rl_drc_parm.wdrc_parm[i].parm.threshold, group2, sizeof(group2));
|
|
rl_drc_parm.wdrc_parm[i].parm.rms_time = 25;
|
|
rl_drc_parm.wdrc_parm[i].parm.algorithm = 0;
|
|
rl_drc_parm.wdrc_parm[i].parm.mode = 1;
|
|
}
|
|
#endif
|
|
|
|
#if GAIN_PROCESS_EN
|
|
//rl_gain
|
|
rl_gain_parm.is_bypass = 0;
|
|
rl_gain_parm.parm.gain = powf(10, gain / 20.0f); //db转mag,工具传下来的值
|
|
#endif
|
|
}
|
|
|
|
|
|
#if defined(LINEIN_MODE_SOLE_EQ_EN) && LINEIN_MODE_SOLE_EQ_EN
|
|
void linein_eff_default_parm(void)
|
|
{
|
|
#if defined(TCFG_EQ_ENABLE) && TCFG_EQ_ENABLE
|
|
//eq
|
|
linein_mode.eq_parm.global_gain = 0;
|
|
linein_mode.eq_parm.seg_num = ARRAY_SIZE(eq_tab_normal);
|
|
memcpy(linein_mode.eq_parm.seg, eq_tab_normal, sizeof(eq_tab_normal));
|
|
#endif
|
|
|
|
//wdcrc
|
|
struct mode_list *list = get_group_list(AEID_MUSIC_DRC);
|
|
if (list) {
|
|
struct threshold_group group[] = {{0, 0}, {50, 50}, {90, 90}};
|
|
for (int i = 0; i < list->group_num; i++) {
|
|
if ((list->group_num > 1) && (i == (list->group_num - 1))) { //最后一个存分频器系数
|
|
linein_mode.drc_parm.crossover.way_num = 2;
|
|
linein_mode.drc_parm.crossover.N = 2;
|
|
linein_mode.drc_parm.crossover.low_freq = 200;
|
|
} else {
|
|
linein_mode.drc_parm.wdrc_parm[i].is_bypass = 0;
|
|
linein_mode.drc_parm.wdrc_parm[i].parm.attacktime = 10;
|
|
linein_mode.drc_parm.wdrc_parm[i].parm.releasetime = 300;
|
|
linein_mode.drc_parm.wdrc_parm[i].parm.inputgain = 0;
|
|
linein_mode.drc_parm.wdrc_parm[i].parm.outputgain = 0;
|
|
linein_mode.drc_parm.wdrc_parm[i].parm.threshold_num = ARRAY_SIZE(group);
|
|
memcpy(linein_mode.drc_parm.wdrc_parm[i].parm.threshold, group, sizeof(group));
|
|
linein_mode.drc_parm.wdrc_parm[i].parm.rms_time = 25;
|
|
linein_mode.drc_parm.wdrc_parm[i].parm.algorithm = 0;
|
|
linein_mode.drc_parm.wdrc_parm[i].parm.mode = 1;
|
|
}
|
|
}
|
|
}
|
|
#if GAIN_PROCESS_EN
|
|
//rl_gain
|
|
float gain = 0;
|
|
linein_gain_parm.is_bypass = 0;
|
|
linein_gain_parm.parm.gain = powf(10, gain / 20.0f); //db转mag,工具传下来的值
|
|
#endif
|
|
|
|
}
|
|
#endif
|
|
|
|
|
|
#if defined(TCFG_MIC_EFFECT_ENABLE) && TCFG_MIC_EFFECT_ENABLE
|
|
void mic_eff_default_parm(u8 index)
|
|
{
|
|
//noisegate
|
|
eff_mode[index].noise_gate_parm.is_bypass = 0;
|
|
eff_mode[index].noise_gate_parm.parm.attackTime = 300;
|
|
eff_mode[index].noise_gate_parm.parm.releaseTime = 5;
|
|
eff_mode[index].noise_gate_parm.parm.threshold = -90300;//mdb -90.3dB
|
|
eff_mode[index].noise_gate_parm.parm.low_th_gain = 0;
|
|
|
|
//howlingps_parm
|
|
eff_mode[index].howlingps_parm.is_bypass = 0;
|
|
eff_mode[index].howlingps_parm.parm.effect_v = EFFECT_HOWLING_FS;
|
|
eff_mode[index].howlingps_parm.parm.ps_parm = -50;
|
|
eff_mode[index].howlingps_parm.parm.fe_parm = 4;
|
|
|
|
//notchowling_parm
|
|
eff_mode[index].notchhowling_parm.is_bypass = 0;
|
|
eff_mode[index].notchhowling_parm.parm.Q = 2.0f;
|
|
eff_mode[index].notchhowling_parm.parm.gain = -20;
|
|
eff_mode[index].notchhowling_parm.parm.fade_n = 10;
|
|
eff_mode[index].notchhowling_parm.parm.threshold = 25;
|
|
|
|
//voice_changer
|
|
#if defined(TCFG_MIC_VOICE_CHANGER_ENABLE) && TCFG_MIC_VOICE_CHANGER_ENABLE
|
|
eff_mode[index].voicechanger_parm.is_bypass = 0;
|
|
eff_mode[index].voicechanger_parm.parm.effect_v = 0;
|
|
eff_mode[index].voicechanger_parm.parm.shiftv = 56;
|
|
eff_mode[index].voicechanger_parm.parm.formant_shift = 90;
|
|
#endif
|
|
|
|
//echo
|
|
eff_mode[index].echo_parm.is_bypass = 0;
|
|
eff_mode[index].echo_parm.parm.decayval = 60;
|
|
eff_mode[index].echo_parm.parm.delay = 400;
|
|
eff_mode[index].echo_parm.parm.filt_enable = 1;
|
|
eff_mode[index].echo_parm.parm.lpf_cutoff = 5000;
|
|
eff_mode[index].echo_parm.parm.drygain = 60;
|
|
eff_mode[index].echo_parm.parm.wetgain = 50;
|
|
|
|
//palte_reverb
|
|
eff_mode[index].plate_reverb_parm.is_bypass = 0;
|
|
eff_mode[index].plate_reverb_parm.parm.pre_delay = 0;
|
|
eff_mode[index].plate_reverb_parm.parm.highcutoff = 12200;
|
|
eff_mode[index].plate_reverb_parm.parm.diffusion = 43;
|
|
eff_mode[index].plate_reverb_parm.parm.decayfactor = 70;
|
|
eff_mode[index].plate_reverb_parm.parm.highfrequencydamping = 26;
|
|
eff_mode[index].plate_reverb_parm.parm.dry = 80;
|
|
eff_mode[index].plate_reverb_parm.parm.wet = 40;
|
|
eff_mode[index].plate_reverb_parm.parm.modulate = 1;
|
|
eff_mode[index].plate_reverb_parm.parm.roomsize = 100;
|
|
|
|
for (int i = 0; i < 5; i++) {
|
|
//eq
|
|
eff_mode[index].eq_parm[i].global_gain = 0;
|
|
eff_mode[index].eq_parm[i].seg_num = ARRAY_SIZE(mic_eff_eq_tab);
|
|
memcpy(eff_mode[index].eq_parm[i].seg, mic_eff_eq_tab, sizeof(mic_eff_eq_tab));
|
|
//drc
|
|
struct threshold_group group[] = {{0, 0}, {50, 50}, {90, 90}};
|
|
eff_mode[index].drc_parm[i].is_bypass = 0;
|
|
eff_mode[index].drc_parm[i].parm.attacktime = 10;
|
|
eff_mode[index].drc_parm[i].parm.releasetime = 300;
|
|
eff_mode[index].drc_parm[i].parm.inputgain = 0;
|
|
eff_mode[index].drc_parm[i].parm.outputgain = 0;
|
|
eff_mode[index].drc_parm[i].parm.threshold_num = ARRAY_SIZE(group);
|
|
memcpy(eff_mode[index].drc_parm[i].parm.threshold, group, sizeof(group));
|
|
eff_mode[index].drc_parm[i].parm.rms_time = 25;
|
|
eff_mode[index].drc_parm[i].parm.algorithm = 0;
|
|
eff_mode[index].drc_parm[i].parm.mode = 1;
|
|
//drc pro
|
|
#if defined(TCFG_DRC_PRO_ENABLE) && TCFG_DRC_PRO_ENABLE
|
|
eff_mode[index].drc_pro_parm[i].is_bypass = 0;
|
|
eff_mode[index].drc_pro_parm[i].parm.attack_time = 5.0f;
|
|
eff_mode[index].drc_pro_parm[i].parm.release_time = 300.0f;
|
|
eff_mode[index].drc_pro_parm[i].parm.compress_attack_time = 0.0f;
|
|
eff_mode[index].drc_pro_parm[i].parm.compress_release_time = 0.0f;
|
|
eff_mode[index].drc_pro_parm[i].parm.rms_time = 0.0f;
|
|
eff_mode[index].drc_pro_parm[i].parm.detect_time = 0.0f;
|
|
eff_mode[index].drc_pro_parm[i].parm.input_gain = 0.0f;
|
|
eff_mode[index].drc_pro_parm[i].parm.output_gain = 0.0f;
|
|
eff_mode[index].drc_pro_parm[i].parm.threshold_num = ARRAY_SIZE(group);
|
|
eff_mode[index].drc_pro_parm[i].parm.algorithm = PEAK;
|
|
eff_mode[index].drc_pro_parm[i].parm.mode = TWOPOINT;
|
|
memcpy(eff_mode[index].drc_pro_parm[i].parm.threshold, group, sizeof(group));
|
|
#endif
|
|
|
|
}
|
|
#if GAIN_PROCESS_EN
|
|
float gain = 0;
|
|
eff_mode[index].gain_parm.parm.gain = powf(10, gain / 20.0f); //db转mag,工具传下来的值
|
|
eff_mode[index].gain_parm.is_bypass = 0;
|
|
#endif
|
|
}
|
|
#endif
|