698 lines
24 KiB
C
698 lines
24 KiB
C
|
||
#include "system/includes.h"
|
||
#include "media/includes.h"
|
||
#include "app_config.h"
|
||
#include "app_online_cfg.h"
|
||
#include "online_db/online_db_deal.h"
|
||
#include "config/config_interface.h"
|
||
#include "application/eq_config.h"
|
||
#include "audio_config.h"
|
||
#include "cfg_tool.h"
|
||
|
||
#ifdef CONFIG_EQ_APP_SEG_ENABLE
|
||
#pragma const_seg( ".eq_app_codec_const")
|
||
#pragma code_seg ( ".eq_app_codec_code" )
|
||
#endif
|
||
const u8 audio_eq_sdk_name[16] = "AC701N";
|
||
#if defined(TCFG_AUDIO_MDRC_ENABLE) && TCFG_AUDIO_MDRC_ENABLE
|
||
const u8 audio_eq_ver[4] = {0, 8, 4, 0};//包含虚拟低音、多带drc、以及辅听耳机音效
|
||
#else
|
||
#if defined(TCFG_AUDIO_HEARING_AID_ENABLE) && TCFG_AUDIO_HEARING_AID_ENABLE
|
||
const u8 audio_eq_ver[4] = {0, 8, 3, 0};
|
||
#else
|
||
const u8 audio_eq_ver[4] = {0, 8, 0, 0};
|
||
#endif
|
||
#endif /*TCFG_AUDIO_HEARING_AID_ENABLE*/
|
||
|
||
#if TCFG_EQ_FILE_SWITCH_EN
|
||
const u8 *eq_file_switch_list[] = {
|
||
(u8 *)SDFILE_RES_ROOT_PATH"eq_cfg_hw.bin",
|
||
(u8 *)SDFILE_RES_ROOT_PATH"eq_cfg_hw1.bin",
|
||
(u8 *)SDFILE_RES_ROOT_PATH"eq_cfg_hw2.bin",
|
||
};
|
||
#endif
|
||
|
||
//eq_cfg_hw.bin中播歌eq曲线,当作用户自定义模式,参与效果切换.
|
||
//通话宽频上下行eq曲线也对应放到phone_eq_tab_normal、ul_eq_tab_normal
|
||
//EQ_FILE_CP_TO_CUSTOM 1使能时,同时板极文件中 TCFG_USE_EQ_FILE 配 0
|
||
#define EQ_FILE_CP_TO_CUSTOM 0
|
||
|
||
|
||
/*************************非用户配置区*************************/
|
||
#if TCFG_EQ_ONLINE_ENABLE
|
||
#undef EQ_FILE_CP_TO_CUSTOM
|
||
#define EQ_FILE_CP_TO_CUSTOM 0
|
||
#endif
|
||
#ifndef TCFG_USER_EQ_MODE_NUM
|
||
#define TCFG_USER_EQ_MODE_NUM 0
|
||
#endif
|
||
#ifndef APP_ONLINE_DEBUG
|
||
#define APP_ONLINE_DEBUG 0
|
||
#endif
|
||
|
||
|
||
#ifndef TCFG_CALL_DL_EQ_SECTION
|
||
#define TCFG_CALL_DL_EQ_SECTION 3
|
||
#endif
|
||
#ifndef TCFG_CALL_UL_EQ_SECTION
|
||
#define TCFG_CALL_UL_EQ_SECTION 3
|
||
#endif
|
||
/*************************************************************/
|
||
|
||
#if (TCFG_EQ_ENABLE != 0)
|
||
|
||
#if (RCSP_ADV_EN)&&(JL_EARPHONE_APP_EN)&&(TCFG_DRC_ENABLE == 0)
|
||
#define AUDIO_EQ_Q 1.5f
|
||
#else
|
||
#define AUDIO_EQ_Q 0.7f
|
||
#endif
|
||
|
||
|
||
#if !TCFG_USE_EQ_FILE
|
||
const struct eq_seg_info eq_tab_normal[] = {
|
||
#if TCFG_USER_EQ_MODE_NUM > 0
|
||
{0, EQ_IIR_TYPE_BAND_PASS, 31, 0, AUDIO_EQ_Q},
|
||
{1, EQ_IIR_TYPE_BAND_PASS, 62, 0, AUDIO_EQ_Q},
|
||
{2, EQ_IIR_TYPE_BAND_PASS, 125, 0, AUDIO_EQ_Q},
|
||
{3, EQ_IIR_TYPE_BAND_PASS, 250, 0, AUDIO_EQ_Q},
|
||
{4, EQ_IIR_TYPE_BAND_PASS, 500, 0, AUDIO_EQ_Q},
|
||
{5, EQ_IIR_TYPE_BAND_PASS, 1000, 0, AUDIO_EQ_Q},
|
||
{6, EQ_IIR_TYPE_BAND_PASS, 2000, 0, AUDIO_EQ_Q},
|
||
{7, EQ_IIR_TYPE_BAND_PASS, 4000, 0, AUDIO_EQ_Q},
|
||
{8, EQ_IIR_TYPE_BAND_PASS, 8000, 0, AUDIO_EQ_Q},
|
||
{9, EQ_IIR_TYPE_BAND_PASS, 16000, 0, AUDIO_EQ_Q},
|
||
|
||
#if (EQ_SECTION_MAX > 10)
|
||
//10段之后频率值设置96k,目的是让10段之后的eq走直通
|
||
{10, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{11, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{12, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{13, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{14, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{15, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{16, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{17, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{18, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{19, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
#endif
|
||
|
||
#endif
|
||
};
|
||
|
||
const struct eq_seg_info eq_tab_rock[] = {
|
||
|
||
#if TCFG_USER_EQ_MODE_NUM > 1
|
||
{0, EQ_IIR_TYPE_BAND_PASS, 31, -2, AUDIO_EQ_Q},
|
||
{1, EQ_IIR_TYPE_BAND_PASS, 62, 0, AUDIO_EQ_Q},
|
||
{2, EQ_IIR_TYPE_BAND_PASS, 125, 2, AUDIO_EQ_Q},
|
||
{3, EQ_IIR_TYPE_BAND_PASS, 250, 4, AUDIO_EQ_Q},
|
||
{4, EQ_IIR_TYPE_BAND_PASS, 500, -2, AUDIO_EQ_Q},
|
||
{5, EQ_IIR_TYPE_BAND_PASS, 1000, -2, AUDIO_EQ_Q},
|
||
{6, EQ_IIR_TYPE_BAND_PASS, 2000, 0, AUDIO_EQ_Q},
|
||
{7, EQ_IIR_TYPE_BAND_PASS, 4000, 0, AUDIO_EQ_Q},
|
||
{8, EQ_IIR_TYPE_BAND_PASS, 8000, 4, AUDIO_EQ_Q},
|
||
{9, EQ_IIR_TYPE_BAND_PASS, 16000, 4, AUDIO_EQ_Q},
|
||
|
||
#if (EQ_SECTION_MAX > 10)
|
||
//10段之后频率值设置96k,目的是让10段之后的eq走直通
|
||
{10, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{11, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{12, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{13, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{14, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{15, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{16, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{17, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{18, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{19, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
#endif
|
||
|
||
#endif
|
||
};
|
||
|
||
const struct eq_seg_info eq_tab_pop[] = {
|
||
|
||
#if TCFG_USER_EQ_MODE_NUM > 2
|
||
{0, EQ_IIR_TYPE_BAND_PASS, 31, 3, AUDIO_EQ_Q},
|
||
{1, EQ_IIR_TYPE_BAND_PASS, 62, 1, AUDIO_EQ_Q},
|
||
{2, EQ_IIR_TYPE_BAND_PASS, 125, 0, AUDIO_EQ_Q},
|
||
{3, EQ_IIR_TYPE_BAND_PASS, 250, -2, AUDIO_EQ_Q},
|
||
{4, EQ_IIR_TYPE_BAND_PASS, 500, -4, AUDIO_EQ_Q},
|
||
{5, EQ_IIR_TYPE_BAND_PASS, 1000, -4, AUDIO_EQ_Q},
|
||
{6, EQ_IIR_TYPE_BAND_PASS, 2000, -2, AUDIO_EQ_Q},
|
||
{7, EQ_IIR_TYPE_BAND_PASS, 4000, 0, AUDIO_EQ_Q},
|
||
{8, EQ_IIR_TYPE_BAND_PASS, 8000, 1, AUDIO_EQ_Q},
|
||
{9, EQ_IIR_TYPE_BAND_PASS, 16000, 2, AUDIO_EQ_Q},
|
||
|
||
#if (EQ_SECTION_MAX > 10)
|
||
//10段之后频率值设置96k,目的是让10段之后的eq走直通
|
||
{10, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{11, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{12, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{13, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{14, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{15, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{16, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{17, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{18, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{19, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
#endif
|
||
|
||
#endif
|
||
};
|
||
|
||
const struct eq_seg_info eq_tab_classic[] = {
|
||
|
||
#if TCFG_USER_EQ_MODE_NUM > 3
|
||
{0, EQ_IIR_TYPE_BAND_PASS, 31, 0, AUDIO_EQ_Q},
|
||
{1, EQ_IIR_TYPE_BAND_PASS, 62, 8, AUDIO_EQ_Q},
|
||
{2, EQ_IIR_TYPE_BAND_PASS, 125, 8, AUDIO_EQ_Q},
|
||
{3, EQ_IIR_TYPE_BAND_PASS, 250, 4, AUDIO_EQ_Q},
|
||
{4, EQ_IIR_TYPE_BAND_PASS, 500, 0, AUDIO_EQ_Q},
|
||
{5, EQ_IIR_TYPE_BAND_PASS, 1000, 0, AUDIO_EQ_Q},
|
||
{6, EQ_IIR_TYPE_BAND_PASS, 2000, 0, AUDIO_EQ_Q},
|
||
{7, EQ_IIR_TYPE_BAND_PASS, 4000, 0, AUDIO_EQ_Q},
|
||
{8, EQ_IIR_TYPE_BAND_PASS, 8000, 2, AUDIO_EQ_Q},
|
||
{9, EQ_IIR_TYPE_BAND_PASS, 16000, 2, AUDIO_EQ_Q},
|
||
|
||
#if (EQ_SECTION_MAX > 10)
|
||
//10段之后频率值设置96k,目的是让10段之后的eq走直通
|
||
{10, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{11, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{12, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{13, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{14, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{15, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{16, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{17, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{18, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{19, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
#endif
|
||
|
||
#endif
|
||
};
|
||
|
||
const struct eq_seg_info eq_tab_country[] = {
|
||
#if TCFG_USER_EQ_MODE_NUM > 5
|
||
{0, EQ_IIR_TYPE_BAND_PASS, 31, -2, AUDIO_EQ_Q},
|
||
{1, EQ_IIR_TYPE_BAND_PASS, 62, 0, AUDIO_EQ_Q},
|
||
{2, EQ_IIR_TYPE_BAND_PASS, 125, 0, AUDIO_EQ_Q},
|
||
{3, EQ_IIR_TYPE_BAND_PASS, 250, 2, AUDIO_EQ_Q},
|
||
{4, EQ_IIR_TYPE_BAND_PASS, 500, 2, AUDIO_EQ_Q},
|
||
{5, EQ_IIR_TYPE_BAND_PASS, 1000, 0, AUDIO_EQ_Q},
|
||
{6, EQ_IIR_TYPE_BAND_PASS, 2000, 0, AUDIO_EQ_Q},
|
||
{7, EQ_IIR_TYPE_BAND_PASS, 4000, 0, AUDIO_EQ_Q},
|
||
{8, EQ_IIR_TYPE_BAND_PASS, 8000, 4, AUDIO_EQ_Q},
|
||
{9, EQ_IIR_TYPE_BAND_PASS, 16000, 4, AUDIO_EQ_Q},
|
||
|
||
#if (EQ_SECTION_MAX > 10)
|
||
//10段之后频率值设置96k,目的是让10段之后的eq走直通
|
||
{10, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{11, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{12, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{13, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{14, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{15, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{16, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{17, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{18, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{19, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
#endif
|
||
#endif
|
||
};
|
||
|
||
const struct eq_seg_info eq_tab_jazz[] = {
|
||
#if TCFG_USER_EQ_MODE_NUM > 4
|
||
{0, EQ_IIR_TYPE_BAND_PASS, 31, 0, AUDIO_EQ_Q},
|
||
{1, EQ_IIR_TYPE_BAND_PASS, 62, 0, AUDIO_EQ_Q},
|
||
{2, EQ_IIR_TYPE_BAND_PASS, 125, 0, AUDIO_EQ_Q},
|
||
{3, EQ_IIR_TYPE_BAND_PASS, 250, 4, AUDIO_EQ_Q},
|
||
{4, EQ_IIR_TYPE_BAND_PASS, 500, 4, AUDIO_EQ_Q},
|
||
{5, EQ_IIR_TYPE_BAND_PASS, 1000, 4, AUDIO_EQ_Q},
|
||
{6, EQ_IIR_TYPE_BAND_PASS, 2000, 0, AUDIO_EQ_Q},
|
||
{7, EQ_IIR_TYPE_BAND_PASS, 4000, 2, AUDIO_EQ_Q},
|
||
{8, EQ_IIR_TYPE_BAND_PASS, 8000, 3, AUDIO_EQ_Q},
|
||
{9, EQ_IIR_TYPE_BAND_PASS, 16000, 4, AUDIO_EQ_Q},
|
||
|
||
#if (EQ_SECTION_MAX > 10)
|
||
//10段之后频率值设置96k,目的是让10段之后的eq走直通
|
||
{10, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{11, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{12, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{13, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{14, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{15, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{16, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{17, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{18, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{19, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
#endif
|
||
#endif
|
||
|
||
};
|
||
struct eq_seg_info eq_tab_custom[] = {
|
||
#if TCFG_USER_EQ_MODE_NUM > 6
|
||
{0, EQ_IIR_TYPE_BAND_PASS, 31, 0, AUDIO_EQ_Q},
|
||
{1, EQ_IIR_TYPE_BAND_PASS, 62, 0, AUDIO_EQ_Q},
|
||
{2, EQ_IIR_TYPE_BAND_PASS, 125, 0, AUDIO_EQ_Q},
|
||
{3, EQ_IIR_TYPE_BAND_PASS, 250, 0, AUDIO_EQ_Q},
|
||
{4, EQ_IIR_TYPE_BAND_PASS, 500, 0, AUDIO_EQ_Q},
|
||
{5, EQ_IIR_TYPE_BAND_PASS, 1000, 0, AUDIO_EQ_Q},
|
||
{6, EQ_IIR_TYPE_BAND_PASS, 2000, 0, AUDIO_EQ_Q},
|
||
{7, EQ_IIR_TYPE_BAND_PASS, 4000, 0, AUDIO_EQ_Q},
|
||
{8, EQ_IIR_TYPE_BAND_PASS, 8000, 0, AUDIO_EQ_Q},
|
||
{9, EQ_IIR_TYPE_BAND_PASS, 16000, 0, AUDIO_EQ_Q},
|
||
|
||
#if (EQ_SECTION_MAX > 10)
|
||
//10段之后频率值设置96k,目的是让10段之后的eq走直通
|
||
{10, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{11, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{12, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{13, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{14, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{15, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{16, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{17, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{18, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
{19, EQ_IIR_TYPE_BAND_PASS, 96000, 0, AUDIO_EQ_Q},
|
||
#endif
|
||
|
||
#endif
|
||
};
|
||
|
||
|
||
const EQ_CFG_SEG *eq_type_tab[EQ_MODE_MAX] = {
|
||
eq_tab_normal, eq_tab_rock, eq_tab_pop, eq_tab_classic, eq_tab_jazz, eq_tab_country, eq_tab_custom
|
||
};
|
||
// 默认系数表,每个表对应的总增益,用户可修改
|
||
float type_gain_tab[EQ_MODE_MAX] = {0, 0, 0, 0, 0, 0, 0};
|
||
#endif
|
||
|
||
__attribute__((weak)) u32 get_eq_mode_tab(void)
|
||
{
|
||
#if !TCFG_USE_EQ_FILE
|
||
return (u32)eq_type_tab;
|
||
#else
|
||
return 0;
|
||
#endif
|
||
}
|
||
|
||
__attribute__((weak)) u8 get_eq_mode_max(void)
|
||
{
|
||
return EQ_MODE_MAX;
|
||
}
|
||
|
||
#if (EQ_SECTION_MAX==9)
|
||
static const u8 eq_mode_use_idx[] = {
|
||
0, 1, 2, 3, 4, 5, /*6,*/ 7, 8, 9
|
||
};
|
||
#elif (EQ_SECTION_MAX==8)
|
||
static const u8 eq_mode_use_idx[] = {
|
||
0, /*1,*/ 2, 3, 4, 5, 6, 7, /*8,*/ 9
|
||
};
|
||
#elif (EQ_SECTION_MAX==7)
|
||
static const u8 eq_mode_use_idx[] = {
|
||
0, /*1,*/ 2, 3, 4, 5, /*6,*/ 7, /*8,*/ 9
|
||
};
|
||
#elif (EQ_SECTION_MAX==6)
|
||
static const u8 eq_mode_use_idx[] = {
|
||
0, /*1,*/ 2, 3, 4, /*5,*/ /*6,*/ 7, /*8,*/ 9
|
||
};
|
||
#elif (EQ_SECTION_MAX==5)
|
||
static const u8 eq_mode_use_idx[] = {
|
||
/*0,*/ 1, /*2,*/ 3, /*4,*/ 5, /*6,*/ 7, /*8,*/ 9
|
||
};
|
||
#else
|
||
static const u8 eq_mode_use_idx[] = {
|
||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
|
||
};
|
||
#endif
|
||
/*
|
||
*通话下行eq系数表
|
||
* */
|
||
#if TCFG_EQ_ENABLE && TCFG_PHONE_EQ_ENABLE
|
||
#if EQ_FILE_CP_TO_CUSTOM
|
||
struct eq_seg_info phone_eq_tab_normal[] = {
|
||
#else
|
||
const struct eq_seg_info phone_eq_tab_normal[] = {
|
||
#endif
|
||
{0, EQ_IIR_TYPE_HIGH_PASS, 200, 0, 0.7f},
|
||
{1, EQ_IIR_TYPE_BAND_PASS, 300, 0, 0.7f},
|
||
{2, EQ_IIR_TYPE_BAND_PASS, 400, 0, 0.7f},
|
||
#if TCFG_CALL_DL_EQ_SECTION > 3
|
||
{3, EQ_IIR_TYPE_BAND_PASS, 400, 0, 0.7f},
|
||
{4, EQ_IIR_TYPE_BAND_PASS, 400, 0, 0.7f},
|
||
{5, EQ_IIR_TYPE_BAND_PASS, 400, 0, 0.7f},
|
||
{6, EQ_IIR_TYPE_BAND_PASS, 400, 0, 0.7f},
|
||
{7, EQ_IIR_TYPE_BAND_PASS, 400, 0, 0.7f},
|
||
{8, EQ_IIR_TYPE_BAND_PASS, 400, 0, 0.7f},
|
||
{9, EQ_IIR_TYPE_BAND_PASS, 400, 0, 0.7f},
|
||
#endif
|
||
};
|
||
#endif
|
||
|
||
/*
|
||
*通话上行eq系数表
|
||
* */
|
||
#if EQ_FILE_CP_TO_CUSTOM
|
||
struct eq_seg_info ul_eq_tab_normal[] = {
|
||
#else
|
||
const struct eq_seg_info ul_eq_tab_normal[] = {
|
||
#endif
|
||
{0, EQ_IIR_TYPE_HIGH_PASS, 200, 0, 0.7f},
|
||
{1, EQ_IIR_TYPE_BAND_PASS, 300, 0, 0.7f},
|
||
{2, EQ_IIR_TYPE_BAND_PASS, 400, 0, 0.7f},
|
||
#if TCFG_CALL_UL_EQ_SECTION > 3
|
||
{3, EQ_IIR_TYPE_BAND_PASS, 400, 0, 0.7f},
|
||
{4, EQ_IIR_TYPE_BAND_PASS, 400, 0, 0.7f},
|
||
{5, EQ_IIR_TYPE_BAND_PASS, 400, 0, 0.7f},
|
||
{6, EQ_IIR_TYPE_BAND_PASS, 400, 0, 0.7f},
|
||
{7, EQ_IIR_TYPE_BAND_PASS, 400, 0, 0.7f},
|
||
{8, EQ_IIR_TYPE_BAND_PASS, 400, 0, 0.7f},
|
||
{9, EQ_IIR_TYPE_BAND_PASS, 400, 0, 0.7f},
|
||
#endif
|
||
|
||
};
|
||
|
||
|
||
|
||
#define SONG_SECTION EQ_SECTION_MAX
|
||
#define CALL_SECTION TCFG_CALL_DL_EQ_SECTION//下行段数,小于等于SONG_SECTION
|
||
#define UL_SECTION TCFG_CALL_UL_EQ_SECTION//上行段数,小于等于SONG_SECTION
|
||
/*
|
||
*下行的宽频和窄频段数需一致,上行的宽频和窄频段数需要一致
|
||
*表的每一项顺序不可修改
|
||
* */
|
||
eq_tool_cfg eq_tool_tab[] = {
|
||
{call_eq_mode, (u8 *)"通话宽频下行EQ", 0x3001, CALL_SECTION, 1, {EQ_ONLINE_CMD_CALL_EQ_V1_SEG, 0}},
|
||
{call_narrow_eq_mode, (u8 *)"通话窄频下行EQ", 0x3002, CALL_SECTION, 1, {EQ_ONLINE_CMD_CALL_EQ_V1_SEG, 0}},
|
||
{aec_eq_mode, (u8 *)"通话宽频上行EQ", 0x3003, UL_SECTION, 1, {EQ_ONLINE_CMD_AEC_EQ_V1_SEG, 0}},
|
||
{aec_narrow_eq_mode, (u8 *)"通话窄频上行EQ", 0x3004, UL_SECTION, 1, {EQ_ONLINE_CMD_AEC_EQ_V1_SEG, 0}},
|
||
#if defined(TCFG_AUDIO_MDRC_ENABLE) && TCFG_AUDIO_MDRC_ENABLE
|
||
{song_eq_mode, (u8 *)"普通音频EQ", 0x3000, SONG_SECTION, 3, {EQ_ONLINE_CMD_SONG_EQ_V1_SEG, EQ_ONLINE_CMD_SONG_MULTI_WDRC, EQ_ONLINE_CMD_VIRTUAL_BASS}},//多带wdrc
|
||
{hearing_aid_mode, (u8 *)"辅听EQ", 0x3005, SONG_SECTION, 2, {EQ_ONLINE_CMD_HEARING_AID_EQ_SEG, EQ_ONLINE_CMD_SONG_WDRC}},
|
||
{hearing_aid_mode2, (u8 *)"辅听EQ2", 0x3006, SONG_SECTION, 1, {EQ_ONLINE_CMD_HEARING_AID_EQ_SEG2}},
|
||
#else
|
||
{song_eq_mode, (u8 *)"普通音频EQ", 0x3000, SONG_SECTION, 3, { EQ_ONLINE_CMD_SONG_EQ_V1_SEG, EQ_ONLINE_CMD_SONG_DRC, EQ_ONLINE_CMD_VIRTUAL_BASS}},
|
||
#if defined(TCFG_AUDIO_HEARING_AID_ENABLE) && TCFG_AUDIO_HEARING_AID_ENABLE
|
||
{hearing_aid_mode, (u8 *)"辅听EQ", 0x3005, SONG_SECTION, 2, {EQ_ONLINE_CMD_HEARING_AID_EQ_SEG, EQ_ONLINE_CMD_SONG_WDRC}},
|
||
{hearing_aid_mode2, (u8 *)"辅听EQ2", 0x3006, SONG_SECTION, 1, {EQ_ONLINE_CMD_HEARING_AID_EQ_SEG2}},
|
||
#endif /*TCFG_AUDIO_HEARING_AID_ENABLE*/
|
||
#endif
|
||
};
|
||
|
||
/*----------------------------------------------------------------------------*/
|
||
/**@brief eq 段数更新,需要在eq_init前就准备好
|
||
@param mode:call_eq_mode\call_narrow_eq_section等模式
|
||
@param section:段数最大为EQ_SECTION_MAX
|
||
@return
|
||
@note 下行的宽频和窄频段数需一致,上行的宽频和窄频段数需要一致
|
||
*/
|
||
/*----------------------------------------------------------------------------*/
|
||
void set_eq_tool_tab_section(u8 mode, u8 section)
|
||
{
|
||
for (int i = 0; i < ARRAY_SIZE(eq_tool_tab); i++) {
|
||
if (mode == eq_tool_tab[i].mode_index) {
|
||
eq_tool_tab[i].section = section;
|
||
}
|
||
}
|
||
}
|
||
|
||
void eq_section_num_set(u8 song, u8 call_16k_8k, u8 aec_16k_8k)
|
||
{
|
||
set_eq_tool_tab_section(song_eq_mode, song);
|
||
set_eq_tool_tab_section(call_eq_mode, call_16k_8k);
|
||
set_eq_tool_tab_section(call_narrow_eq_mode, call_16k_8k);
|
||
set_eq_tool_tab_section(aec_eq_mode, aec_16k_8k);
|
||
set_eq_tool_tab_section(aec_narrow_eq_mode, aec_16k_8k);
|
||
}
|
||
void drc_default_init(EQ_CFG *eq_cfg, u8 mode)
|
||
{
|
||
#if TCFG_DRC_ENABLE
|
||
int i = mode;
|
||
if (eq_cfg && eq_cfg->drc) {
|
||
//限幅器的初始值
|
||
int th = 0;//db -60db~0db
|
||
int threshold = roundf(powf(10.0f, th / 20.0f) * 32768); // 0db:32768, -60db:33
|
||
eq_cfg->cfg_parm[i].drc_parm.parm.drc.nband = 1;
|
||
eq_cfg->cfg_parm[i].drc_parm.parm.drc.type = 1;
|
||
eq_cfg->cfg_parm[i].drc_parm.parm.drc._p.limiter[0].attacktime = 5;
|
||
eq_cfg->cfg_parm[i].drc_parm.parm.drc._p.limiter[0].releasetime = 500;
|
||
eq_cfg->cfg_parm[i].drc_parm.parm.drc._p.limiter[0].threshold[0] = threshold;
|
||
eq_cfg->cfg_parm[i].drc_parm.parm.drc._p.limiter[0].threshold[1] = 32768;
|
||
}
|
||
#endif
|
||
|
||
}
|
||
#if EQ_FILE_CP_TO_CUSTOM
|
||
//eq_cfg_hw.bin中播歌eq曲线,当作用户自定义模式,参与效果切换.
|
||
//通话宽频上下行eq曲线也对应放到phone_eq_tab_normal、ul_eq_tab_normal
|
||
//EQ_FILE_CP_TO_CUSTOM 1使能时,同时板极文件中 TCFG_USE_EQ_FILE 配 0
|
||
static void eq_file_cp_to_custon_mode_fun(EQ_CFG *eq_cfg)
|
||
{
|
||
if (eq_cfg->eq_type == EQ_TYPE_FILE) {
|
||
eq_cfg->eq_type = EQ_TYPE_MODE_TAB;
|
||
for (int i = 0; i < eq_cfg->mode_num; i++) {
|
||
if ((i == song_eq_mode) || (i == call_eq_mode) || (i == aec_eq_mode)) { //播歌eq 通话宽频上下行eq
|
||
u32 seg_num = eq_cfg->cfg_parm[i].song_eq_parm.parm.par.seg_num;
|
||
u8 index = 0;
|
||
for (int j = 0; j < ARRAY_SIZE(eq_tool_tab); j++) {
|
||
if (i == eq_tool_tab[j].mode_index) {
|
||
index = j;
|
||
}
|
||
}
|
||
if (seg_num > eq_tool_tab[index].section) {
|
||
seg_num = eq_tool_tab[index].section;
|
||
}
|
||
void *tar = NULL;
|
||
if (i == call_eq_mode) {
|
||
#if TCFG_PHONE_EQ_ENABLE
|
||
tar = eq_cfg->phone_eq_tab;
|
||
#endif
|
||
} else if (i == aec_eq_mode) {
|
||
tar = eq_cfg->ul_eq_tab;
|
||
} else if (i == song_eq_mode) {
|
||
tar = eq_tab_custom;
|
||
eq_cfg->type_gain_tab[EQ_MODE_MAX - 1] = eq_cfg->cfg_parm[i].song_eq_parm.parm.par.global_gain;
|
||
}
|
||
if (tar) {
|
||
memcpy(tar, eq_cfg->cfg_parm[i].song_eq_parm.parm.seg, seg_num * sizeof(EQ_CFG_SEG));
|
||
eq_cfg->seg_num[i] = seg_num;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
#endif
|
||
|
||
__attribute__((weak))
|
||
s16 get_ci_tx_size()
|
||
{
|
||
return 0x30;
|
||
}
|
||
/*----------------------------------------------------------------------------*/
|
||
static u8 reply_to_tool = 0;
|
||
static u8 reply_sq = 0;
|
||
/*
|
||
*新调音回调
|
||
* */
|
||
static void eq_online_callback_new_protocol(uint8_t *packet, uint16_t size)
|
||
{
|
||
u8 *ptr = packet;
|
||
reply_sq = ptr[1];
|
||
reply_to_tool = 0;
|
||
u8 *new_packet = (void *)&packet[2];
|
||
eq_online_callback(new_packet, size);
|
||
}
|
||
//新调音注册
|
||
REGISTER_DETECT_TARGET(eq_adj_target) = {
|
||
.id = EQ_CONFIG_ID,
|
||
.tool_message_deal = eq_online_callback_new_protocol,
|
||
};
|
||
|
||
|
||
/*
|
||
/*----------------------------------------------------------------------------*/
|
||
int ci_send_cmd(void *priv, u32 id, u8 *packet, int size)
|
||
{
|
||
EQ_CFG *eq_cfg = (EQ_CFG *)priv;
|
||
if (!eq_cfg) {
|
||
return 0;
|
||
}
|
||
#if TCFG_ONLINE_ENABLE
|
||
#if defined(TCFG_EFFECT_TOOL_ENABLE) && TCFG_EFFECT_TOOL_ENABLE
|
||
all_assemble_package_send_to_pc(reply_to_tool, reply_sq, packet, size);
|
||
#else
|
||
ci_send_packet(id, packet, size);
|
||
#endif
|
||
#endif
|
||
return 0;
|
||
}
|
||
struct virtual_bass_tool_set vbass_default_param = {
|
||
.prev_gain = -3, //dB预处理,降低数据增益,防止虚拟低音把数据调爆
|
||
.parm = {
|
||
.ratio = 10, //比率(0~100),越大,低音强度越大
|
||
.boost = 1, //(低音自动增强0, 1)
|
||
.fc = 100, //截止频率(30~300Hz)
|
||
},
|
||
};
|
||
|
||
struct virtual_bass_tool_set *get_vbass_parm()
|
||
{
|
||
EQ_CFG *eq_cfg = get_eq_cfg_hdl();
|
||
if (!eq_cfg) {
|
||
return NULL;
|
||
}
|
||
#if defined(TCFG_EFFECT_TOOL_ENABLE) && TCFG_EFFECT_TOOL_ENABLE
|
||
return &eq_cfg->cfg_parm[song_eq_mode].vbass_parm.parm;
|
||
#else
|
||
if (eq_cfg->vbass_file) {
|
||
return &eq_cfg->cfg_parm[song_eq_mode].vbass_parm.parm;
|
||
} else {
|
||
return &vbass_default_param;
|
||
}
|
||
#endif
|
||
}
|
||
|
||
|
||
int eq_init(void)
|
||
{
|
||
eq_adjust_parm parm = {0};
|
||
#if TCFG_EQ_ONLINE_ENABLE
|
||
parm.online_en = 1;
|
||
#endif
|
||
if (config_filter_coeff_fade_en) {
|
||
parm.fade_en = 1;
|
||
}
|
||
|
||
#if TCFG_USE_EQ_FILE
|
||
parm.file_en = 1;
|
||
#endif
|
||
|
||
#if EQ_FILE_CP_TO_CUSTOM
|
||
parm.file_en = 1;
|
||
parm.type_gain_tab = type_gain_tab;
|
||
#endif
|
||
|
||
#if TCFG_DRC_ENABLE
|
||
parm.drc = 1;
|
||
#endif
|
||
|
||
#if TCFG_USER_TWS_ENABLE
|
||
parm.tws = 1;
|
||
#endif
|
||
|
||
|
||
#if (RCSP_ADV_EN)&&(JL_EARPHONE_APP_EN)&&(TCFG_DRC_ENABLE == 0)
|
||
/* parm.limit_zero = 1; */
|
||
#endif
|
||
|
||
/* #if TCFG_EQ_DIVIDE_ENABLE */
|
||
/* parm.stero = 1; */
|
||
/* parm.mode_num = 8; */
|
||
/* #endif */
|
||
|
||
if (!parm.stero) {
|
||
#if defined(TCFG_AUDIO_MDRC_ENABLE) && TCFG_AUDIO_MDRC_ENABLE
|
||
parm.mode_num = 7;//一共有多少个模式
|
||
#else
|
||
#if defined(TCFG_AUDIO_HEARING_AID_ENABLE) && TCFG_AUDIO_HEARING_AID_ENABLE
|
||
parm.mode_num = 7;// 一共有多少个模式
|
||
#else
|
||
parm.mode_num = 5;// 一共有多少个模式
|
||
#endif
|
||
#endif /*TCFG_AUDIO_HEARING_AID_ENABLE*/
|
||
/* #ifdef DAC_OUTPUT_FRONT_LR_REAR_LR */
|
||
/* #if (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_FRONT_LR_REAR_LR) */
|
||
/* parm.mode_num = 6; */
|
||
/* #endif */
|
||
/* #endif */
|
||
}
|
||
|
||
#if TCFG_PHONE_EQ_ENABLE
|
||
parm.phone_eq_tab = (void *)phone_eq_tab_normal;
|
||
parm.phone_eq_tab_size = TCFG_CALL_DL_EQ_SECTION;//ARRAY_SIZE(phone_eq_tab_normal);
|
||
#endif
|
||
|
||
#if TCFG_AEC_UL_EQ_ENABLE
|
||
parm.ul_eq_tab = (void *)ul_eq_tab_normal;
|
||
parm.ul_eq_tab_size = TCFG_CALL_UL_EQ_SECTION;//ARRAY_SIZE(ul_eq_tab_normal);
|
||
#endif
|
||
|
||
parm.eq_tool_tab = eq_tool_tab;
|
||
parm.eq_mode_use_idx = (u8 *)eq_mode_use_idx;
|
||
|
||
parm.eq_type_tab = (void *)get_eq_mode_tab();
|
||
#if TCFG_USER_EQ_MODE_NUM
|
||
parm.type_num = TCFG_USER_EQ_MODE_NUM;//EQ_MODE_MAX;
|
||
#endif
|
||
|
||
parm.section_max = EQ_SECTION_MAX;
|
||
|
||
EQ_CFG *eq_cfg = eq_cfg_open(&parm);
|
||
if (eq_cfg) {
|
||
eq_cfg->priv = eq_cfg;
|
||
eq_cfg->send_cmd = ci_send_cmd;
|
||
eq_cfg->custom_mode_id = EQ_MODE_CUSTOM;
|
||
#if defined(AUDIO_VBASS_CONFIG)&&AUDIO_VBASS_CONFIG
|
||
eq_cfg->vbass = 1;
|
||
#endif
|
||
#if EQ_FILE_CP_TO_CUSTOM
|
||
eq_file_cp_to_custon_mode_fun(eq_cfg);
|
||
#else
|
||
for (int i = 0; i < eq_cfg->mode_num; i++) {
|
||
if (eq_cfg->eq_type == EQ_TYPE_MODE_TAB) {
|
||
if (!eq_cfg->type_gain_tab) {//没指定总增益时,才配置默认总增益0
|
||
set_global_gain(eq_cfg, i, 0);
|
||
}
|
||
drc_default_init(eq_cfg, i);
|
||
}
|
||
}
|
||
#endif
|
||
}
|
||
|
||
int cpu_section = 0;
|
||
//单声道或者立体声申请的cpu eq mem
|
||
if (EQ_SECTION_MAX > 10) {
|
||
u8 add_num = 0;
|
||
if (hw_crossover_type0) {
|
||
add_num = 4;//drc分频器使用eq硬件加速时、3段4阶使用最大eq段数24段(每段4个eq, 6声道)
|
||
}
|
||
cpu_section = EQ_SECTION_MAX - (int)&EQ_PRIV_SECTION_NUM + add_num;
|
||
}
|
||
audio_eq_init(cpu_section);
|
||
return 0;
|
||
}
|
||
__initcall(eq_init);
|
||
|
||
|
||
#if TCFG_EQ_FILE_SWITCH_EN
|
||
//根据eq_file_switch_list切换到指定的eq文件
|
||
void eq_file_set_by_index(u8 index)
|
||
{
|
||
if (index >= ARRAY_SIZE(eq_file_switch_list)) {
|
||
printf("err, max index %d\n", ARRAY_SIZE(eq_file_switch_list));
|
||
return;
|
||
}
|
||
EQ_CFG *eq_cfg = get_eq_cfg_hdl();
|
||
if (!eq_cfg) {
|
||
return;
|
||
}
|
||
int ret = eq_file_get_cfg(eq_cfg, eq_file_switch_list[index]);
|
||
printf("eq_file_switch : %d, ret : %d", index, ret);
|
||
}
|
||
|
||
//根据eq_file_switch_list成员个数顺序切换eq文件
|
||
void eq_file_switch()
|
||
{
|
||
static u8 index = 0;
|
||
index++;
|
||
if (index >= ARRAY_SIZE(eq_file_switch_list)) {
|
||
index = 0;
|
||
}
|
||
eq_file_set_by_index(index);
|
||
}
|
||
|
||
#endif
|
||
#endif
|