opt eq_design
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -41,12 +41,8 @@ char *g_eq_flash_enable_file = "eq_enable"; // EQ使能开关文件名(独立
|
||||
char *g_eq_flash_name_prefix = "name_"; // 模式名称文件前缀
|
||||
|
||||
// 外部EQ数组声明
|
||||
// 改动原因:进一步优化EQ参数存储策略,所有采样率共用44100Hz数组
|
||||
extern eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS];
|
||||
extern eq_mode_data_t sEQ_data_48000HZ[NUM_EQ_MODES][NUM_EQ_CHANS];
|
||||
extern eq_mode_data_t sEQ_data_88200HZ[NUM_EQ_MODES][NUM_EQ_CHANS];
|
||||
extern eq_mode_data_t sEQ_data_96000HZ[NUM_EQ_MODES][NUM_EQ_CHANS];
|
||||
extern eq_mode_data_t sEQ_data_176400HZ[NUM_EQ_MODES][NUM_EQ_CHANS];
|
||||
extern eq_mode_data_t sEQ_data_192000HZ[NUM_EQ_MODES][NUM_EQ_CHANS];
|
||||
extern void debug_print_eq_mode(eq_mode_data_t *eq_data);
|
||||
extern unsigned int g_eq_sample_rate;
|
||||
|
||||
@@ -93,22 +89,8 @@ static int get_sample_rate_index(uint32_t sample_rate) {
|
||||
* @return EQ数组指针,NULL表示不支持的采样率
|
||||
*/
|
||||
static eq_mode_data_t (*get_eq_array_ptr(uint32_t sample_rate))[NUM_EQ_MODES][NUM_EQ_CHANS] {
|
||||
switch (sample_rate) {
|
||||
case 44100:
|
||||
return &sEQ_data_44100HZ;
|
||||
case 48000:
|
||||
return &sEQ_data_48000HZ;
|
||||
case 88200:
|
||||
return &sEQ_data_88200HZ;
|
||||
case 96000:
|
||||
return &sEQ_data_96000HZ;
|
||||
case 176400:
|
||||
return &sEQ_data_176400HZ;
|
||||
case 192000:
|
||||
return &sEQ_data_192000HZ;
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
// 改动原因:所有采样率共用44100Hz数组
|
||||
return &sEQ_data_44100HZ;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -689,13 +671,15 @@ int eq_save_single_param(uint32_t sample_rate, uint8_t mode, uint8_t channel, ui
|
||||
snprintf(file_path, sizeof(file_path), "%s/mode%d_band%d.bin",
|
||||
g_eq_flash_base_dir, mode, band_index);
|
||||
|
||||
// 获取参数数据
|
||||
eq_mode_data_t (*eq_array)[NUM_EQ_MODES][NUM_EQ_CHANS] = get_eq_array_ptr(sample_rate);
|
||||
// 改动原因:优化EQ参数存储策略,统一参数源为44100Hz
|
||||
// 保存参数时,总是从44100Hz读取参数,确保参数一致性
|
||||
eq_mode_data_t (*eq_array)[NUM_EQ_MODES][NUM_EQ_CHANS] = get_eq_array_ptr(44100);
|
||||
if (!eq_array) {
|
||||
DPRINTF(" Error: Failed to get EQ array for sample rate %u\n", sample_rate);
|
||||
DPRINTF(" Error: Failed to get EQ array for sample rate 44100 (unified source)\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
// 从44100Hz统一参数源读取参数
|
||||
filter_params_t *param = &(*eq_array)[mode][channel].bands[band_index];
|
||||
|
||||
// 创建文件头
|
||||
@@ -718,19 +702,10 @@ int eq_save_single_param(uint32_t sample_rate, uint8_t mode, uint8_t channel, ui
|
||||
|
||||
DPRINTF(" Successfully saved single parameter to %s\n", file_path);
|
||||
|
||||
// 为所有采样率计算并应用系数
|
||||
for (int i = 0; i < EQ_FLASH_MAX_SAMPLE_RATES; i++) {
|
||||
uint32_t fs = supported_sample_rates[i];
|
||||
if (fs != sample_rate) { // 避免重复处理当前采样率
|
||||
eq_mode_data_t (*target_array)[NUM_EQ_MODES][NUM_EQ_CHANS] = get_eq_array_ptr(fs);
|
||||
if (target_array) {
|
||||
// 复制参数到目标采样率
|
||||
(*target_array)[mode][channel].bands[band_index] = *param;
|
||||
// 这里可以添加系数计算逻辑
|
||||
//DPRINTF(" Applied parameter to sample rate %u\n", fs);
|
||||
}
|
||||
}
|
||||
}
|
||||
// 改动原因:优化EQ参数存储策略,参数保存后需要同步到44100Hz并更新所有采样率
|
||||
// 确保44100Hz作为统一参数源,然后通过copy_params_from_44100函数同步到其他采样率
|
||||
// 注意:这里只保存参数,系数会在切换采样率时动态计算
|
||||
// 参数已经保存到Flash,加载时会自动应用到所有采样率
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1797,30 +1772,8 @@ int delete_flash_gain_and_names(uint8_t mode) {
|
||||
void restore_mode_default_params(uint8_t mode, uint32_t sample_rate) {
|
||||
if (mode >= NUM_EQ_MODES) return;
|
||||
|
||||
// 选择对应的EQ数据数组
|
||||
eq_mode_data_t (*eq_array)[NUM_EQ_MODES][NUM_EQ_CHANS] = NULL;
|
||||
switch (sample_rate) {
|
||||
case 44100:
|
||||
eq_array = &sEQ_data_44100HZ;
|
||||
break;
|
||||
case 48000:
|
||||
eq_array = &sEQ_data_48000HZ;
|
||||
break;
|
||||
case 88200:
|
||||
eq_array = &sEQ_data_88200HZ;
|
||||
break;
|
||||
case 96000:
|
||||
eq_array = &sEQ_data_96000HZ;
|
||||
break;
|
||||
case 176400:
|
||||
eq_array = &sEQ_data_176400HZ;
|
||||
break;
|
||||
case 192000:
|
||||
eq_array = &sEQ_data_192000HZ;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
// 改动原因:所有采样率共用44100Hz数组
|
||||
eq_mode_data_t (*eq_array)[NUM_EQ_MODES][NUM_EQ_CHANS] = &sEQ_data_44100HZ;
|
||||
|
||||
if (eq_array == NULL) return;
|
||||
|
||||
@@ -1865,26 +1818,17 @@ void restore_mode_default_params(uint8_t mode, uint32_t sample_rate) {
|
||||
int restore_default_eq_params(uint8_t mode) {
|
||||
DPRINTF("Restoring default EQ params for mode %d\n", mode);
|
||||
|
||||
// 获取所有支持的采样率
|
||||
const uint32_t supported_sample_rates[] = {44100, 48000, 88200, 96000, 176400, 192000};
|
||||
int num_rates = sizeof(supported_sample_rates) / sizeof(supported_sample_rates[0]);
|
||||
|
||||
// 改动原因:所有采样率共用44100Hz数组,只需要恢复44100Hz数组
|
||||
if (mode == 0xFF) {
|
||||
// 恢复所有模式的默认参数
|
||||
DPRINTF(" Restoring all modes to default parameters\n");
|
||||
for (uint8_t m = 0; m < NUM_EQ_MODES; m++) {
|
||||
for (int rate_idx = 0; rate_idx < num_rates; rate_idx++) {
|
||||
uint32_t fs = supported_sample_rates[rate_idx];
|
||||
restore_mode_default_params(m, fs);
|
||||
}
|
||||
restore_mode_default_params(m, 44100); // 恢复44100Hz数组
|
||||
}
|
||||
} else {
|
||||
// 恢复指定模式的默认参数
|
||||
DPRINTF(" Restoring mode %d to default parameters\n", mode);
|
||||
for (int rate_idx = 0; rate_idx < num_rates; rate_idx++) {
|
||||
uint32_t fs = supported_sample_rates[rate_idx];
|
||||
restore_mode_default_params(mode, fs);
|
||||
}
|
||||
restore_mode_default_params(mode, 44100); // 恢复44100Hz数组
|
||||
}
|
||||
|
||||
DPRINTF(" Default parameters restored successfully\n");
|
||||
|
||||
@@ -140,6 +140,36 @@ typedef enum {
|
||||
TEST_CMD = 0xF0,
|
||||
FW_VERSION = 0xF1,
|
||||
FLASH_ID = 0xF2,
|
||||
// EQ命令定义 (0x40-0x5C)
|
||||
SET_EQ_MODE = 0x40, // 切换EQ模式
|
||||
GET_EQ_MODE = 0x41, // 获取当前EQ模式信息
|
||||
SET_MODE_GAIN_AND_NAME = 0x42, // 设置模式整体增益和名称
|
||||
SET_EQ_PARAMS = 0x43, // 发送EQ参数
|
||||
GET_EQ_PARAMS = 0x44, // 读取EQ参数
|
||||
GET_DEVICE_INFO = 0x45, // 获取设备信息
|
||||
RESET_EQ_PARAMS = 0x46, // 复位EQ参数
|
||||
GET_EQ_MODE_COUNT = 0x47, // 获取EQ模式总数
|
||||
SET_AND_SAVE_EQ_MODE = 0x48, // 设置并保存EQ模式
|
||||
SET_VOLUME = 0x49, // 设置音量级别
|
||||
GET_VOLUME = 0x4A, // 获取音量级别
|
||||
GET_LED_INFO = 0x4B, // 获取LED信息
|
||||
SET_LED_SWITCH = 0x4C, // 设置LED开关
|
||||
GET_LED_SWITCH = 0x4D, // 获取LED开关
|
||||
GET_LED_STATUS = 0x4E, // 获取LED状态
|
||||
GET_LED_COUNT = 0x4F, // 获取LED总数
|
||||
GET_UAC_MODE_INFO = 0x50, // 获取UAC模式信息
|
||||
SET_UAC_MODE = 0x51, // 设置UAC模式
|
||||
GET_CURRENT_UAC_MODE = 0x52, // 获取当前UAC模式
|
||||
SET_EQ_ENABLE = 0x53, // 设置EQ使能开关
|
||||
GET_EQ_ENABLE = 0x54, // 获取EQ使能开关
|
||||
GET_SAMPLE_FORMAT = 0x55, // 获取采样率和格式
|
||||
SET_GAIN_MODE = 0x56, // 设置增益模式
|
||||
GET_GAIN_MODE = 0x57, // 获取增益模式
|
||||
SET_FILTER_MODE = 0x58, // 设置滤波器模式
|
||||
GET_FILTER_MODE = 0x59, // 获取滤波器模式
|
||||
SET_GAME_MODE = 0x5A, // 设置游戏模式
|
||||
GET_GAME_MODE = 0x5B, // 获取游戏模式
|
||||
GET_FIRMWARE_VERSION = 0x5C, // 获取固件版本
|
||||
CMD_NONE = 0xFF
|
||||
} UartCmdType;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user