KT24-1110_65E-HA-651B/cpu/br25/audio_effect/effects_adj.c
2024-11-10 18:44:17 +08:00

2303 lines
72 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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,返回值0成功返回小于0失败
* */
#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
/**
*注册个别查询命令解析函数,返回值1成功返回小于0失败
* */
#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