KT24-1110_65E-HA-651B/cpu/br25/audio_effect/effects_adj.c

2303 lines
72 KiB
C
Raw Permalink Normal View History

2024-11-10 10:44:17 +00:00
#include "audio_effect/audio_gain_process_demo.h"
#include "audio_effect/audio_voice_changer_demo.h"
#include "audio_effect/audio_vbass_demo.h"
#include "audio_effect/audio_eff_default_parm.h"
#include "audio_effect/audio_noise_gate_demo.h"
#include "audio_effect/audio_surround_demo.h"
#include "media/effects_adj.h"
#include "app_sound_box_tool.h"
#include "app_config.h"
#include "audio_mic/effect_parm.h"
#if defined(TCFG_EQ_ENABLE) && TCFG_EQ_ENABLE
#define LOG_TAG "[EFFECT]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
#define LOG_DUMP_ENABLE
#include "debug.h"
#ifdef SUPPORT_MS_EXTENSIONS
//#pragma bss_seg(".audio_mic_stream_bss")
//#pragma data_seg(".audio_mic_stream_data")
#pragma const_seg(".audio_effect_adj_const")
#pragma code_seg(".audio_effect_adj_code")
#endif
u8 EFF_CFG_FILE_NAME[64] = SDFILE_RES_ROOT_PATH"eq_cfg_hw.bin";
const u8 eff_sdk_name[16] = "AC696N";
const u8 eff_eq_ver[4] = {1, 0, 0, 0};
#if defined(SOUND_TRACK_2_P_X_CH_CONFIG) &&SOUND_TRACK_2_P_X_CH_CONFIG && (EQ_SECTION_MAX == 32)
#define MUSIC_EQ_NSECTION_SPC mSECTION_MAX
#else
#define MUSIC_EQ_NSECTION_SPC music_eq_nsection
#endif
#define EXT_EQ_NSECTION 5
//每个模块id对应一个group_id(功能id)
/* const */
struct mode_list mlist[] = {
{AEID_ESCO_DL_EQ, phone_eq_nsection, 2, {EFF_PHONE_WIDEBAND_EQ, EFF_PHONE_NARROWBAND_EQ}},
{AEID_ESCO_UL_EQ, phone_eq_nsection, 2, {EFF_AEC_WIDEBAND_EQ, EFF_AEC_NARROWBAND_EQ}},
{AEID_MUSIC_EQ, MUSIC_EQ_NSECTION_SPC, 2, {EFF_MUSIC_EQ, EFF_MUSIC_FR_EQ}},
{AEID_MUSIC_EQ2, music_eq2_nsection, 1, {EFF_MUSIC_EQ2}},
{AEID_MUSIC_EXTEQ, EXT_EQ_NSECTION, 1, {EFF_MUSIC_EXT_EQ}},
{AEID_MUSIC_RL_EQ, music_eq_nsection, 2, {EFF_MUSIC_RL_EQ, EFF_MUSIC_RR_EQ}},
{AEID_MIC_EQ0, mic_eq_nsection, 1, {EFF_MIC_EQ0}},
{AEID_MIC_EQ1, mic_eq_nsection, 1, {EFF_MIC_EQ1}},
{AEID_MIC_EQ2, mic_eq_nsection, 1, {EFF_MIC_EQ2}},
{AEID_MIC_EQ3, mic_eq_nsection, 1, {EFF_MIC_EQ3}},
{AEID_MIC_EQ4, mic_eq_nsection, 1, {EFF_MIC_EQ4}},
{AEID_HIGH_BASS_EQ, music_eq_nsection, 1, {EFF_MUSIC_HIGH_BASS_EQ}},
{AEID_AUX_HIGH_BASS_EQ, music_eq_nsection, 1, {EFF_MUSIC_HIGH_BASS_EQ}},
#if TCFG_DRC_ENABLE
{AEID_ESCO_DL_DRC, phone_eq_nsection, 2, {EFF_PHONE_WIDEBAND_DRC, EFF_PHONE_NARROWBAND_DRC}},
{AEID_ESCO_UL_DRC, phone_eq_nsection, 2, {EFF_AEC_WIDEBAND_DRC, EFF_AEC_NARROWBAND_DRC}},
{AEID_MUSIC_DRC, music_eq_nsection, 5, {EFF_MUSIC_LOW_DRC, EFF_MUSIC_MID_DRC, EFF_MUSIC_HIGH_DRC, EFF_MUSIC_WHOLE_DRC, EFF_MUSIC_CROSSOVER }}, //最后一个group_id存方分频器
{AEID_MUSIC_FR_DRC, music_eq_nsection, 1, {0x2004}},
{AEID_MUSIC_RL_DRC, music_eq_nsection, 4, {EFF_MUSIC_RL_LOW_DRC, EFF_MUSIC_RL_MID_DRC, EFF_MUSIC_RL_HIGH_DRC, EFF_MUSIC_RL_WHOLE_DRC}},
{AEID_MUSIC_RR_DRC, music_eq_nsection, 1, {0x2008}},
{AEID_MIC_DRC0, mic_eq_nsection, 1, {EFF_MIC_DRC0}},
{AEID_MIC_DRC1, mic_eq_nsection, 1, {EFF_MIC_DRC1}},
{AEID_MIC_DRC2, mic_eq_nsection, 1, {EFF_MIC_DRC2}},
{AEID_MIC_DRC3, mic_eq_nsection, 1, {EFF_MIC_DRC3}},
{AEID_MIC_DRC4, mic_eq_nsection, 1, {EFF_MIC_DRC4}},
{AEID_HIGH_BASS_DRC, music_eq_nsection, 1, {EFF_MUSIC_HIGH_BASS_DRC}},
#endif
};
#if defined(LINEIN_MODE_SOLE_EQ_EN) && LINEIN_MODE_SOLE_EQ_EN
/* const */
struct mode_list aux_list[] = {
{AEID_AUX_EQ, MUSIC_EQ_NSECTION_SPC, 2, {EFF_AUX_EQ, EFF_MUSIC_FR_EQ}},
{AEID_AUX_EQ2, music_eq2_nsection, 1, {EFF_MUSIC_EQ2}},
{AEID_AUX_EXTEQ, EXT_EQ_NSECTION, 1, {EFF_MUSIC_EXT_EQ}},
{AEID_AUX_DRC, music_eq_nsection, 5, {EFF_AUX_DRC, EFF_MUSIC_MID_DRC, EFF_MUSIC_HIGH_DRC, EFF_MUSIC_WHOLE_DRC, EFF_MUSIC_CROSSOVER }}, //最后一个group_id存方分频器
{AEID_AUX_FR_DRC, music_eq_nsection, 1, {0x2004}},
{AEID_AUX_RL_EQ, music_eq_nsection, 2, {EFF_MUSIC_RL_EQ, EFF_MUSIC_RR_EQ}},
{AEID_AUX_RL_DRC, music_eq_nsection, 5, {EFF_MUSIC_RL_LOW_DRC, EFF_MUSIC_RL_MID_DRC, EFF_MUSIC_RL_MID_DRC, EFF_MUSIC_RL_HIGH_DRC, EFF_MUSIC_RL_WHOLE_DRC }},
{AEID_AUX_RR_DRC, music_eq_nsection, 1, {0x2008}},
{AEID_AUX_HIGH_BASS_EQ, music_eq_nsection, 1, {EFF_MUSIC_HIGH_BASS_EQ}},
{AEID_AUX_HIGH_BASS_DRC, music_eq_nsection, 1, {EFF_MUSIC_HIGH_BASS_DRC}},
};
#endif
int get_index_by_group_id(u16 group_id, u8 tar)
{
if (!tar) {
for (int i = 0; i < ARRAY_SIZE(mlist); i++) {
struct mode_list *list = (struct mode_list *)&mlist[i];
for (int j = 0; j < list->group_num; j++) {
if (list->group_id[j] == group_id) {
return i;
}
}
}
} else if (tar == 1) {
#if defined(LINEIN_MODE_SOLE_EQ_EN) && LINEIN_MODE_SOLE_EQ_EN
for (int i = 0; i < ARRAY_SIZE(aux_list); i++) {
struct mode_list *list = (struct mode_list *)&aux_list[i];
for (int j = 0; j < list->group_num; j++) {
if (list->group_id[j] == group_id) {
return i;
}
}
}
#endif
}
log_e("get_ tab index error\n");
return -1;
}
/*
*线eq段数
* */
void set_list_nsection(u8 tar, u8 index, u8 nsection)
{
if (!tar) {
mlist[index].nsection = nsection;
} else {
#if defined(LINEIN_MODE_SOLE_EQ_EN) && LINEIN_MODE_SOLE_EQ_EN
aux_list[index].nsection = nsection;
#endif
}
}
int get_module_name(u16 group_id, u8 tar)
{
if (!tar) {
for (int i = 0; i < ARRAY_SIZE(mlist); i++) {
struct mode_list *list = (struct mode_list *)&mlist[i];
for (int j = 0; j < list->group_num; j++) {
if (list->group_id[j] == group_id) {
return list->module_name;
}
}
}
} else if (tar == 1) {
#if defined(LINEIN_MODE_SOLE_EQ_EN) && LINEIN_MODE_SOLE_EQ_EN
for (int i = 0; i < ARRAY_SIZE(aux_list); i++) {
struct mode_list *list = (struct mode_list *)&aux_list[i];
for (int j = 0; j < list->group_num; j++) {
if (list->group_id[j] == group_id) {
return list->module_name;
}
}
}
#endif
}
#if PARM_DEBUG
log_w("get_module_name error id 0x%x, tar %d\n", group_id, tar);
#endif
return 0;
}
int get_module_name_and_index(u16 group_id, u16 *index, u8 tar)
{
if (!tar) {
for (int i = 0; i < ARRAY_SIZE(mlist); i++) {
struct mode_list *list = (struct mode_list *)&mlist[i];
for (int j = 0; j < list->group_num; j++) {
if (list->group_id[j] == group_id) {
*index = j;
return list->module_name;
}
}
}
} else if (tar == 1) {
#if defined(LINEIN_MODE_SOLE_EQ_EN) && LINEIN_MODE_SOLE_EQ_EN
for (int i = 0; i < ARRAY_SIZE(aux_list); i++) {
struct mode_list *list = (struct mode_list *)&aux_list[i];
for (int j = 0; j < list->group_num; j++) {
if (list->group_id[j] == group_id) {
*index = j;
return list->module_name;
}
}
}
#endif
}
#if PARM_DEBUG
log_w("get_module_name and index error id 0x%x, tar %d\n", group_id, tar);
#endif
return 0;
}
int get_group_id(u16 module_name, u8 tar)
{
for (int i = 0; i < ARRAY_SIZE(mlist); i++) {
struct mode_list *list = (struct mode_list *)&mlist[i];
if (list->module_name == module_name) { //
return list->group_id[tar];
}
}
#if defined(LINEIN_MODE_SOLE_EQ_EN) && LINEIN_MODE_SOLE_EQ_EN
for (int i = 0; i < ARRAY_SIZE(aux_list); i++) {
struct mode_list *list = (struct mode_list *)&aux_list[i];
if (list->module_name == module_name) { //
return list->group_id[tar];
}
}
#endif
log_e("get_module_id error\n");
return 0;
}
struct mode_list *get_group_list(u16 module_name)
{
for (int i = 0; i < ARRAY_SIZE(mlist); i++) {
struct mode_list *list = (struct mode_list *)&mlist[i];
if (list->module_name == module_name) { //
return list;
}
}
#if defined(LINEIN_MODE_SOLE_EQ_EN) && LINEIN_MODE_SOLE_EQ_EN
for (int i = 0; i < ARRAY_SIZE(aux_list); i++) {
struct mode_list *list = (struct mode_list *)&aux_list[i];
if (list->module_name == module_name) { //
return list;
}
}
#endif
return NULL;
}
int get_eq_nsection(u16 module_name)
{
for (int i = 0; i < ARRAY_SIZE(mlist); i++) {
struct mode_list *list = (struct mode_list *)&mlist[i];
if (list->module_name == module_name) {
return list->nsection;
}
}
#if defined(LINEIN_MODE_SOLE_EQ_EN) && LINEIN_MODE_SOLE_EQ_EN
for (int i = 0; i < ARRAY_SIZE(aux_list); i++) {
struct mode_list *list = (struct mode_list *)&aux_list[i];
if (list->module_name == module_name) {
return list->nsection;
}
}
#endif
log_e("get_eq_nsection error\n");
return 0;
}
int get_eq_seg(u16 module_name)
{
return 0;
}
void get_eff_mode(u16 mode_id, u16 group_id, u8 *mode_index, u8 *drc_index)//获取混响模式的index
{
*mode_index = mode_id - mic_mode_seq0;
*drc_index = group_id - EFF_MIC_DRC0;
}
int get_phone_mode(u16 group_id)
{
return group_id - EFF_PHONE_WIDEBAND_EQ;
}
#define REPLY_TO_TOOL (0)
#define EFF_CFG_FILE_ID (0x3)//音效配置项源文件id
static u8 eff_mode_save = 0;
static u16 alive_timer = 0;
static u32 alive_cnt = 0;
int music_surround_effect_parm_analyze(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if AUDIO_SURROUND_CONFIG
u8 mode_id = packet->data[0];
u8 tar = 0;
u32 sur_name = AEID_MUSIC_SURROUND;
u8 update = 1;
#if defined(LINEIN_MODE_SOLE_EQ_EN) && LINEIN_MODE_SOLE_EQ_EN
if (linein_mode_seq == mode_id) {
tar = 1;
sur_name = AEID_AUX_SURROUND;
if (!get_cur_sur_hdl_by_name(sur_name)) {
update = 0;
}
} else
#endif
if (music_mode_seq0 != mode_id) {
return 0;
}
memcpy(&sur_parm[tar], &packet->data[1], sizeof(SurroundEffect_TOOL_SET));
SurroundEffect_TOOL_SET *parmt = &sur_parm[tar];
if (update) {
audio_surround_effect_update_demo(sur_name, &parmt->parm, parmt->is_bypass);
}
#if PARM_DEBUG
surround_update_parm *parm = &parmt->parm;
log_debug("music surround effect surround_type %d,rotatestep %d, damping %d, feedback %d, roomsize %d\n",
parm->surround_type, parm->rotatestep, parm->damping, parm->feedback, parm->roomsize);
#endif
#endif
return 0;
}
int music_noise_gate_parm_analyze(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if MUSIC_NOISE_GATE_EN
u8 mode_id = packet->data[0];
u8 tar = 0;
u32 ns_name = AEID_MUSIC_NS_GATE;
u8 update = 1;
#if defined(LINEIN_MODE_SOLE_EQ_EN) && LINEIN_MODE_SOLE_EQ_EN
if (linein_mode_seq == mode_id) {
tar = 1;
ns_name = AEID_AUX_NS_GATE;
if (!get_cur_noisegate_hdl_by_name(ns_name)) {
update = 0;
}
} else
#endif
if (music_mode_seq0 != mode_id) {
return 0;
}
memcpy(&music_noisegate_parm[tar], &packet->data[1], sizeof(NoiseGateParam_TOOL_SET));
NoiseGateParam_TOOL_SET *parmt = &music_noisegate_parm[tar];
if (update) {
audio_noisegate_update_demo(ns_name, &parmt->parm, parmt->is_bypass);
}
#if PARM_DEBUG
noisegate_update_param *parm = &parmt->parm;
log_debug("music noise gate attact_time %d,releasetime %d, threshold %d, low_th_gain %d\n",
parm->attackTime, parm->releaseTime, parm->threshold, parm->low_th_gain);
#endif
#endif
return 0;
}
int vbass_prev_gain_process_parm_analyze(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if AUDIO_VBASS_CONFIG
u8 mode_id = packet->data[0];
u8 tar = 0;
u32 gain_name = AEID_MUSIC_VBASS_PREV_GAIN;
#if defined(LINEIN_MODE_SOLE_EQ_EN) && LINEIN_MODE_SOLE_EQ_EN
if (linein_mode_seq == mode_id) {
tar = 1;
gain_name = AEID_AUX_VBASS_PREV_GAIN;
if (!get_cur_gain_hdl_by_name(gain_name)) {
memcpy(&vbass_prev_gain_parm[tar], &packet->data[1], sizeof(Gain_Process_TOOL_SET));
return 0;
}
} else
#endif
if (music_mode_seq0 != mode_id) {
return 0;
}
memcpy(&vbass_prev_gain_parm[tar], &packet->data[1], sizeof(Gain_Process_TOOL_SET));
audio_gain_update_parm(gain_name, &vbass_prev_gain_parm[tar].parm, vbass_prev_gain_parm[tar].is_bypass);
#if PARM_DEBUG
log_debug("vbass_prev_gain_parm[%d].is_bypass %d, gain 0x%x", tar, vbass_prev_gain_parm[tar].is_bypass, *(int *)&vbass_prev_gain_parm[tar].parm.gain[0]);
log_debug("vbass_prev_gain_parm[%d].is_bypass %d, gain 0x%x", tar, vbass_prev_gain_parm[tar].is_bypass, *(int *)&vbass_prev_gain_parm[tar].parm.gain[1]);
#endif
#endif
return 0;
}
int music_ch_swap_process_parm_analyze(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if defined(CH_SWAP_OLD) && CH_SWAP_OLD
u8 mode_id = packet->data[0];
u8 tar = 0;
u32 swap_name = AEID_MUSIC_CH_SWAP;
#if defined(LINEIN_MODE_SOLE_EQ_EN) && LINEIN_MODE_SOLE_EQ_EN
if (linein_mode_seq == mode_id) {
tar = 1;
swap_name = AEID_AUX_CH_SWAP;
if (!get_cur_swap_hdl_by_name(swap_name)) {
memcpy(&music_ch_swap[tar], &packet->data[1], sizeof(ChannelSwap_TOOL_SET));
return 0;
}
} else
#endif
if (music_mode_seq0 != mode_id) {
return 0;
}
memcpy(&music_ch_swap[tar], &packet->data[1], sizeof(ChannelSwap_TOOL_SET));
audio_ch_swap_update_parm(swap_name, NULL, music_ch_swap[tar].is_bypass);
#if PARM_DEBUG
log_debug("music_ch_swap[%d].is_bypass %d%x", tar, music_ch_swap[tar].is_bypass);
#endif
#endif
return 0;
}
int music_vbass_parm_ananlyze(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if AUDIO_VBASS_CONFIG
u8 mode_id = packet->data[0];
u8 tar = 0;
u32 vbass_name = AEID_MUSIC_VBASS;
#if defined(LINEIN_MODE_SOLE_EQ_EN) && LINEIN_MODE_SOLE_EQ_EN
if (linein_mode_seq == mode_id) {
tar = 1;
vbass_name = AEID_AUX_VBASS;
if (!get_cur_vbass_hdl_by_name(vbass_name)) {
memcpy(&vbass_parm[tar], &packet->data[1], sizeof(VirtualBass_TOOL_SET));
return 0;
}
} else
#endif
if (music_mode_seq0 != mode_id) {
return 0;
}
memcpy(&vbass_parm[tar], &packet->data[1], sizeof(VirtualBass_TOOL_SET));
audio_vbass_update_demo(vbass_name, &vbass_parm[tar].parm, vbass_parm[tar].is_bypass);
#if PARM_DEBUG
log_debug("is_bypass %d, ratio %d, boost %d, fc %d\n", vbass_parm[tar].is_bypass, vbass_parm[tar].parm.ratio, vbass_parm[tar].parm.boost, vbass_parm[tar].parm.fc);
#endif
#endif
return 0;
}
int mic_voice_changer_parm_ananlyze(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if defined(TCFG_MIC_EFFECT_ENABLE) && TCFG_MIC_EFFECT_ENABLE
#if defined(TCFG_MIC_VOICE_CHANGER_ENABLE) && TCFG_MIC_VOICE_CHANGER_ENABLE
u8 mode_id = packet->data[0];
VoiceChangerParam_TOOL_SET *changer_parm = &eff_mode[mode_id - mic_mode_seq0].voicechanger_parm;
memcpy(changer_parm, &packet->data[1], sizeof(eff_mode[mode_id - mic_mode_seq0].voicechanger_parm));
audio_voice_changer_update_demo(AEID_MIC_VOICE_CHANGER, &changer_parm->parm, changer_parm->is_bypass);
#if PARM_DEBUG
log_debug("effect_v %d, shiftv %d, formant_shift %d, is_bypass %d\n", changer_parm->parm.effect_v, changer_parm->parm.shiftv, changer_parm->parm.formant_shift, changer_parm->is_bypass);
#endif
#endif
#endif
return 0;
}
int mic_mix_gain_parm_ananlyze(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if defined(TCFG_MIC_EFFECT_ENABLE) && TCFG_MIC_EFFECT_ENABLE
u8 mode_id = packet->data[0];
Mix_TOOL_SET *mix_gain_parm = &eff_mode[mode_id - mic_mode_seq0].mix_gain;
memcpy(mix_gain_parm, &packet->data[1], sizeof(eff_mode[mode_id - mic_mode_seq0].mix_gain));
#if PARM_DEBUG
log_debug("gain0: 0x%x, gain1:0x%x, gain2:0x%x\n", mix_gain_parm->gain1, mix_gain_parm->gain2, mix_gain_parm->gain3);
#endif
#endif
return 0;
}
int mic_gain_parm_analyze(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if GAIN_PROCESS_EN
#if defined(TCFG_MIC_EFFECT_ENABLE) && TCFG_MIC_EFFECT_ENABLE
u8 mode_id = packet->data[0];
Gain_Process_TOOL_SET *gain_parm = &eff_mode[mode_id - mic_mode_seq0].gain_parm; //增益
memcpy(gain_parm, &packet->data[1], sizeof(eff_mode[mode_id - mic_mode_seq0].gain_parm));
audio_gain_update_parm(AEID_MIC_GAIN, &gain_parm->parm, eff_mode[mode_id - mic_mode_seq0].gain_parm.is_bypass);
#if PARM_DEBUG
log_debug("gain_parm.is_bypass %d, gain 0x%x", gain_parm->is_bypass, *(int *)&gain_parm->parm.gain);
#endif
#endif
#endif
return 0;
}
int gain_process_parm_analyze(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if GAIN_PROCESS_EN
u8 mode_id = packet->data[0];
u8 tar = 0;
u32 gain_name = AEID_MUSIC_GAIN;
#if defined(LINEIN_MODE_SOLE_EQ_EN) && LINEIN_MODE_SOLE_EQ_EN
if (linein_mode_seq == mode_id) {
tar = 1;
gain_name = AEID_AUX_GAIN;
if (!get_cur_gain_hdl_by_name(gain_name)) {
memcpy(&gain_parm[tar], &packet->data[1], sizeof(Gain_Process_TOOL_SET));
return 0;
}
} else
#endif
if (music_mode_seq0 != mode_id) {
return 0;
}
memcpy(&gain_parm[tar], &packet->data[1], sizeof(Gain_Process_TOOL_SET));
audio_gain_update_parm(gain_name, &gain_parm[tar].parm, gain_parm[tar].is_bypass);
#if PARM_DEBUG
log_debug("gain_parm.is_bypass %d, gain 0x%x", gain_parm[tar].is_bypass, *(int *)&gain_parm[tar].parm.gain[0]);
log_debug("gain_parm.is_bypass %d, gain 0x%x", gain_parm[tar].is_bypass, *(int *)&gain_parm[tar].parm.gain[1]);
#endif
#endif
return 0;
}
int rl_gain_process_parm_analyze(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if GAIN_PROCESS_EN
u8 mode_id = packet->data[0];
u8 tar = 0;
u32 gain_name = AEID_MUSIC_RL_GAIN;
#if defined(LINEIN_MODE_SOLE_EQ_EN) && LINEIN_MODE_SOLE_EQ_EN
if (linein_mode_seq == mode_id) {
tar = 1;
gain_name = AEID_AUX_RL_GAIN;
if (!get_cur_gain_hdl_by_name(gain_name)) {
memcpy(&rl_gain_parm[tar], &packet->data[1], sizeof(Gain_Process_TOOL_SET));
return 0;
}
} else
#endif
if (music_mode_seq0 != mode_id) {
return 0;
}
memcpy(&rl_gain_parm[tar], &packet->data[1], sizeof(Gain_Process_TOOL_SET));
audio_gain_update_parm(gain_name, &rl_gain_parm[tar].parm, rl_gain_parm[tar].is_bypass);
#if PARM_DEBUG
log_debug("rl_gain_parm.is_bypass %d, gain 0x%x", rl_gain_parm[tar].is_bypass, *(int *)&rl_gain_parm[tar].parm.gain[0]);
log_debug("rl_gain_parm.is_bypass %d, gain 0x%x", rl_gain_parm[tar].is_bypass, *(int *)&rl_gain_parm[tar].parm.gain[1]);
#endif
#endif
return 0;
}
void dynamic_eq_printf(DynamicEQParam_TOOL_SET *dy_parm)
{
#if PARM_DEBUG
log_debug("dy_parm->is_bypass %d\n", dy_parm->is_bypass);
for (int i = 0; i < dy_parm->nSection; i++) {
log_debug("fc %d , Q 0x%x, gain:0x%x, type %d, attacktime %d, releaseTime %d, rmsTime %d, threshold 0x%x, ratio 0x%x, noisegate_threshold 0x%x, fixGain %x, algorithm %d\n",
dy_parm->effect_param[i].fc,
*(int *)&dy_parm->effect_param[i].Q,
*(int *)&dy_parm->effect_param[i].gain,
dy_parm->effect_param[i].type,
dy_parm->effect_param[i].attackTime,
dy_parm->effect_param[i].releaseTime,
dy_parm->effect_param[i].rmsTime,
*(int *)&dy_parm->effect_param[i].threshold,
*(int *)&dy_parm->effect_param[i].ratio,
*(int *)&dy_parm->effect_param[i].noisegate_threshold,
*(int *)&dy_parm->effect_param[i].fixGain,
dy_parm->effect_param[i].algorithm);
}
log_debug("nSection %d, detect_mode %d\n", dy_parm->nSection, dy_parm->detect_mode);
#endif
}
/*
*eq
*tar:0 music 1:AUX模式的AUX独立音效时有效
* */
static void dynamic_eq_update_parm(u32 dy_eq_name, u8 tar)
{
#if TCFG_DYNAMIC_EQ_ENABLE
DynamicEQParam_TOOL_SET *dy_parm = &dynamic_eq[tar];//&packet->data[1];
DynamicEQEffectParam *parm1 = dy_parm->effect_param;
DynamicEQParam parm2 = {0};
parm2.nSection = dy_parm->nSection;
parm2.detect_mode = dy_parm->detect_mode;
DynamicEQDetectionParam detectParm[2] = {0};
detectParm[0].fc = dy_parm->effect_param[0].fc;
detectParm[1].fc = dy_parm->effect_param[1].fc;
dynamic_eq_printf(&dynamic_eq[tar]);
audio_dynamic_eq_detection_update_parm(dy_eq_name, detectParm, dy_parm->is_bypass);//动态eq检测更新
audio_dynamic_eq_update_parm(dy_eq_name, (void *)parm1, (void *)&parm2, dy_parm->is_bypass); //动态eq更新
#endif
}
int dynamic_eq_parm_analyze(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if TCFG_DYNAMIC_EQ_ENABLE
u8 mode_id = packet->data[0];
u8 tar = 0;
u32 dy_eq_name = AEID_MUSIC_DYNAMIC_EQ;
#if defined(LINEIN_MODE_SOLE_EQ_EN) && LINEIN_MODE_SOLE_EQ_EN
if (linein_mode_seq == mode_id) {
tar = 1;
dy_eq_name = AEID_AUX_DYNAMIC_EQ;
if (!get_cur_dynamic_eq_hdl_by_name(dy_eq_name)) {
memcpy(&dynamic_eq[tar], &packet->data[1], sizeof(DynamicEQParam_TOOL_SET));
return 0;
}
} else
#endif
if (music_mode_seq0 != mode_id) {
return 0;
}
memcpy(&dynamic_eq[tar], &packet->data[1], sizeof(DynamicEQParam_TOOL_SET));
dynamic_eq_update_parm(dy_eq_name, tar);
#endif
return 0;
}
int phone_eq_parm_analyze(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if defined(TCFG_EQ_ENABLE) && TCFG_EQ_ENABLE && (TCFG_AEC_UL_EQ_ENABLE || TCFG_PHONE_EQ_ENABLE)
u32 eq_name = get_module_name(packet->cmd, 0);//查询到相应模块
float global_gain = 0;
u8 mode_id = packet->data[0];
log_debug("mode_id %d\n", mode_id);
struct eq_seg_info *seg = (struct eq_seg_info *)&packet->data[1];
if (seg->index == (u16) - 1) {
memcpy(&global_gain, &seg->iir_type, sizeof(float));
log_info("global_gain 0x%x\n", *(int *)&global_gain);
}
void *tar_seg = NULL;
u8 tar = packet->cmd - EFF_PHONE_WIDEBAND_EQ;
log_debug("phone_mode tar %d\n", tar);
if (seg->index == (u16) - 1) {
phone_mode[tar].eq_parm.global_gain = global_gain;
} else {
tar_seg = &phone_mode[tar].eq_parm.seg[seg->index];
}
if (seg->index != (u16) - 1) {
#if PARM_DEBUG
log_info("idx:%d, iir:%d, frq:%d, gain:0x%x, q:0x%x \n", seg->index, seg->iir_type, seg->freq, *(int *)&seg->gain, *(int *)&seg->q);
#endif
memcpy(tar_seg, seg, sizeof(struct eq_seg_info));
if (!bt_phone_dec_is_running()) {
return 0;
}
cur_eq_set_update(eq_name, tar_seg, get_eq_nsection(eq_name), 0);
} else {
if (!bt_phone_dec_is_running()) {
return 0;
}
cur_eq_set_global_gain(eq_name, global_gain);
}
#endif
return 0;
}
int low_pass_parm_analyze(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if defined(SOUND_TRACK_2_P_X_CH_CONFIG) &&SOUND_TRACK_2_P_X_CH_CONFIG&& HIGH_GRADE_LOW_PASS_FILTER_EN
u8 mode_id = packet->data[0];
u8 tar = 0;
u32 eq_name = AEID_MUSIC_RL_EQ;
#if defined(LINEIN_MODE_SOLE_EQ_EN) && LINEIN_MODE_SOLE_EQ_EN
if (linein_mode_seq == mode_id) {
tar = 1;
eq_name = AEID_AUX_RL_EQ;
if (!get_cur_eq_hdl_by_name(eq_name)) {
memcpy(&low_pass_parm[tar], &packet->data[1], sizeof(LowPassParam_TOOL_SET));
return 0;
}
} else
#endif
if (music_mode_seq0 != mode_id) {
return 0;
}
memcpy(&low_pass_parm[tar], &packet->data[1], sizeof(LowPassParam_TOOL_SET));
cur_eq_set_update(eq_name, NULL, 1, 0);
#if PARM_DEBUG
log_info("low_pass_parm.is_bypass %d\n", low_pass_parm[tar].is_bypass);
struct advance_iir *low_p = &low_pass_parm[tar].low_pass;
log_info("low_p->fc %d, low_p->order %d, low_p->type %d\n", low_p->fc, low_p->order, low_p->type);
#endif
#endif
return 0;
}
int mic_eq_parm_analyze(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if defined(TCFG_MIC_EFFECT_ENABLE) && TCFG_MIC_EFFECT_ENABLE
u32 eq_name = get_module_name(packet->cmd, 0);//查询到相应模块
float global_gain = 0;
u8 mode_id = packet->data[0];
log_debug("mode_id %d\n", mode_id);
struct eq_seg_info *seg = (struct eq_seg_info *)&packet->data[1];
if (seg->index == (u16) - 1) {
memcpy(&global_gain, &seg->iir_type, sizeof(float));
log_info("global_gain 0x%x\n", *(int *)&global_gain);
}
void *tar_seg = NULL;
u8 tar = packet->cmd - EFF_MIC_EQ0;
log_debug("eff_mode tar %d\n", tar);
if (seg->index == (u16) - 1) {
eff_mode[mode_id - mic_mode_seq0].eq_parm[tar].global_gain = global_gain;
} else {
tar_seg = &eff_mode[mode_id - mic_mode_seq0].eq_parm[tar].seg[seg->index];
}
if (seg->index != (u16) - 1) {
#if PARM_DEBUG
log_info("idx:%d, iir:%d, frq:%d, gain:0x%x, q:0x%x \n", seg->index, seg->iir_type, seg->freq, *(int *)&seg->gain, *(int *)&seg->q);
#endif
memcpy(tar_seg, seg, sizeof(struct eq_seg_info));
if (!mic_effect_get_status()) {
return 0;
}
cur_eq_set_update(eq_name, tar_seg, get_eq_nsection(eq_name), 1);
} else {
if (!mic_effect_get_status()) {
return 0;
}
cur_eq_set_global_gain(eq_name, global_gain);
}
#endif
return 0;
}
int music_eq_parm_analyze(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if defined(TCFG_EQ_ENABLE) && TCFG_EQ_ENABLE
float global_gain = 0;
u8 mode_id = packet->data[0];
u8 tar = 0;
u32 eq_name = get_module_name(packet->cmd, tar);//查询到相应模块
u8 update = 1;
u8 right_ch = 0;
#if defined(LINEIN_MODE_SOLE_EQ_EN) && LINEIN_MODE_SOLE_EQ_EN
if (linein_mode_seq == mode_id) {
tar = 1;
eq_name = get_module_name(packet->cmd, tar);//查询到相应模块
if (!get_cur_eq_hdl_by_name(eq_name)) {
update = 0;
/* return 0; */
}
} else
#endif
if (music_mode_seq0 != mode_id) {
return 0;
}
log_debug("mode_id %d ,eq_name %d\n", mode_id, eq_name);
struct eq_seg_info *seg = (struct eq_seg_info *)&packet->data[1];
if (seg->index == (u16) - 1) {
memcpy(&global_gain, &seg->iir_type, sizeof(float));
log_info("global_gain 0x%x\n", *(int *)&global_gain);
}
void *tar_seg = NULL;
if (packet->cmd == EFF_MUSIC_EQ) {
if (seg->index == (u16) - 1) {
music_mode[tar].eq_parm.global_gain = global_gain;
} else {
tar_seg = &music_mode[tar].eq_parm.seg[seg->index];
}
} else if (packet->cmd == EFF_MUSIC_EQ2) {
#if TCFG_DYNAMIC_EQ_ENABLE
if (seg->index == (u16) - 1) {
music_eq2_parm[tar].global_gain = global_gain;
} else {
tar_seg = &music_eq2_parm[tar].seg[seg->index];
}
#endif
} else if (packet->cmd == EFF_MUSIC_HIGH_BASS_EQ) {
#if defined(TCFG_EQ_ENABLE) && TCFG_EQ_ENABLE && TCFG_AUDIO_OUT_EQ_ENABLE
if (seg->index == (u16) - 1) {
high_bass_eq_parm[tar].global_gain = global_gain;
} else {
tar_seg = &high_bass_eq_parm[tar].seg[seg->index];
memcpy(tar_seg, seg, sizeof(struct eq_seg_info));
if (update) {
cur_eq_set_update(eq_name, tar_seg, get_eq_nsection(eq_name) + 2, 0); //工具段数 + 高低音段数2
}
return 0;
}
#endif
} else if (packet->cmd == EFF_AUX_EQ) {
if (seg->index == (u16) - 1) {
music_mode[tar].eq_parm.global_gain = global_gain;
} else {
tar_seg = &music_mode[tar].eq_parm.seg[seg->index];
}
} else if (packet->cmd == EFF_MUSIC_RL_EQ) {
#if (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_FRONT_LR_REAR_LR)
if (seg->index == (u16) - 1) {
rl_eq_parm[tar].global_gain = global_gain;
} else {
tar_seg = &rl_eq_parm[tar].seg[seg->index];
}
#endif
} else if (packet->cmd == EFF_MUSIC_FR_EQ) {
#if (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_FRONT_LR_REAR_LR)
if (seg->index == (u16) - 1) {
fr_eq_parm[tar].global_gain = global_gain;
} else {
tar_seg = &fr_eq_parm[tar].seg[seg->index];
}
#endif
right_ch = 1;
} else if (packet->cmd == EFF_MUSIC_RR_EQ) {
#if (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_FRONT_LR_REAR_LR)
if (seg->index == (u16) - 1) {
rr_eq_parm[tar].global_gain = global_gain;
} else {
tar_seg = &rr_eq_parm[tar].seg[seg->index];
}
#endif
right_ch = 1;
} else if (packet->cmd == EFF_MUSIC_EXT_EQ) {
#if defined(MUSIC_EXT_EQ_AFTER_DRC) && MUSIC_EXT_EQ_AFTER_DRC
if (seg->index == (u16) - 1) {
muisc_ext_eq[tar].global_gain = global_gain;
} else {
tar_seg = &muisc_ext_eq[tar].seg[seg->index];
}
#endif
}
if ((seg->index != (u16) - 1) && tar_seg) {
#if PARM_DEBUG
log_info("idx:%d, iir:%d, frq:%d, gain:0x%x, q:0x%x \n", seg->index, seg->iir_type, seg->freq, *(int *)&seg->gain, *(int *)&seg->q);
#endif
memcpy(tar_seg, seg, sizeof(struct eq_seg_info));
if (update) {
if (right_ch) {
cur_eq_right_ch_set_update(eq_name, tar_seg, get_eq_nsection(eq_name), 0);
} else {
cur_eq_set_update(eq_name, tar_seg, get_eq_nsection(eq_name), 0);
}
}
} else {
if (update) {
if (right_ch) {
cur_eq_right_ch_set_global_gain(eq_name, global_gain);
} else {
cur_eq_set_global_gain(eq_name, global_gain);
}
}
}
#endif
return 0;
}
int mic_wdrc_parm_analyze(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if defined(TCFG_MIC_EFFECT_ENABLE) && TCFG_MIC_EFFECT_ENABLE
u16 type = 0; //0:low 1:mid 2:high ,3:other band, 4:crossover
u32 drc_name = get_module_name_and_index(packet->cmd, &type, 0);
type = 0;//混响没有多带drc
wdrc_struct_TOOL_SET *wdrc_parm = (wdrc_struct_TOOL_SET *)&packet->data[1];
void *tar_wdrc = NULL;
log_debug("wdrc_parm type %d\n", type);
u8 mode_id = packet->data[0];
u8 tar = packet->cmd - EFF_MIC_DRC0;
tar_wdrc = &eff_mode[mode_id - mic_mode_seq0].drc_parm[tar];
memcpy(tar_wdrc, wdrc_parm, sizeof(wdrc_struct_TOOL_SET));
wdrc_printf(tar_wdrc);
cur_drc_set_update(drc_name, type, tar_wdrc);
cur_drc_set_bypass(drc_name, type, wdrc_parm->is_bypass);
#endif
return 0;
}
int high_bass_wdrc_parm_analyze(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if defined(TCFG_DRC_ENABLE) && TCFG_DRC_ENABLE && TCFG_AUDIO_OUT_DRC_ENABLE
u16 type = 0; //0:low 1:mid 2:high ,3:other band, 4:crossover
u8 mode_id = packet->data[0];
u8 tar = 0;
u32 drc_name = get_module_name_and_index(packet->cmd, &type, tar);
u8 update = 1;
wdrc_struct_TOOL_SET *wdrc_parm = (wdrc_struct_TOOL_SET *)&packet->data[1];
void *tar_wdrc = NULL;
#if LINEIN_MODE_SOLE_EQ_EN
if (linein_mode_seq == mode_id) {
tar = 1;
drc_name = get_module_name_and_index(packet->cmd, &type, tar);
if (!get_cur_drc_hdl_by_name(drc_name)) {
update = 0;
/* return 0; */
}
} else
#endif
if (music_mode_seq0 != mode_id) {
return 0;
}
log_debug("wdrc_parm type %d\n", type);
tar_wdrc = &high_bass_drc_parm[tar];
memcpy(tar_wdrc, wdrc_parm, sizeof(wdrc_struct_TOOL_SET));
wdrc_printf(tar_wdrc);
if (update) {
cur_drc_set_update(drc_name, type, tar_wdrc);
cur_drc_set_bypass(drc_name, type, wdrc_parm->is_bypass);
}
#endif
return 0;
}
int music_wdrc_parm_analyze(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if defined(TCFG_DRC_ENABLE)&&TCFG_DRC_ENABLE
u16 type = 0; //0:low 1:mid 2:high ,3:other band, 4:crossover
u8 mode_id = packet->data[0];
u8 tar = 0;
u32 drc_name = get_module_name_and_index(packet->cmd, &type, tar);
u8 update = 1;
#if LINEIN_MODE_SOLE_EQ_EN
if (linein_mode_seq == mode_id) {
tar = 1;
drc_name = get_module_name_and_index(packet->cmd, &type, tar);
if (!get_cur_drc_hdl_by_name(drc_name)) {
update = 0;
/* return 0; */
}
} else
#endif
if (music_mode_seq0 != mode_id) {
return 0;
}
struct mode_list *list = get_group_list(drc_name);
wdrc_struct_TOOL_SET *wdrc_parm = (wdrc_struct_TOOL_SET *)&packet->data[1];
void *tar_wdrc = NULL;
log_debug("wdrc_parm type %d\n", type);
if (type == (list->group_num - 1)) { ////最后一个存分频器系数
#if defined(MULTI_BAND_DRC) && MULTI_BAND_DRC
CrossOverParam_TOOL_SET *parm = (CrossOverParam_TOOL_SET *)&packet->data[1];
tar_wdrc = &music_mode[tar].drc_parm.crossover;
memcpy(tar_wdrc, parm, sizeof(CrossOverParam_TOOL_SET));
if (update) {
cur_crossover_set_update(drc_name, tar_wdrc);
}
log_debug("way_num %d, N %d, low_freq %d, high_freq %d\n", parm->way_num, parm->N, parm->low_freq, parm->high_freq);
#endif
return 0;
} else {
tar_wdrc = &music_mode[tar].drc_parm.wdrc_parm[type];
}
memcpy(tar_wdrc, wdrc_parm, sizeof(wdrc_struct_TOOL_SET));
wdrc_printf(tar_wdrc);
if (update) {
cur_drc_set_update(drc_name, type, tar_wdrc);
cur_drc_set_bypass(drc_name, type, wdrc_parm->is_bypass);
}
#endif
return 0;
}
int music_rl_wdrc_parm_analyze(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_FRONT_LR_REAR_LR)
u16 type = 0; //0:low 1:mid 2:high ,3:other band, 4:crossover
u8 mode_id = packet->data[0];
u8 tar = 0;
u32 drc_name = get_module_name_and_index(packet->cmd, &type, tar);
u8 update = 1;
#if defined(LINEIN_MODE_SOLE_EQ_EN) && LINEIN_MODE_SOLE_EQ_EN
if (linein_mode_seq == mode_id) {
tar = 1;
drc_name = get_module_name_and_index(packet->cmd, &type, tar);
if (!get_cur_drc_hdl_by_name(drc_name)) {
update = 0;
/* return 0; */
}
} else
#endif
if (music_mode_seq0 != mode_id) {
return 0;
}
struct mode_list *list = get_group_list(drc_name);
wdrc_struct_TOOL_SET *wdrc_parm = (wdrc_struct_TOOL_SET *)&packet->data[1];
void *tar_wdrc = NULL;
log_debug("wdrc_parm type %d\n", type);
if (type == (list->group_num - 1)) { ////最后一个存分频器系数
#if defined(MULTI_BAND_DRC) && MULTI_BAND_DRC
CrossOverParam_TOOL_SET *parm = (CrossOverParam_TOOL_SET *)&packet->data[1];
tar_wdrc = &rl_drc_parm[tar].crossover;
memcpy(tar_wdrc, parm, sizeof(CrossOverParam_TOOL_SET));
if (update) {
cur_crossover_set_update(drc_name, tar_wdrc);
}
log_debug("way_num %d, N %d, low_freq %d, high_freq %d\n", parm->way_num, parm->N, parm->low_freq, parm->high_freq);
#endif
return 0;
} else {
tar_wdrc = &rl_drc_parm[tar].wdrc_parm[type];
}
memcpy(tar_wdrc, wdrc_parm, sizeof(wdrc_struct_TOOL_SET));
wdrc_printf(tar_wdrc);
if (update) {
cur_drc_set_update(drc_name, type, tar_wdrc);
cur_drc_set_bypass(drc_name, type, wdrc_parm->is_bypass);
}
#endif
return 0;
}
int phone_wdrc_parm_analyze(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if defined(TCFG_DRC_ENABLE)&&TCFG_DRC_ENABLE && TCFG_PHONE_DRC_ENABLE
u16 type = 0; //0:low 1:mid 2:high ,3:other band, 4:crossover
u32 drc_name = get_module_name_and_index(packet->cmd, &type, 0);
wdrc_struct_TOOL_SET *wdrc_parm = (wdrc_struct_TOOL_SET *)&packet->data[1];
type = 0;//通话下行使用type位置做更新
void *tar_wdrc = NULL;
log_debug("wdrc_parm type %d\n", type);
u8 tar = packet->cmd - EFF_PHONE_WIDEBAND_DRC;
tar_wdrc = &phone_mode[tar].drc_parm;
memcpy(tar_wdrc, wdrc_parm, sizeof(wdrc_struct_TOOL_SET));
wdrc_printf(tar_wdrc);
cur_drc_set_update(drc_name, type, tar_wdrc);
cur_drc_set_bypass(drc_name, type, wdrc_parm->is_bypass);
#endif
return 0;
}
int noise_gate_parm_analyze(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if defined(TCFG_MIC_EFFECT_ENABLE) && TCFG_MIC_EFFECT_ENABLE
u8 mode_id = packet->data[0];
memcpy(&eff_mode[mode_id - mic_mode_seq0].noise_gate_parm, &packet->data[1], sizeof(NoiseGateParam_TOOL_SET));
NoiseGateParam_TOOL_SET *parmt = &eff_mode[mode_id - mic_mode_seq0].noise_gate_parm;
noisegate_update_parm(&parmt->parm, parmt->is_bypass);
#if PARM_DEBUG
noisegate_update_param *parm = &parmt->parm;
log_debug("noise gate attact_time %d,releasetime %d, threshold %d, low_th_gain %d\n",
parm->attackTime, parm->releaseTime, parm->threshold, parm->low_th_gain);
#endif
#endif
return 0;
}
int howling_pitch_shift_parm_analyze(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if defined(TCFG_MIC_EFFECT_ENABLE) && TCFG_MIC_EFFECT_ENABLE
u8 mode_id = packet->data[0];
memcpy(&eff_mode[mode_id - mic_mode_seq0].howlingps_parm, &packet->data[1], sizeof(HowlingPs_PARM_TOOL_SET));
HowlingPs_PARM_TOOL_SET *parmt = &eff_mode[mode_id - mic_mode_seq0].howlingps_parm;
howling_pitch_shift_update_parm(&parmt->parm, parmt->is_bypass);
#if PARM_DEBUG
HOWLING_PITCHSHIFT_PARM *parm = &parmt->parm;
log_debug("ps_parm %d, fe_parm %d, effect_v %d\n", parm->ps_parm, parm->fe_parm, parm->effect_v);
#endif
#endif
return 0;
}
int notchhowling_parm_analyze(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if defined(TCFG_MIC_EFFECT_ENABLE) && TCFG_MIC_EFFECT_ENABLE
u8 mode_id = packet->data[0];
memcpy(&eff_mode[mode_id - mic_mode_seq0].notchhowling_parm, &packet->data[1], sizeof(NotchHowlingParam_TOOL_SET));
NotchHowlingParam_TOOL_SET *parmt = &eff_mode[mode_id - mic_mode_seq0].notchhowling_parm;
notchhowline_update_parm(&parmt->parm, parmt->is_bypass);
#if PARM_DEBUG
NotchHowlingParam *parm = &parmt->parm;
log_debug("parmt->is_bypass %d\n", parmt->is_bypass);
log_debug("Q 0x%x, gain 0x%x, fade_n %d\n", *(int *)&parm->Q, *(int *)&parm->gain, parm->fade_n);
#endif
#endif
return 0;
}
int reverb_parm_analyze(EFF_ONLINE_PACKET *packet)
{
#if 0
u8 mode_id = packet->data[0];
memcpy(&eff_mode[mode_id - mic_mode_seq0].reverb_parm, &packet->data[1], sizeof(REVERBN_PARM_TOOL_SET));
REVERBN_PARM_TOOL_SET *parmt = &eff_mode[mode_id - mic_mode_seq0].reverb_parm;
reverb_update_parm(&parmt->parm);
REVERBN_PARM_SET *parm = &parmt->parm;
log_debug("dry %d,\n wet %d,\n delay %d,\n rot60 %d,\n Erwet %d,\nErfactor %d,\n Ewidth %d,\n Ertolate %d,\nErbasslpf %d,\nErbassB %d,\n predelay %d,\nallpassfeedback %d,\ndiffusion %d,\n dampinglpf %d,\n basslpf %d,\n bassB %d,\n lowcut %d\n",
parm->dry,
parm->wet,
parm->delay,
parm->rot60,
parm->Erwet,
parm->Erfactor,
parm->Ewidth,
parm->Ertolate,
parm->Erbasslpf,
parm->ErbassB,
parm->predelay,
parm->allpassfeedback,
parm->diffusion,
parm->dampinglpf,
parm->basslpf,
parm->bassB,
parm->lowcut
);
#endif
return 0;
}
int plate_reverb_parm_analyze(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if defined(TCFG_MIC_EFFECT_ENABLE) && TCFG_MIC_EFFECT_ENABLE
u8 mode_id = packet->data[0];
memcpy(&eff_mode[mode_id - mic_mode_seq0].plate_reverb_parm, &packet->data[1], sizeof(Plate_reverb_TOOL_SET));
Plate_reverb_TOOL_SET *parmt = &eff_mode[mode_id - mic_mode_seq0].plate_reverb_parm;
plate_reverb_update_parm(&parmt->parm, parmt->is_bypass);
#if PARM_DEBUG
Plate_reverb_parm *parm = &parmt->parm;
log_debug("wet %d\n dry %d\n pre_delay %d\n highcutoff %d\n diffusion %d\n decayfactor %d\n highfrequencydamping %d\n modulate %d\n roomsize %d\n", parm->wet, parm->dry, parm->pre_delay, parm->highcutoff, parm->diffusion, parm->decayfactor, parm->highfrequencydamping, parm->modulate, parm->roomsize);
#endif
#endif
return 0;
}
int echo_parm_analyze(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if defined(TCFG_MIC_EFFECT_ENABLE) && TCFG_MIC_EFFECT_ENABLE
u8 mode_id = packet->data[0];
memcpy(&eff_mode[mode_id - mic_mode_seq0].echo_parm, &packet->data[1], sizeof(EF_ECHO_TOOL_SET));
EF_ECHO_TOOL_SET *parmt = &eff_mode[mode_id - mic_mode_seq0].echo_parm;
echo_updata_parm(&parmt->parm, parmt->is_bypass);
#if PARM_DEBUG
ECHO_PARM_SET *parm = &parmt->parm;
log_debug("delay %d, decayval %d, filt_enable %d, lpf_cutoff %d, wetgain %d, drygain %d\n",
parm->delay, parm->decayval, parm->filt_enable, parm->lpf_cutoff, parm->wetgain, parm->drygain);
#endif
#endif
return 0;
}
void eff_send_packet(void *priv, u32 id, u8 *packet, int size, u8 sq)
{
#if (TCFG_SOUNDBOX_TOOL_ENABLE || TCFG_ONLINE_ENABLE)
all_assemble_package_send_to_pc(id, sq, packet, size);
#endif
}
void alive_timer_send_packet(void *p)
{
u32 T = 2;
u8 sq = 0;
eff_send_packet(NULL, T, (u8 *)"empty", 5, sq);
if (alive_cnt++ > 15) { //连接超时删除timer(工具可能关闭了)
if (alive_timer) {
sys_timer_del(alive_timer);
alive_timer = 0;
}
alive_cnt = 0;
}
}
int eff_tool_get_cfg_file_size(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
struct file_s {
int id;
int fileid;
};
struct file_s fs;
memcpy(&fs, packet, sizeof(struct file_s));
u32 file_size = 0;
if (fs.fileid == EFF_CFG_FILE_ID) {
FILE *file = NULL;
file = fopen((const char *)EFF_CFG_FILE_NAME, "r");
if (!file) {
log_error("EFF_CFG_FILE_NAME err %s\n", EFF_CFG_FILE_NAME);
} else {
file_size = flen(file);
fclose(file);
}
eff_send_packet(NULL, REPLY_TO_TOOL, (u8 *)&file_size, sizeof(u32), sq);
}
return 1;
}
int eff_tool_get_cfg_file_data(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
struct file_s {
int id;
int fileid;
int offset;
int size;
};
struct file_s fs;
memcpy(&fs, packet, sizeof(struct file_s));
if (fs.fileid == (int)EFF_CFG_FILE_ID) {
FILE *file = NULL;
file = fopen((const char *)EFF_CFG_FILE_NAME, "r");
if (!file) {
return -EINVAL;
}
fseek(file, fs.offset, SEEK_SET);
u8 *data = malloc(fs.size);
if (!data) {
fclose(file);
return -EINVAL;
}
int ret = fread(file, data, fs.size);
if (ret != fs.size) {
}
fclose(file);
eff_send_packet(NULL, REPLY_TO_TOOL, (u8 *)data, fs.size, sq);
free(data);
}
return 1;
}
static s32 eff_online_update(void *_packet)
{
u8 *ptr = _packet;
u8 id = ptr[0];
u8 sq = ptr[1];
int res = -1;
EFF_ONLINE_PACKET *packet = (EFF_ONLINE_PACKET *)&ptr[2];
struct cmd_interface *p = NULL;
#if PARM_DEBUG
if (packet->cmd != 0x4) {//离线查询
log_debug(" id 0x%x, sq %d\n", id, sq);
log_debug("_cmd:0x%x mode_id %d\n", packet->cmd, packet->data[0]);
}
#endif
if (!alive_timer) {
alive_timer = sys_timer_add(NULL, alive_timer_send_packet, 900);//定时往上位机推送,可能对工具离线的消息有帮助
}
list_for_each_cmd_interface(p) {
if (p->cmd == packet->cmd) {
if (p->cmd_deal) {
res = p->cmd_deal(packet, REPLY_TO_TOOL, sq);
}
}
}
return res;
}
int eff_tool_get_version(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if TCFG_EFFECT_TOOL_ENABLE
struct _ver_info {
char sdkname[16];
u8 eqver[4];
};
struct _ver_info _ver_info = {0};
memcpy(_ver_info.sdkname, eff_sdk_name, sizeof(eff_sdk_name));
memcpy(_ver_info.eqver, eff_eq_ver, sizeof(eff_eq_ver));
eff_send_packet(NULL, REPLY_TO_TOOL, (u8 *)&_ver_info, sizeof(struct _ver_info), sq);
#endif
return 1;
}
int eff_tool_set_channge_mode(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if TCFG_EFFECT_TOOL_ENABLE
#if defined(TCFG_MIC_EFFECT_ENABLE) && TCFG_MIC_EFFECT_ENABLE
struct cmd {
int id;
int modeId;
};
struct cmd cmd;
memcpy(&cmd, packet, sizeof(struct cmd));
log_debug("cmd.modeId %d\n", cmd.modeId);
if ((cmd.modeId >= mic_mode_seq0) && (cmd.modeId <= mic_mode_seq7)) { //混响0~7
set_mic_reverb_mode_by_id(cmd.modeId - mic_mode_seq0);
}
#endif
eff_send_packet(NULL, REPLY_TO_TOOL, (u8 *)"OK", 2, sq);
extern void audio_resume_all_decoder(void);
audio_resume_all_decoder();//唤醒数据流
#endif
return 1;
}
//在线检测应答
int eff_tool_set_inquire(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if TCFG_EFFECT_TOOL_ENABLE
//eff_send_packet(NULL, id, (u8 *)"OK", 2, sq);//OK表示需要重传NO表示不需要重传,ER还是表示未知命令
eff_send_packet(NULL, id, (u8 *)"NO", 2, sq);//OK表示需要重传NO表示不需要重传,ER还是表示未知命令
alive_cnt = 0;
#endif
return 1;
}
int eff_tool_resync_parm_begin(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if TCFG_EFFECT_TOOL_ENABLE
#if defined(TCFG_MIC_EFFECT_ENABLE) && TCFG_MIC_EFFECT_ENABLE
eff_mode_save = get_mic_eff_mode();
#endif
eff_send_packet(NULL, REPLY_TO_TOOL, (u8 *)"OK", 2, sq);
#endif
return 1;
}
int eff_tool_resync_parm_end(EFF_ONLINE_PACKET *packet, u8 id, u8 sq)
{
#if TCFG_EFFECT_TOOL_ENABLE
#if defined(TCFG_MIC_EFFECT_ENABLE) && TCFG_MIC_EFFECT_ENABLE
u8 eff_mode = eff_mode_save;
set_mic_reverb_mode_by_id(eff_mode);//还原混响的模式
#endif
eff_send_packet(NULL, REPLY_TO_TOOL, (u8 *)"OK", 2, sq);
#endif
return 1;
}
static void effect_tool_callback(u8 *_packet, u32 size)
{
#if TCFG_EFFECT_TOOL_ENABLE
int res = 0;
u8 *ptr = _packet;
u8 id = ptr[0];
u8 sq = ptr[1];
u8 *packet = (u8 *)&ptr[2];
ASSERT(((int)packet & 0x3) == 0, "buf %x size %d\n", (unsigned int)packet, size - 2);
res = eff_online_update(ptr);
if (!res) {
log_debug("Ack");
eff_send_packet(NULL, REPLY_TO_TOOL, (u8 *)"OK", 2, sq);
} else if (res != 1) {
log_debug("Nack");
eff_send_packet(NULL, REPLY_TO_TOOL, (u8 *)"ER", 2, sq);
}
#endif
}
#if TCFG_EFFECT_TOOL_ENABLE
REGISTER_DETECT_TARGET(eff_adj_target) = {
.id = 0x11,//EFF_CONFIG_ID,
.tool_message_deal = effect_tool_callback,
};
//在线调试不进power down
static u8 effect_tool_idle_query(void)
{
#if TCFG_EFFECT_TOOL_ENABLE
return 0;
#endif
return 1;
}
REGISTER_LP_TARGET(effect_adj_lp_target) = {
.name = "effect_adj",
.is_idle = effect_tool_idle_query,
};
#endif
#define INDEX_HEAD 0xFFFD
int eff_file_exist()
{
FILE *file = fopen((const char *)EFF_CFG_FILE_NAME, "r");
if (file) {
fclose(file);
return 1;
}
return 0;
}
int eff_file_analyze(u32 mode_id, u16 group_id, void *data_buf, u32 buf_len)
{
#if PARM_DEBUG
log_debug("mode_id 0x%x, group_id 0x%x\n", mode_id, group_id);
#endif
int ret = 0;
u8 *crc_buf = NULL;
FILE *file = NULL;
file = fopen((const char *)EFF_CFG_FILE_NAME, "r");
if (!file) {
log_error("eff file open err\n");
return -ENOENT;
}
u8 FV = 0;
if (1 != fread(file, &FV, 1)) {
ret = -1;
goto err_exit;
}
u8 ver[4] = {0};
if (4 != fread(file, ver, 4)) {
ret = -2;
goto err_exit;
}
if (memcmp(ver, eff_eq_ver, sizeof(eff_eq_ver))) {
log_error("eff ver err \n");
log_error_hexdump((unsigned char *)ver, 4);
fseek(file, 0, SEEK_SET);
ret = -3;
goto err_exit;
}
u16 index_head = 0;//索引头
if (2 != fread(file, &index_head, 2)) {
ret = -4;
goto err_exit;
}
if (index_head != INDEX_HEAD) {
ret = -5;
goto err_exit;
}
u16 index_len = 0;//索引区域长度
if (2 != fread(file, &index_len, 2)) {
ret = -6;
goto err_exit;
}
u8 mode_num = 0;//模式个数
if (1 != fread(file, &mode_num, 1)) {
ret = -7;
goto err_exit;
}
u16 off0 = 0; //组索引区域的偏移
u16 off1 = 0; //模式索引区域的偏移
for (int mode_cnt = 0; mode_cnt < mode_num; mode_cnt++) {
u16 mode_seq = 0;//模式标识
if (2 != fread(file, &mode_seq, 2)) {
ret = -8;
goto err_exit;
}
if (2 != fread(file, &off0, 2)) {
ret = -9;
goto err_exit;
}
if (2 != fread(file, &off1, 2)) {
ret = -10;
goto err_exit;
}
if (mode_seq != mode_id) { //查询到相应的模式
continue;
} else {
break;
}
}
fseek(file, off0, SEEK_SET);//偏移到组索引区域
u8 group_num = 0;
if (1 != fread(file, &group_num, 1)) {
ret = -11;
goto err_exit;
}
u16 g_id = 0;//模块id
u16 group_id_addr = 0;//模块id的内容地址
int group_cnt = 0;
for (group_cnt = 0; group_cnt < group_num; group_cnt++) {
if (2 != fread(file, &g_id, 2)) {
ret = -12;
goto err_exit;
}
if (2 != fread(file, &group_id_addr, 2)) {
ret = -13;
goto err_exit;
}
if (g_id != group_id) {
continue;
} else {
break;
}
}
if (group_cnt == group_num) {
ret = -14;
#if PARM_DEBUG
log_error("seek group id addr err\n");
#endif
goto err_exit;
}
fseek(file, group_id_addr, SEEK_SET);//偏移到模式id的具体内容
u16 crc16 = 0;
u16 verify_group_id = 0;
u16 group_len;
if (2 != fread(file, &crc16, 2)) {
ret = -15;
goto err_exit;
}
int cur_addr = fpos(file);
if (2 != fread(file, &verify_group_id, 2)) {
ret = -16;
goto err_exit;
}
if (2 != fread(file, &group_len, 2)) {
ret = -17;
goto err_exit;
}
if (!group_len) {
ret = -18;
goto err_exit;
}
if (verify_group_id != group_id) {
ret = -19;
log_error("verify_group_id %x != group_id %x\n", verify_group_id, group_id);
log_error("verify groud id err\n");
goto err_exit;
}
fseek(file, cur_addr, SEEK_SET);
u16 size = sizeof(crc16) + sizeof(group_len);
crc_buf = zalloc(group_len + size);
u8 *group_buf = &crc_buf[size];
if ((group_len + size) != fread(file, crc_buf, group_len + size)) {
ret = -20;
goto err_exit;
}
u16 calc_crc = CRC16(crc_buf, group_len + size); //id + len +playload
if (crc16 != calc_crc) {
ret = -21;
log_error("crc16 %x, calc_crc %x\n", crc16, calc_crc);
goto err_exit;
}
if (!data_buf) {
ret = -22;
#if PARM_DEBUG
log_error("input data buf NULL\n");
#endif
goto err_exit;
}
if (group_len <= buf_len) {
memcpy(data_buf, group_buf, group_len);
} else {
ret = -23;
log_error("input data buf len : %d < group_len:%d\n", buf_len, group_len);
goto err_exit;
}
err_exit:
if (crc_buf) {
free(crc_buf);
crc_buf = NULL;
}
fclose(file);
#if PARM_DEBUG
if (ret) {
log_error("ret :%d, analyze eff file err, please check it\n", ret);
}
#endif
return 0;
}
void music_eq_printf(void *_parm)
{
#if PARM_DEBUG
puts("----------------------- music eq ----------------------\n");
struct music_eq_tool *parm = _parm;
log_debug("global_gain:0x%x\n", *(int *)&parm->global_gain);
log_debug("seg_num:%d\n", parm->seg_num);
struct eq_seg_info *seg;
for (int i = 0; i < parm->seg_num; i++) {
seg = &parm->seg[i];
log_debug("idx:%d, iir:%d, frq:%d, gain:0x%x, q:0x%x \n", seg->index, seg->iir_type, seg->freq, *(int *)&seg->gain, *(int *)&seg->q);
}
#endif
}
void music_eq2_printf(void *_parm)
{
#if PARM_DEBUG
puts("----------------------- music eq2 ----------------------\n");
struct music_eq2_tool *parm = _parm;
log_debug("global_gain:0x%x\n", *(int *)&parm->global_gain);
log_debug("seg_num:%d\n", parm->seg_num);
struct eq_seg_info *seg;
for (int i = 0; i < parm->seg_num; i++) {
seg = &parm->seg[i];
log_debug("idx:%d, iir:%d, frq:%d, gain:0x%x, q:0x%x \n", seg->index, seg->iir_type, seg->freq, *(int *)&seg->gain, *(int *)&seg->q);
}
#endif
}
void wdrc_printf(void *_wdrc)
{
#if PARM_DEBUG
puts("---------------------- drc -----------------------\n");
wdrc_struct_TOOL_SET *twdrc = _wdrc;
struct wdrc_struct *wdrc = &twdrc->parm;
printf("wdrc->is_bypass %d\n", twdrc->is_bypass);
printf("wdrc attacktime %d, releasetime %d threshold_num %d rms_time %d algorithm%d, mode%d ,0x%x,0x%x\n", wdrc->attacktime, wdrc->releasetime, wdrc->threshold_num, wdrc->rms_time, wdrc->algorithm, wdrc->mode, *(int *)&wdrc->inputgain, *(int *)&wdrc->outputgain);
struct threshold_group *tt = (struct threshold_group *)wdrc->threshold;
for (int i = 0; i < wdrc->threshold_num; i++) {
printf("in_threshold 0x%x, out_threshold 0x%x\n", *(int *)&tt[i].in_threshold, *(int *)&tt[i].out_threshold);
}
#endif
}
void eq_printf(void *_parm)
{
#if PARM_DEBUG
puts("----------------------- eq ----------------------\n");
struct eq_tool *parm = _parm;
printf("global_gain:0x%x\n", *(int *)&parm->global_gain);
printf("seg_num:%d\n", parm->seg_num);
struct eq_seg_info *seg;// = parm->seg;
for (int i = 0; i < parm->seg_num; i++) {
seg = &parm->seg[i];
printf("idx:%d, iir:%d, frq:%d, gain:0x%x, q:0x%x \n", seg->index, seg->iir_type, seg->freq, *(int *)&seg->gain, *(int *)&seg->q);
}
#endif
}
/**
*cmd_deal,00
* */
#if defined(TCFG_MIC_EFFECT_ENABLE) && TCFG_MIC_EFFECT_ENABLE
REGISTER_CMD_TARGET(mic_g) = {//
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MIC_GAIN,
.cmd_deal = mic_gain_parm_analyze,
#endif
.eff_default_parm_init = mic_gain_parm_default_init,
.eff_file_analyze_init = mic_gain_file_analyze_init,
};
#endif
#if GAIN_PROCESS_EN
REGISTER_CMD_TARGET(music_g) = {
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MUSIC_GAIN,
.cmd_deal = gain_process_parm_analyze,
#endif
.eff_default_parm_init = music_gain_parm_default_init,
.eff_file_analyze_init = music_gain_file_analyze_init,
};
#endif
#if (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_FRONT_LR_REAR_LR)
REGISTER_CMD_TARGET(music_rl_g) = {//
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MUSIC_RL_GAIN,
.cmd_deal = rl_gain_process_parm_analyze,
#endif
.eff_default_parm_init = rl_music_gain_parm_default_init,
.eff_file_analyze_init = rl_music_gain_file_analyze_init,
};
#endif
#if TCFG_DYNAMIC_EQ_ENABLE
REGISTER_CMD_TARGET(dyeq) = {//动态eq
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MUSIC_DYNAMIC_EQ,
.cmd_deal = dynamic_eq_parm_analyze,
#endif
.eff_default_parm_init = dynamic_eq_parm_default_init,
.eff_file_analyze_init = dynamic_eq_file_analyze_init,
};
#endif
#if defined(TCFG_MIC_EFFECT_ENABLE) && TCFG_MIC_EFFECT_ENABLE
REGISTER_CMD_TARGET(echo) = {//混响echo
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MIC_ECHO,
.cmd_deal = echo_parm_analyze,
#endif
.eff_default_parm_init = echo_parm_default_init,
.eff_file_analyze_init = echo_file_analyze_init,
};
REGISTER_CMD_TARGET(p_reverb) = {//混响plate_reverb
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MIC_PLATE_REVERB,
.cmd_deal = plate_reverb_parm_analyze,
#endif
.eff_default_parm_init = plate_reverb_parm_default_init,
.eff_file_analyze_init = plate_reverb_file_analyze_init,
};
REGISTER_CMD_TARGET(notch_howling) = {//混响弦波啸叫抑制
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MIC_NOTCH_HOWLING,
.cmd_deal = notchhowling_parm_analyze,
#endif
.eff_default_parm_init = notchhowling_parm_default_init,
.eff_file_analyze_init = notchhowling_file_analyze_init,
};
REGISTER_CMD_TARGET(howling_ps) = {//混响移频啸叫抑制
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MIC_HOWLINE_PS,
.cmd_deal = howling_pitch_shift_parm_analyze,
#endif
.eff_default_parm_init = howling_ps_parm_default_init,
.eff_file_analyze_init = howling_ps_file_analyze_init,
};
REGISTER_CMD_TARGET(noisegate) = {//混响门限噪声
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MIC_NOISEGATE,
.cmd_deal = noise_gate_parm_analyze,
#endif
.eff_default_parm_init = noisegate_parm_default_init,
.eff_file_analyze_init = noisegate_file_analyze_init,
};
#endif
#if defined(TCFG_DRC_ENABLE)&&TCFG_DRC_ENABLE && TCFG_PHONE_DRC_ENABLE
REGISTER_CMD_TARGET(pw_drc) = {//下行宽频drc
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_PHONE_WIDEBAND_DRC,
.cmd_deal = phone_wdrc_parm_analyze,
#endif
.eff_default_parm_init = downlink_wideband_wdrc_parm_default_init,
.eff_file_analyze_init = downlink_wideband_wdrc_file_analyze_init,
};
REGISTER_CMD_TARGET(ph_drc) = {//下行窄频drc
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_PHONE_NARROWBAND_DRC,
.cmd_deal = phone_wdrc_parm_analyze,
#endif
.eff_default_parm_init = downlink_narrowband_wdrc_parm_default_init,
.eff_file_analyze_init = downlink_narrowband_wdrc_file_analyze_init,
};
REGISTER_CMD_TARGET(aw_drc) = {//上行宽频drc
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_AEC_WIDEBAND_DRC,
.cmd_deal = phone_wdrc_parm_analyze,
#endif
.eff_default_parm_init = uplink_wideband_wdrc_parm_default_init,
.eff_file_analyze_init = uplink_wideband_wdrc_file_analyze_init,
};
REGISTER_CMD_TARGET(an_drc) = {//上行窄频drc
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_AEC_NARROWBAND_DRC,
.cmd_deal = phone_wdrc_parm_analyze,
#endif
.eff_default_parm_init = uplink_narrowband_wdrc_parm_default_init,
.eff_file_analyze_init = uplink_narrowband_wdrc_file_analyze_init,
};
#endif
#if defined(TCFG_DRC_ENABLE)&&TCFG_DRC_ENABLE
REGISTER_CMD_TARGET(ml_drc) = {//music_drc
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MUSIC_LOW_DRC,
.cmd_deal = music_wdrc_parm_analyze,
#endif
.eff_default_parm_init = music_low_wdrc_parm_default_init,
.eff_file_analyze_init = music_low_wdrc_file_analyze_init,
};
#if defined(MULTI_BAND_DRC) && MULTI_BAND_DRC
REGISTER_CMD_TARGET(mm_drc) = {//music_drc
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MUSIC_MID_DRC,
.cmd_deal = music_wdrc_parm_analyze,
#endif
.eff_default_parm_init = music_mid_wdrc_parm_default_init,
.eff_file_analyze_init = music_mid_wdrc_file_analyze_init,
};
REGISTER_CMD_TARGET(mh_drc) = {//music_drc
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MUSIC_HIGH_DRC,
.cmd_deal = music_wdrc_parm_analyze,
#endif
.eff_default_parm_init = music_high_wdrc_parm_default_init,
.eff_file_analyze_init = music_high_wdrc_file_analyze_init,
};
REGISTER_CMD_TARGET(m_whole_drc) = {//music_drc
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MUSIC_WHOLE_DRC,
.cmd_deal = music_wdrc_parm_analyze,
#endif
.eff_default_parm_init = music_whole_wdrc_parm_default_init,
.eff_file_analyze_init = music_whole_wdrc_file_analyze_init,
};
REGISTER_CMD_TARGET(m_cross) = {//music_crossover
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MUSIC_CROSSOVER,
.cmd_deal = music_wdrc_parm_analyze,
#endif
.eff_default_parm_init = music_crossover_wdrc_parm_default_init,
.eff_file_analyze_init = music_crossover_wdrc_file_analyze_init,
};
#endif
#if (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_FRONT_LR_REAR_LR)
REGISTER_CMD_TARGET(rl_drc_p) = {//music_rl_drc
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MUSIC_RL_LOW_DRC,
.cmd_deal = music_rl_wdrc_parm_analyze,
#endif
.eff_default_parm_init = music_rl_wdrc_parm_default_init,
.eff_file_analyze_init = music_rl_wdrc_file_analyze_init,
};
#endif
#if defined(TCFG_MIC_EFFECT_ENABLE) && TCFG_MIC_EFFECT_ENABLE
REGISTER_CMD_TARGET(micDrc0) = {//mic_drc0
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MIC_DRC0,
.cmd_deal = mic_wdrc_parm_analyze,
#endif
.eff_default_parm_init = mic_wdrc0_parm_default_init,
.eff_file_analyze_init = mic_wdrc0_file_analyze_init,
};
REGISTER_CMD_TARGET(micDrc1) = {//mic_drc1
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MIC_DRC1,
.cmd_deal = mic_wdrc_parm_analyze,
#endif
.eff_default_parm_init = mic_wdrc1_parm_default_init,
.eff_file_analyze_init = mic_wdrc1_file_analyze_init,
};
REGISTER_CMD_TARGET(micDrc2) = {//mic_drc2
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MIC_DRC2,
.cmd_deal = mic_wdrc_parm_analyze,
#endif
.eff_default_parm_init = mic_wdrc2_parm_default_init,
.eff_file_analyze_init = mic_wdrc2_file_analyze_init,
};
REGISTER_CMD_TARGET(micDrc3) = {//mic_drc3
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MIC_DRC3,
.cmd_deal = mic_wdrc_parm_analyze,
#endif
.eff_default_parm_init = mic_wdrc3_parm_default_init,
.eff_file_analyze_init = mic_wdrc3_file_analyze_init,
};
REGISTER_CMD_TARGET(micDrc4) = {//mic_drc4
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MIC_DRC4,
.cmd_deal = mic_wdrc_parm_analyze,
#endif
.eff_default_parm_init = mic_wdrc4_parm_default_init,
.eff_file_analyze_init = mic_wdrc4_file_analyze_init,
};
#endif
#endif
#if TCFG_DYNAMIC_EQ_ENABLE
REGISTER_CMD_TARGET(music_eq2) = {//music eq2
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MUSIC_EQ2,
.cmd_deal = music_eq_parm_analyze,
#endif
.eff_default_parm_init = music_eq2_parm_default_init,
.eff_file_analyze_init = music_eq2_file_analyze_init,
};
#endif
#if defined(MUSIC_EXT_EQ_AFTER_DRC) && MUSIC_EXT_EQ_AFTER_DRC
REGISTER_CMD_TARGET(music_ext_eq) = {//music ext eq
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MUSIC_EXT_EQ,
.cmd_deal = music_eq_parm_analyze,
#endif
.eff_default_parm_init = music_ext_eq_parm_default_init,
.eff_file_analyze_init = music_ext_eq_file_analyze_init,
};
#endif
#if defined(CH_SWAP_OLD) && CH_SWAP_OLD
REGISTER_CMD_TARGET(ch_swap_adj) = {//music ch swap
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MUSIC_CH_SWAP,
.cmd_deal = music_ch_swap_process_parm_analyze,
#endif
.eff_default_parm_init = music_ch_swap_parm_default_init,
.eff_file_analyze_init = music_ch_swap_file_analyze_init,
};
#endif
REGISTER_CMD_TARGET(music_eq) = {//music eq
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MUSIC_EQ,
.cmd_deal = music_eq_parm_analyze,
#endif
.eff_default_parm_init = music_eq_parm_default_init,
.eff_file_analyze_init = music_eq_file_analyze_init,
};
#if defined(TCFG_EQ_ENABLE) && TCFG_EQ_ENABLE && TCFG_AUDIO_OUT_EQ_ENABLE
REGISTER_CMD_TARGET(music_hbass_eq) = {//high bass eq
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MUSIC_HIGH_BASS_EQ,
.cmd_deal = music_eq_parm_analyze,
#endif
.eff_default_parm_init = high_bass_eq_parm_default_init,
.eff_file_analyze_init = high_bass_eq_file_analyze_init,
};
#endif
#if defined(TCFG_MIC_EFFECT_ENABLE) && TCFG_MIC_EFFECT_ENABLE
REGISTER_CMD_TARGET(micEq0) = {//mic eq0
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MIC_EQ0,
.cmd_deal = mic_eq_parm_analyze,
#endif
.eff_default_parm_init = mic_eq0_parm_default_init,
.eff_file_analyze_init = mic_eq0_file_analyze_init,
};
REGISTER_CMD_TARGET(micEq1) = {//mic eq1
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MIC_EQ1,
.cmd_deal = mic_eq_parm_analyze,
#endif
.eff_default_parm_init = mic_eq1_parm_default_init,
.eff_file_analyze_init = mic_eq1_file_analyze_init,
};
REGISTER_CMD_TARGET(micEq2) = {//mic eq2
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MIC_EQ2,
.cmd_deal = mic_eq_parm_analyze,
#endif
.eff_default_parm_init = mic_eq2_parm_default_init,
.eff_file_analyze_init = mic_eq2_file_analyze_init,
};
REGISTER_CMD_TARGET(micEq3) = {//mic eq3
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MIC_EQ3,
.cmd_deal = mic_eq_parm_analyze,
#endif
.eff_default_parm_init = mic_eq3_parm_default_init,
.eff_file_analyze_init = mic_eq3_file_analyze_init,
};
REGISTER_CMD_TARGET(micEq4) = {//mic eq4
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MIC_EQ4,
.cmd_deal = mic_eq_parm_analyze,
#endif
.eff_default_parm_init = mic_eq4_parm_default_init,
.eff_file_analyze_init = mic_eq4_file_analyze_init,
};
#endif
#if defined(TCFG_EQ_ENABLE) && TCFG_EQ_ENABLE && TCFG_PHONE_EQ_ENABLE
REGISTER_CMD_TARGET(ph_Eq) = {//通话下行宽频(16k sr)
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_PHONE_WIDEBAND_EQ,
.cmd_deal = phone_eq_parm_analyze,
#endif
.eff_default_parm_init = downlink_wideband_eq_parm_default_init,
.eff_file_analyze_init = downlink_wideband_eq_file_analyze_init,
};
REGISTER_CMD_TARGET(pn_Eq) = {//通话下行窄频(8k sr)
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_PHONE_NARROWBAND_EQ,
.cmd_deal = phone_eq_parm_analyze,
#endif
.eff_default_parm_init = downlink_narrowband_eq_parm_default_init,
.eff_file_analyze_init = downlink_narrowband_eq_file_analyze_init,
};
#endif
#if defined(TCFG_EQ_ENABLE) && TCFG_EQ_ENABLE && TCFG_AEC_UL_EQ_ENABLE
REGISTER_CMD_TARGET(aw_Eq) = {//通话上行宽频(16k sr)
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_AEC_WIDEBAND_EQ,
.cmd_deal = phone_eq_parm_analyze,
#endif
.eff_default_parm_init = uplink_wideband_eq_parm_default_init,
.eff_file_analyze_init = uplink_wideband_eq_file_analyze_init,
};
REGISTER_CMD_TARGET(an_Eq) = {//通话上行窄频(8k sr)
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_AEC_NARROWBAND_EQ,
.cmd_deal = phone_eq_parm_analyze,
#endif
.eff_default_parm_init = uplink_narrowband_eq_parm_default_init,
.eff_file_analyze_init = uplink_narrowband_eq_file_analyze_init,
};
#endif
#if (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_FRONT_LR_REAR_LR)
REGISTER_CMD_TARGET(lowpass_p) = {//2.1/2.2声道低通滤波器
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MUSIC_RL_RR_LOW_PASS,
.cmd_deal = low_pass_parm_analyze,
#endif
.eff_default_parm_init = low_pass_parm_default_init,
.eff_file_analyze_init = low_pass_file_analyze_init,
};
REGISTER_CMD_TARGET(music_rl_eq) = {//2.1/2.2声道低频通道eq
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MUSIC_RL_EQ,
.cmd_deal = music_eq_parm_analyze,
#endif
.eff_default_parm_init = rl_eq_parm_default_init,
.eff_file_analyze_init = rl_eq_file_analyze_init,
};
REGISTER_CMD_TARGET(music_rr_eq) = {//RReq
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MUSIC_RR_EQ,
.cmd_deal = music_eq_parm_analyze,
#endif
.eff_default_parm_init = rr_eq_parm_default_init,
.eff_file_analyze_init = rr_eq_file_analyze_init,
};
REGISTER_CMD_TARGET(music_fr_eq) = {//FReq
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MUSIC_FR_EQ,
.cmd_deal = music_eq_parm_analyze,
#endif
.eff_default_parm_init = fr_eq_parm_default_init,
.eff_file_analyze_init = fr_eq_file_analyze_init,
};
#endif
#if defined(LINEIN_MODE_SOLE_EQ_EN) && LINEIN_MODE_SOLE_EQ_EN
REGISTER_CMD_TARGET(linein_eq) = {//linein eq
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_AUX_EQ,
.cmd_deal = music_eq_parm_analyze,
#endif
.eff_default_parm_init = aux_music_eq_parm_default_init,
.eff_file_analyze_init = aux_music_eq_file_analyze_init,
};
REGISTER_CMD_TARGET(linein_drc) = {//linein drc
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_AUX_DRC,
.cmd_deal = music_wdrc_parm_analyze,
#endif
.eff_default_parm_init = aux_music_low_wdrc_parm_default_init,
.eff_file_analyze_init = aux_music_low_wdrc_file_analyze_init,
};
#endif
#if defined(TCFG_DRC_ENABLE) && TCFG_DRC_ENABLE && TCFG_AUDIO_OUT_DRC_ENABLE
REGISTER_CMD_TARGET(music_hbass_drc) = {//high_bass_drc无多带
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MUSIC_HIGH_BASS_DRC,
.cmd_deal = high_bass_wdrc_parm_analyze,
#endif
.eff_default_parm_init = high_bass_wdrc_parm_default_init,
.eff_file_analyze_init = high_bass_wdrc_file_analyze_init,
};
#endif
#if defined(TCFG_MIC_EFFECT_ENABLE) && TCFG_MIC_EFFECT_ENABLE
REGISTER_CMD_TARGET(mic_voice_changer) = {
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MIC_VOICE_CHANGER,
.cmd_deal = mic_voice_changer_parm_ananlyze,
#endif
.eff_default_parm_init = mic_voice_changer_parm_default_init,
.eff_file_analyze_init = mic_voice_changer_file_analyze_init,
};
REGISTER_CMD_TARGET(mic_mix_gain) = {
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MIC_MIX_GAIN,
.cmd_deal = mic_mix_gain_parm_ananlyze,
#endif
.eff_default_parm_init = mix_gain_parm_default_init,
.eff_file_analyze_init = mix_gain_file_analyze_init,
};
#endif
#if AUDIO_VBASS_CONFIG
REGISTER_CMD_TARGET(vbass_h) = {
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MUSIC_VBASS,
.cmd_deal = music_vbass_parm_ananlyze,
#endif
.eff_default_parm_init = music_vbass_parm_default_init,
.eff_file_analyze_init = music_vbass_file_analyze_init,
};
REGISTER_CMD_TARGET(vbass_prev_g) = {
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MUSIC_VBASS_PREV_GAIN,
.cmd_deal = vbass_prev_gain_process_parm_analyze,
#endif
.eff_default_parm_init = vbass_prev_gain_parm_default_init,
.eff_file_analyze_init = vbass_prev_gain_file_analyze_init,
};
#if MUSIC_NOISE_GATE_EN
REGISTER_CMD_TARGET(music_ns_gate) = {
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MUSIC_NOISEGATE,
.cmd_deal = music_noise_gate_parm_analyze,
#endif
.eff_default_parm_init = music_noise_gate_parm_default_init,
.eff_file_analyze_init = music_noise_gate_file_analyze_init,
};
#endif
#endif
#if AUDIO_SURROUND_CONFIG
REGISTER_CMD_TARGET(music_sur) = {
#if TCFG_EFFECT_TOOL_ENABLE
.cmd = EFF_MUSIC_SURRROUND_EFF,
.cmd_deal = music_surround_effect_parm_analyze,
#endif
.eff_default_parm_init = music_surround_effect_parm_default_init,
.eff_file_analyze_init = music_surround_effect_file_analyze_init,
};
#endif
/**
*,10
* */
#if TCFG_EFFECT_TOOL_ENABLE
REGISTER_CMD_TARGET(version) = {
.cmd = EFF_CMD_GETVER,
.cmd_deal = eff_tool_get_version,
};
REGISTER_CMD_TARGET(file_s) = {
.cmd = EFF_CMD_FILE_SIZE,
.cmd_deal = eff_tool_get_cfg_file_size,
};
REGISTER_CMD_TARGET(file_p) = {
.cmd = EFF_CMD_FILE,
.cmd_deal = eff_tool_get_cfg_file_data,
};
REGISTER_CMD_TARGET(change_mode) = {
.cmd = EFF_CMD_CHANGE_MODE,
.cmd_deal = eff_tool_set_channge_mode,
};
REGISTER_CMD_TARGET(inquire) = {
.cmd = EFF_CMD_INQUIRE,
.cmd_deal = eff_tool_set_inquire,
};
REGISTER_CMD_TARGET(resync_begin) = {
.cmd = EFF_CMD_RESYNC_PARM_BEGIN,
.cmd_deal = eff_tool_resync_parm_begin,
};
REGISTER_CMD_TARGET(resync_end) = {
.cmd = EFF_CMD_RESYNC_PARM_END,
.cmd_deal = eff_tool_resync_parm_end,
};
#endif
void eff_default_parm_init()
{
struct cmd_interface *p = NULL;
list_for_each_cmd_interface(p) {
if (p->eff_default_parm_init) {
p->eff_default_parm_init();
}
}
}
void eff_file_parm_init()
{
struct cmd_interface *p = NULL;
list_for_each_cmd_interface(p) {
if (p->eff_file_analyze_init) {
p->eff_file_analyze_init();
}
}
}
/*
*
*path:
* */
void eff_file_switch(u8 *path)
{
//更换效果文件名
memcpy((void *)EFF_CFG_FILE_NAME, (const void *)path, strlen(path));
//重新解析效果文件
eff_file_parm_init();
//设置需要立即更新的框图模块
#if defined(TCFG_EQ_ENABLE) && TCFG_EQ_ENABLE
cur_eq_set_update(AEID_MUSIC_EQ, NULL, 1, 0);//音乐EQ left
cur_eq_right_ch_set_update(AEID_MUSIC_EQ, NULL, 1, 0);//音乐EQ right
cur_eq_set_update(AEID_MUSIC_EXTEQ, NULL, 1, 0);
cur_eq_set_update(AEID_MUSIC_EQ2, NULL, 1, 0);
cur_eq_set_update(AEID_MUSIC_RL_EQ, NULL, 1, 0);
cur_eq_set_update(AEID_HIGH_BASS_EQ, NULL, 1, 0);
cur_eq_set_update(AEID_ESCO_DL_EQ, NULL, 1, 0);//通话eq
cur_eq_set_update(AEID_ESCO_UL_EQ, NULL, 1, 0);//通话eq
#endif
#if defined(TCFG_DRC_ENABLE)&&TCFG_DRC_ENABLE
cur_drc_set_update(AEID_MUSIC_DRC, 0, NULL);//wdrc
cur_drc_set_update(AEID_MUSIC_RL_DRC, 0, NULL);//wdrc
cur_drc_set_update(AEID_HIGH_BASS_DRC, 0, NULL);//wdrc
cur_drc_set_update(AEID_ESCO_DL_DRC, 0, NULL);//通话wdrc
cur_drc_set_update(AEID_ESCO_UL_DRC, 0, NULL);//通话wdrc
#endif
#if TCFG_DYNAMIC_EQ_ENABLE
dynamic_eq_update_parm(AEID_MUSIC_DYNAMIC_EQ, 0);
#endif
#if AUDIO_SURROUND_CONFIG
SurroundEffect_TOOL_SET *parmt = &sur_parm[0];
audio_surround_effect_update_demo(AEID_MUSIC_SURROUND, &parmt->parm, parmt->is_bypass);
#endif
#if defined(LINEIN_MODE_SOLE_EQ_EN) && LINEIN_MODE_SOLE_EQ_EN
#if defined(TCFG_EQ_ENABLE) && TCFG_EQ_ENABLE
cur_eq_set_update(AEID_AUX_EQ, NULL, 1, 0);//音乐EQ left
cur_eq_right_ch_set_update(AEID_AUX_EQ, NULL, 1, 0);//音乐EQ right
cur_eq_set_update(AEID_AUX_EXTEQ, NULL, 1, 0);
cur_eq_set_update(AEID_AUX_EQ2, NULL, 1, 0);
cur_eq_set_update(AEID_AUX_RL_EQ, NULL, 1, 0);
cur_eq_set_update(AEID_AUX_HIGH_BASS_EQ, NULL, 1, 0);
#endif
#if defined(TCFG_DRC_ENABLE)&&TCFG_DRC_ENABLE
cur_drc_set_update(AEID_AUX_DRC, 0, NULL);//wdrc
cur_drc_set_update(AEID_AUX_RL_DRC, 0, NULL);//wdrc
cur_drc_set_update(AEID_AUX_HIGH_BASS_DRC, 0, NULL);//wdrc
#endif
#if TCFG_DYNAMIC_EQ_ENABLE
dynamic_eq_update_parm(AEID_AUX_DYNAMIC_EQ, 1);
#endif
#if AUDIO_SURROUND_CONFIG
parmt = &sur_parm[1];
audio_surround_effect_update_demo(AEID_AUX_SURROUND, &parmt->parm, parmt->is_bypass);
#endif
#endif/*LINEIN_MODE_SOLE_EQ_EN*/
}
int eff_init(void)
{
eff_default_parm_init();
eff_file_parm_init();
#if (TCFG_EQ_ENABLE != 0)
cp_eq_file_seg_to_custom_tab();
#endif
return 0;
}
__initcall(eff_init);
#endif