10 Commits

Author SHA1 Message Date
Steven Dan
17ad9324de wait codec config is done 2026-03-26 18:25:22 +08:00
Steven Dan
93a74910bf eq update to 12 band 2026-03-26 17:43:19 +08:00
Steven Dan
fbcd59dfc6 udpate led 2026-03-26 17:43:07 +08:00
Steven Dan
5d6cd95ed9 pop noise fix 2026-03-26 17:42:51 +08:00
Steven Dan
b7e21b5fc7 DEBUG_MEMORY_LOG_ENABLED log 2026-03-26 16:59:49 +08:00
Steven Dan
8a1af892aa sample rate report 2026-03-26 16:55:03 +08:00
Steven Dan
80d3dda19d default settings 2026-03-26 14:58:38 +08:00
Steven Dan
f3d757417c update ex3d settings 2026-03-26 14:29:30 +08:00
Steven Dan
c9235923ed update mode switch 2026-03-26 12:43:22 +08:00
Steven Dan
e7975a9a5c update mic mute and dac mute button 2026-03-26 10:54:13 +08:00
12 changed files with 839 additions and 385 deletions

View File

@@ -31,7 +31,7 @@ XUD_Result_t HidInterfaceClassRequests(
#endif #endif
USB_SetupPacket_t &sp ) USB_SetupPacket_t &sp )
{ {
#if ((USE_EX3D == 1) || (EQ_EN == 1)) #if ((USE_EX3D == 1) || (EQ_EN == 1) || (DEBUG_MEMORY_LOG_ENABLED == 1) )
unsigned datalength; unsigned datalength;
unsigned char buffer[65] = {0}; unsigned char buffer[65] = {0};
#endif #endif
@@ -41,8 +41,10 @@ XUD_Result_t HidInterfaceClassRequests(
case HID_GET_REPORT: case HID_GET_REPORT:
unsigned ret_len = 65; unsigned ret_len = 65;
#if ((USE_EX3D == 1) || (EQ_EN == 1))
buffer[0] = 0x1; buffer[0] = 0x1;
process_read_params(&buffer[1]); process_read_params(&buffer[1]);
#endif
#if DEBUG_MEMORY_LOG_ENABLED #if DEBUG_MEMORY_LOG_ENABLED
ret_len = 65; ret_len = 65;
UserReadHIDLog(&buffer[1]); UserReadHIDLog(&buffer[1]);
@@ -64,7 +66,7 @@ XUD_Result_t HidInterfaceClassRequests(
case HID_GET_PROTOCOL: case HID_GET_PROTOCOL:
/* Do nothing - i.e. STALL */ /* Do nothing - i.e. STALL */
break; break;
#if ((USE_EX3D == 1) || (EQ_EN == 1)) #if ((USE_EX3D == 1) || (EQ_EN == 1))
case HID_SET_REPORT: case HID_SET_REPORT:
result = XUD_GetBuffer(c_ep0_out, (buffer, unsigned char[]), datalength); result = XUD_GetBuffer(c_ep0_out, (buffer, unsigned char[]), datalength);
@@ -97,7 +99,7 @@ XUD_Result_t HidInterfaceClassRequests(
case HID_SET_PROTOCOL: case HID_SET_PROTOCOL:
break; break;
default: default:
break; break;
} }

View File

@@ -79,7 +79,7 @@ LINK_DIRECTORIES(${CMAKE_CURRENT_LIST_DIR}/../../lib_dnr/lib_dnr)
set(APP_COMPILER_FLAGS_f5_music_uac1 ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2 set(APP_COMPILER_FLAGS_f5_music_uac1 ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
-DI2S_CHANS_ADC=2 -DI2S_CHANS_ADC=2
-DAUDIO_CLASS=1 -DAUDIO_CLASS=1
-DMIN_FREQ=48000 -DMIN_FREQ=48000
-DMAX_FREQ=48000 -DMAX_FREQ=48000
-DUAC1_MODE=1 -DUAC1_MODE=1
@@ -138,7 +138,7 @@ set(APP_COMPILER_FLAGS_fact ${SW_USB_FACT_FLAGS} -DI2S_CHANS_DAC=2
set(APP_COMPILER_FLAGS_f1_music_uac2 ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2 set(APP_COMPILER_FLAGS_f1_music_uac2 ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
-DI2S_CHANS_ADC=2 -DI2S_CHANS_ADC=2
-DMIN_FREQ=48000 -DMIN_FREQ=44100
-DMAX_FREQ=192000 -DMAX_FREQ=192000
-DF1_MUSIC_UAC2=1 -DF1_MUSIC_UAC2=1
#-DUSE_EX3D #-DUSE_EX3D
@@ -154,7 +154,7 @@ set(APP_COMPILER_FLAGS_f1_music_uac2 ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC
-DMIN_VOLUME=0xE000 -DMIN_VOLUME=0xE000
-DINPUT_VOLUME_CONTROL=1 -DINPUT_VOLUME_CONTROL=1
-DOUTPUT_VOLUME_CONTROL=1 -DOUTPUT_VOLUME_CONTROL=1
-DDEBUG_MEMORY_LOG_ENABLED=1 #-DDEBUG_MEMORY_LOG_ENABLED=1
-DXUA_DFU_EN=1 -DXUA_DFU_EN=1
#-DIR_SWITCHING_MODE #-DIR_SWITCHING_MODE
-DHID_CONTROLS=1) -DHID_CONTROLS=1)

View File

@@ -110,12 +110,20 @@
/*** Defines relating to audio frequencies ***/ /*** Defines relating to audio frequencies ***/
/* Master clock defines (in Hz) */ /* Master clock defines (in Hz) */
#ifndef MCLK_441 #ifndef MCLK_441
#if defined(F1_MUSIC_UAC2)
#define MCLK_441 (1024*44100) /* 44.1, 88.2 etc */
#else
#define MCLK_441 (256*44100) /* 44.1, 88.2 etc */ #define MCLK_441 (256*44100) /* 44.1, 88.2 etc */
#endif #endif
#endif
#ifndef MCLK_48 #ifndef MCLK_48
#if defined(F1_MUSIC_UAC2)
#define MCLK_48 (1024*48000) /* 48, 96 etc */
#else
#define MCLK_48 (256*48000) /* 48, 96 etc */ #define MCLK_48 (256*48000) /* 48, 96 etc */
#endif #endif
#endif
/* Minumum sample frequency device runs at */ /* Minumum sample frequency device runs at */
#ifndef MIN_FREQ #ifndef MIN_FREQ

View File

@@ -93,11 +93,17 @@ unsigned g_format_delay_time = 0;
unsigned g_mclk_select = 0; unsigned g_mclk_select = 0;
// 改动原因添加LED开关全局变量控制LED是否显示0=关闭1=开启) // 改动原因添加LED开关全局变量控制LED是否显示0=关闭1=开启)
unsigned g_led_enable = 1; // LED开关默认开启 unsigned g_led_enable = 1; // LED开关默认开启
// HID 0xB0 CMD_EXPAND_GAIN到达时由eq.c设置button_task读取后更新footstep LED
// -1 (0xFFFFFFFF) 表示无待处理请求
unsigned g_hid_expand_gain_request = (unsigned)-1;
// HID 0x84 FACTORY_RESET命令到达时由eq.c设置button_task轮询后执行重启
unsigned g_request_factory_reset = 0;
uint32_t get_reference_time(); uint32_t get_reference_time();
unsigned g_disable_i2c = 0; unsigned g_disable_i2c = 0;
unsigned g_dac_mode = 10; unsigned g_dac_mode = 10;
unsigned g_new_dac_mode = 0; unsigned g_new_dac_mode = 0;
unsigned g_samfreq = 48000; unsigned g_samfreq = 48000;
unsafe chanend uc_audiohw; // tile[1] end: AudioHwConfig → button_task (tile[0])
// 改动原因添加DSD模式全局变量用于HID命令读取采样率和格式信息已去掉DAC采样分辨率 // 改动原因添加DSD模式全局变量用于HID命令读取采样率和格式信息已去掉DAC采样分辨率
unsigned g_dsd_mode = 0; // DSD模式0=PCM, >0=DSD unsigned g_dsd_mode = 0; // DSD模式0=PCM, >0=DSD
unsigned g_gain_mode = 0; // 0: 低阻, 1: 高阻 unsigned g_gain_mode = 0; // 0: 低阻, 1: 高阻
@@ -290,7 +296,7 @@ enum {IR_OFF=0, IR_GAME=1, IR_MUSIC=2, IR_MOVIE=3, IR_7_1_GAME=4, IR_7_1_MUSIC=5
#endif #endif
unsigned hidSendData_local[HID_MAX_DATA_BYTES / 4]; unsigned hidSendData_local[HID_MAX_DATA_BYTES / 4];
void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol) void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol, chanend c_audiohw_rx)
{ {
//hwtimer_t timer = hwtimer_alloc(); //hwtimer_t timer = hwtimer_alloc();
unsigned time = 0; unsigned time = 0;
@@ -316,9 +322,10 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
//port_enable(p_button_music_mode); //port_enable(p_button_music_mode);
int codec_adc_pga_gain_reg_value = NAU88L21_PGA_GAIN_REG_DEFAULT_VALUE;// NAU88L21_PGA_GAIN_REG_MAX_VALUE;//0x01;//0x1f; // 出厂默认麦克风21dB (reg=22), 监听-14dB (level=15)
int codec_adc_pga_gain_reg_value = 22; // 21dB
int dac_level = DAC_LEVEL_DEFAULT; int dac_level = 15; // -14dB (DAC_LEVEL_MAX - 14 = 29 - 14 = 15)
// mic endcoder 变量 // mic endcoder 变量
uint8_t prev_encode_input1 = 0; uint8_t prev_encode_input1 = 0;
@@ -341,8 +348,10 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
// active_mode: 0=off, 1=music (LED_MUSIC, no algorithm), // active_mode: 0=off, 1=music (LED_MUSIC, no algorithm),
// 2=game (LED_GAME_MODE, IR_GAME), 3=AI7.1 (LED_AI7_1, IR_7_1_GAME) // 2=game (LED_GAME_MODE, IR_GAME), 3=AI7.1 (LED_AI7_1, IR_7_1_GAME)
unsigned active_mode = 0; unsigned active_mode = 0;
unsigned flag_footsteps_enhancement = 0; // 脚步增强3档状态: 0=关(0dB), 1=中亮/6dB, 2=高亮/12dB出厂默认开启(12dB)
unsigned flag_aidenoise_onoff = 0; unsigned flag_footsteps_enhancement = 2;
// 出厂默认AI降噪开启
unsigned flag_aidenoise_onoff = 1;
// Buttons state // Buttons state
unsigned push_button_music_mode_state_old = 1; // Active low unsigned push_button_music_mode_state_old = 1; // Active low
@@ -379,6 +388,21 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
saved_mode = load_value(path); saved_mode = load_value(path);
debug_printf("Loaded game_mode from flash: %d\n", saved_mode); debug_printf("Loaded game_mode from flash: %d\n", saved_mode);
#if USE_EX3D == 1
// 加载脚步增强状态保存值为expand_gain: 0/6/12
{
unsigned char footstep_path[] = "footstep";
unsigned char saved_footstep = load_value(footstep_path);
if (saved_footstep == 6) flag_footsteps_enhancement = 1;
else if (saved_footstep == 12) flag_footsteps_enhancement = 2;
else if (saved_footstep == 255) {
// 未初始化:出厂默认脚步增强开启(12dB)写入flash
flag_footsteps_enhancement = 2;
save_value(footstep_path, (unsigned char)12);
} else flag_footsteps_enhancement = 0;
debug_printf("Loaded footstep gain from flash: %d, state=%d\n", saved_footstep, flag_footsteps_enhancement);
}
#endif
#if defined(UAC1_MODE) #if defined(UAC1_MODE)
delay_milliseconds(300); delay_milliseconds(300);
@@ -393,15 +417,9 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
debug_printf("Saved game_mode to flash: %d\n", saved_mode); debug_printf("Saved game_mode to flash: %d\n", saved_mode);
} }
#else #else
// if (saved_mode == 255) if (saved_mode == 255) {
{ // 出厂默认AI7.1开启(mode=3)
#if defined(F1_MUSIC_UAC2) saved_mode = 3;
saved_mode = 1; // f1: default music mode
#elif defined(F3_F4_FPS_UAC2)
saved_mode = 3; // f3/f4: default AI7.1 (IR_7_1_GAME)
#else
saved_mode = 0;
#endif
save_value(path, saved_mode); save_value(path, saved_mode);
debug_printf("Saved game_mode to flash: %d\n", saved_mode); debug_printf("Saved game_mode to flash: %d\n", saved_mode);
} }
@@ -432,9 +450,8 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
active_mode = (saved_mode <= 3) ? saved_mode : 0; active_mode = (saved_mode <= 3) ? saved_mode : 0;
{ {
unsigned hid_mode_init = (active_mode >= 2) ? (active_mode - 1) : 0; SET_SHARED_GLOBAL(g_game_mode, active_mode);
SET_SHARED_GLOBAL(g_game_mode, hid_mode_init); debug_printf("active_mode=%d\n", active_mode);
debug_printf("active_mode=%d hid_mode=%d\n", active_mode, hid_mode_init);
} }
@@ -453,7 +470,7 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
} }
} }
debug_printf("HTR3236 LED driver wake success 9\n"); debug_printf("HTR3236 LED driver wake success 9\n");
// 设置PWM频率为22kHz (避免可闻噪声) // 设置PWM频率为22kHz (避免可闻噪声)
//htr3236_set_frequency(i2c, HTR3236_FREQ_22KHZ); //htr3236_set_frequency(i2c, HTR3236_FREQ_22KHZ);
unsafe unsafe
@@ -464,7 +481,7 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
} }
} }
debug_printf("HTR3236 set frequency success 9\n"); debug_printf("HTR3236 set frequency success 9\n");
// 初始化LED控制 // 初始化LED控制
unsafe{led_control_init(&led_ctx, &htr3236_dev, (client interface i2c_master_if)i_i2c_client);} unsafe{led_control_init(&led_ctx, &htr3236_dev, (client interface i2c_master_if)i_i2c_client);}
@@ -489,13 +506,13 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
if(saved_mic >= NAU88L21_PGA_GAIN_REG_MIN_USED_VALUE && saved_mic <= NAU88L21_PGA_GAIN_REG_MAX_VALUE) if(saved_mic >= NAU88L21_PGA_GAIN_REG_MIN_USED_VALUE && saved_mic <= NAU88L21_PGA_GAIN_REG_MAX_VALUE)
codec_adc_pga_gain_reg_value = saved_mic; codec_adc_pga_gain_reg_value = saved_mic;
else else
save_value(mic_vol_path, (unsigned char)codec_adc_pga_gain_reg_value); save_value(mic_vol_path, (unsigned char)codec_adc_pga_gain_reg_value); // 出厂默认22(21dB)
unsigned char saved_dac = load_value(dac_vol_path); unsigned char saved_dac = load_value(dac_vol_path);
if(saved_dac <= DAC_LEVEL_MAX) if(saved_dac <= DAC_LEVEL_MAX)
dac_level = saved_dac; dac_level = saved_dac;
else else
save_value(dac_vol_path, (unsigned char)dac_level); save_value(dac_vol_path, (unsigned char)dac_level); // 出厂默认15(-14dB)
} }
// 同步全局音量变量与从Flash恢复的dac_level / codec_adc_pga_gain_reg_value // 同步全局音量变量与从Flash恢复的dac_level / codec_adc_pga_gain_reg_value
g_volume_level = dac_level; g_volume_level = dac_level;
@@ -551,12 +568,41 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
{ {
unsigned hid_mode_startup = (active_mode >= 2) ? (active_mode - 1) : 0;
cc_mic_level <: 0xFC; cc_mic_level <: 0xFC;
cc_mic_level <: hid_mode_startup; cc_mic_level <: active_mode;
debug_printf("Sent hid_mode %d (active_mode=%d) to hid_button_task\n", hid_mode_startup, active_mode); debug_printf("Sent sound_effect_mode %d to hid_button_task\n", active_mode);
} }
#if USE_EX3D == 1
// 发送初始脚步增强expand_gain到tile1
{
int init_expand = 0;
if (flag_footsteps_enhancement == 1) init_expand = 6;
else if (flag_footsteps_enhancement == 2) init_expand = 12;
cc_mic_level <: 0xFD;
cc_mic_level <: (unsigned)init_expand;
debug_printf("Sent init expand_gain %d to hid_button_task\n", init_expand);
}
// 恢复脚步增强LED初始状态
if (flag_footsteps_enhancement == 1) {
led_on(&led_ctx, LED_FOOTSTEP_MODE);
led_update_all(&led_ctx);
} else if (flag_footsteps_enhancement == 2) {
led_set_brightness(&led_ctx, LED_FOOTSTEP_MODE, 128);
led_update_all(&led_ctx);
}
#endif
// 出厂默认AI降噪开启初始化LED和算法
#if DNR_ENABLE == 1
if (flag_aidenoise_onoff) {
led_on(&led_ctx, LED_ANC);
led_update_all(&led_ctx);
dnr_set_mode(1);
}
#endif
// port_enable(p_ctrl_keys); // port_enable(p_ctrl_keys);
port_ctrl_keys = 0;//port_in(p_ctrl_keys); port_ctrl_keys = 0;//port_in(p_ctrl_keys);
if ((port_ctrl_keys & KEY_MUTE) == 0) { if ((port_ctrl_keys & KEY_MUTE) == 0) {
@@ -683,7 +729,6 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
} }
#if (HID_CONTROLS == 1) #if (HID_CONTROLS == 1)
for (int i=1; i<(HID_MAX_DATA_BYTES/4); i++) { for (int i=1; i<(HID_MAX_DATA_BYTES/4); i++) {
//reportData[i] = chan_in_word(c_hidSendData);
c_hidSendData :> reportData[i]; c_hidSendData :> reportData[i];
} }
hidSetChangePending(1); hidSetChangePending(1);
@@ -691,6 +736,65 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
break; break;
} }
case c_audiohw_rx :> unsigned new_samfreq:
{
// 采样率变化通知来自AudioHwConfig (tile[1])通过uc_audiohw专用通道传递
unsigned new_dsd_mode;
c_audiohw_rx :> new_dsd_mode;
debug_printf("SampRate->tile0: %uHz dsd=%u\n", new_samfreq, new_dsd_mode);
unsafe {
switch (new_samfreq) {
case 192000:
case 176400:
NAU88C22_REGWRITE(0x0003, 0x00D0, (client interface i2c_master_if)i_i2c_client);
NAU88C22_REGWRITE(0x002B, 0x4000, (client interface i2c_master_if)i_i2c_client);
NAU88C22_REGWRITE(0x002C, 0x0082, (client interface i2c_master_if)i_i2c_client);
break;
case 96000:
case 88200:
NAU88C22_REGWRITE(0x0003, 0x0092, (client interface i2c_master_if)i_i2c_client);
NAU88C22_REGWRITE(0x002B, 0x4001, (client interface i2c_master_if)i_i2c_client);
NAU88C22_REGWRITE(0x002C, 0x0082, (client interface i2c_master_if)i_i2c_client);
break;
case 44100:
case 48000:
default:
NAU88C22_REGWRITE(0x0003, 0x0053, (client interface i2c_master_if)i_i2c_client);
NAU88C22_REGWRITE(0x002B, 0x4002, (client interface i2c_master_if)i_i2c_client);
NAU88C22_REGWRITE(0x002C, 0x0082, (client interface i2c_master_if)i_i2c_client);
break;
}
#if 0
unsigned val;
NAU88C22_REGREAD(0x0003, val, (client interface i2c_master_if)i_i2c_client);
debug_printf("NAU88C22_REGREAD(0x0003): 0x%08x\n", val);
NAU88C22_REGREAD(0x002B, val, (client interface i2c_master_if)i_i2c_client);
debug_printf("NAU88C22_REGREAD(0x002B): 0x%08x\n", val);
NAU88C22_REGREAD(0x002C, val, (client interface i2c_master_if)i_i2c_client);
debug_printf("NAU88C22_REGREAD(0x002C): 0x%08x\n", val);
#endif
}
c_audiohw_rx <: 0xff;
#if HID_CONTROLS > 0
g_hid_status_report_data[0] = 0x77;
g_hid_status_report_data[1] = 0x9F;
g_hid_status_report_data[2] = (unsigned char)(new_samfreq & 0xFF);
g_hid_status_report_data[3] = (unsigned char)((new_samfreq >> 8) & 0xFF);
g_hid_status_report_data[4] = (unsigned char)((new_samfreq >> 16) & 0xFF);
g_hid_status_report_data[5] = (unsigned char)((new_samfreq >> 24) & 0xFF);
g_hid_status_report_data[6] = (unsigned char)new_dsd_mode;
for (int i = 7; i < 63; i++)
g_hid_status_report_data[i] = 0x00;
g_hid_status_report_index = 63;
hidSetChangePending(0x1);
#endif
break;
}
case tmr when timerafter(time) :> void : case tmr when timerafter(time) :> void :
{ {
//hwtimer_change_trigger_time(timer, hwtimer_get_time(timer) + KEY_POLLING_INTERVAL); //hwtimer_change_trigger_time(timer, hwtimer_get_time(timer) + KEY_POLLING_INTERVAL);
@@ -714,7 +818,7 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
p_button_music_mode :> button_music_mode; // 1A p_button_music_mode :> button_music_mode; // 1A
p_button_game_mode :> button_game_mode; // 1L p_button_game_mode :> button_game_mode; // 1L
p_button_ai71_onoff :> button_ai71_onoff; // 1M p_button_ai71_onoff :> button_ai71_onoff; // 1M
p_mic_gain_encoder1 :> mic_encoder1; // 4F2 p_mic_gain_encoder1 :> mic_encoder1; // 4F2
p_mic_gain_encoder2 :> mic_encoder2; // 4E2 p_mic_gain_encoder2 :> mic_encoder2; // 4E2
@@ -789,6 +893,38 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
} }
push_button_game_mode_state_old = button_game_mode; push_button_game_mode_state_old = button_game_mode;
// 处理HID SET_SOUND_EFFECT_MODE (0xA4) 请求,等同于按键效果
if (!mode_btn_change && !need_reboot) {
unsigned hid_req_mode;
GET_SHARED_GLOBAL(hid_req_mode, g_request_game_mode);
if (hid_req_mode != (unsigned)-1) {
SET_SHARED_GLOBAL(g_request_game_mode, (unsigned)-1);
unsigned target = (hid_req_mode <= 3) ? hid_req_mode : 0;
#if (F3_F4_FPS_UAC2 == 1)
if (target == 1) {
active_mode = target;
need_reboot = 1;
SetRoleSwitchFlag(MODE_F1_MUSIC_UAC2);
} else {
active_mode = target;
mode_btn_change = 1;
}
#elif (F1_MUSIC_UAC2 == 1)
if (target >= 2) {
active_mode = target;
need_reboot = 1;
SetRoleSwitchFlag(MODE_F3_F4_FPS_UAC2);
} else {
active_mode = target;
mode_btn_change = 1;
}
#else
active_mode = target;
mode_btn_change = 1;
#endif
}
}
if (mode_btn_change || need_reboot) { if (mode_btn_change || need_reboot) {
// Always persist mode to flash so boot chain restores it // Always persist mode to flash so boot chain restores it
{ {
@@ -816,37 +952,90 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
} }
led_update_all(&led_ctx); led_update_all(&led_ctx);
// Always update g_game_mode so 0xA5 reads correctly
SET_SHARED_GLOBAL(g_game_mode, active_mode);
#if USE_EX3D == 1 #if USE_EX3D == 1
{ {
// hid_mode: 0=IR_OFF, 1=IR_GAME, 2=IR_7_1_GAME // sound_effect_mode: 0=无音效, 1=音乐, 2=游戏, 3=AI7.1
unsigned hid_mode = (active_mode >= 2) ? (active_mode - 1) : 0;
SET_SHARED_GLOBAL(g_game_mode, hid_mode);
cc_mic_level <: 0xFC; cc_mic_level <: 0xFC;
cc_mic_level <: hid_mode; cc_mic_level <: active_mode;
debug_printf("Mode changed: active=%d hid=%d\n", active_mode, hid_mode); debug_printf("Mode changed: active_mode=%d\n", active_mode);
} }
#endif #endif
} }
#if USE_EX3D == 1
mode_change = 0; mode_change = 0;
if(button_footsteps_enhancement == 0) if(button_footsteps_enhancement == 0)
{ {
if(push_button_footsteps_enhancement_state_old == 1) if(push_button_footsteps_enhancement_state_old == 1)
{ {
flag_footsteps_enhancement ^= 1; // 3档循环: 0(关/0dB) → 1(中亮/6dB) → 2(高亮/12dB) → 0
flag_footsteps_enhancement = (flag_footsteps_enhancement + 1) % 3;
mode_change = 1; mode_change = 1;
} }
} }
push_button_footsteps_enhancement_state_old = button_footsteps_enhancement; push_button_footsteps_enhancement_state_old = button_footsteps_enhancement;
if(mode_change) if(mode_change)
if(flag_footsteps_enhancement) {
int new_expand_gain;
if(flag_footsteps_enhancement == 0)
{ {
new_expand_gain = 0;
led_off(&led_ctx, LED_FOOTSTEP_MODE);
}
else if(flag_footsteps_enhancement == 1)
{
new_expand_gain = 6;
led_on(&led_ctx, LED_FOOTSTEP_MODE); led_on(&led_ctx, LED_FOOTSTEP_MODE);
} }
else else
{ {
led_off(&led_ctx, LED_FOOTSTEP_MODE); new_expand_gain = 12;
led_set_brightness(&led_ctx, LED_FOOTSTEP_MODE, 128);
} }
led_update_all(&led_ctx);
// 发送expand_gain到tile1执行
cc_mic_level <: 0xFD;
cc_mic_level <: (unsigned)new_expand_gain;
// 掉电保存
unsigned char footstep_path[] = "footstep";
save_value(footstep_path, (unsigned char)new_expand_gain);
debug_printf("Footstep state=%d, expand_gain=%d\n", flag_footsteps_enhancement, new_expand_gain);
}
// HID 0xB0 CMD_EXPAND_GAIN请求同步footstep LED状态
{
unsigned hid_gain_req;
GET_SHARED_GLOBAL(hid_gain_req, g_hid_expand_gain_request);
if (hid_gain_req != (unsigned)-1) {
SET_SHARED_GLOBAL(g_hid_expand_gain_request, (unsigned)-1);
// 将增益值映射到footstep档位
unsigned new_state;
if (hid_gain_req == 0) {
new_state = 0;
} else if (hid_gain_req <= 6) {
new_state = 1;
} else {
new_state = 2;
}
if (new_state != (unsigned)flag_footsteps_enhancement) {
flag_footsteps_enhancement = (int)new_state;
if (flag_footsteps_enhancement == 0) {
led_off(&led_ctx, LED_FOOTSTEP_MODE);
} else if (flag_footsteps_enhancement == 1) {
led_on(&led_ctx, LED_FOOTSTEP_MODE);
} else {
led_set_brightness(&led_ctx, LED_FOOTSTEP_MODE, 128);
}
led_update_all(&led_ctx);
unsigned char fp[] = "footstep";
save_value(fp, (unsigned char)hid_gain_req);
debug_printf("HID set footstep gain=%d, state=%d\n", hid_gain_req, flag_footsteps_enhancement);
}
}
}
#endif
mode_change = 0; mode_change = 0;
if(button_aidenoise_onoff == 0) if(button_aidenoise_onoff == 0)
@@ -874,6 +1063,18 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
//led_update_all(&led_ctx); //led_update_all(&led_ctx);
#endif #endif
// 检查HID 0x84 FACTORY_RESET请求
{
unsigned factory_reset_req;
GET_SHARED_GLOBAL(factory_reset_req, g_request_factory_reset);
if (factory_reset_req) {
SET_SHARED_GLOBAL(g_request_factory_reset, 0);
debug_printf("Factory reset: rebooting...\n");
delay_milliseconds(500);
device_reboot();
while (1);
}
}
mode_change = 0; mode_change = 0;
if(button_mic_mute == 0) if(button_mic_mute == 0)
@@ -888,26 +1089,28 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
if(mode_change) if(mode_change)
if(flag_mic_mute) if(flag_mic_mute)
{ {
mic_volume(0);
g_mic_volume_level = 0;
current_mic_led_pos = mic_gain_to_led[codec_adc_pga_gain_reg_value] - 1; current_mic_led_pos = mic_gain_to_led[codec_adc_pga_gain_reg_value] - 1;
for(int i = 0; i <= current_mic_led_pos; i++) for(int i = 0; i <= current_mic_led_pos; i++)
{ {
if ((i < 15) && (i >= 0)) if ((i < 15) && (i >= 0))
// 点亮L系列当前位置
led_off(&led_ctx, led_l_physical_map[i]); led_off(&led_ctx, led_l_physical_map[i]);
} }
} }
else else
{ {
mic_volume(codec_adc_pga_gain_reg_value);
g_mic_volume_level = (codec_adc_pga_gain_reg_value <= 37) ? codec_adc_pga_gain_reg_value : 37;
current_mic_led_pos = mic_gain_to_led[codec_adc_pga_gain_reg_value] - 1; current_mic_led_pos = mic_gain_to_led[codec_adc_pga_gain_reg_value] - 1;
for(int i = 0; i <= current_mic_led_pos; i++) for(int i = 0; i <= current_mic_led_pos; i++)
{ {
if ((i < 15) && (i >= 0)) if ((i < 15) && (i >= 0))
// 点亮L系列当前位置
led_on(&led_ctx, led_l_physical_map[i]); led_on(&led_ctx, led_l_physical_map[i]);
} }
} }
// mic_gain = 0; // mic_gain = 0;
@@ -936,14 +1139,14 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
uint8_t rotating = (mic_encoder2 & 0b0100) == 0; // 4E2 uint8_t rotating = (mic_encoder2 & 0b0100) == 0; // 4E2
uint8_t encode_input1 = ((mic_encoder1 & 0b0100) != 0); // 4F2 uint8_t encode_input1 = ((mic_encoder1 & 0b0100) != 0); // 4F2
if(rotating) { if(rotating) {
if(!rotation_active) { if(!rotation_active) {
// 旋转开始 // 旋转开始
prev_encode_input1 = encode_input1; prev_encode_input1 = encode_input1;
sample_count = 1; sample_count = 1;
rotation_active = 1; rotation_active = 1;
// 根据上次方向预判 // 根据上次方向预判
if(fast_rotation_mode) { if(fast_rotation_mode) {
// 快速模式只需要2次采样 // 快速模式只需要2次采样
@@ -951,14 +1154,14 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
} }
} else { } else {
sample_count++; sample_count++;
// 动态调整采样次数快速模式用2次普通模式用3次 // 动态调整采样次数快速模式用2次普通模式用3次
uint8_t required_samples = fast_rotation_mode ? 2 : 3; uint8_t required_samples = fast_rotation_mode ? 2 : 3;
if(sample_count >= required_samples) { if(sample_count >= required_samples) {
if(encode_input1 != prev_encode_input1) { if(encode_input1 != prev_encode_input1) {
uint8_t current_dir = encode_input1 ? 1 : 2; uint8_t current_dir = encode_input1 ? 1 : 2;
// 执行音量调节 // 执行音量调节
if(current_dir == 1) { // 顺时针 if(current_dir == 1) { // 顺时针
if((codec_adc_pga_gain_reg_value < NAU88L21_PGA_GAIN_REG_MAX_VALUE) && (flag_mic_mute == 0)) { if((codec_adc_pga_gain_reg_value < NAU88L21_PGA_GAIN_REG_MAX_VALUE) && (flag_mic_mute == 0)) {
@@ -987,9 +1190,9 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
g_mic_volume_level = (codec_adc_pga_gain_reg_value <= 37) ? codec_adc_pga_gain_reg_value : 37; g_mic_volume_level = (codec_adc_pga_gain_reg_value <= 37) ? codec_adc_pga_gain_reg_value : 37;
debug_printf("volume down %d\n", codec_adc_pga_gain_reg_value); debug_printf("volume down %d\n", codec_adc_pga_gain_reg_value);
save_value(mic_vol_path, codec_adc_pga_gain_reg_value); save_value(mic_vol_path, codec_adc_pga_gain_reg_value);
uint8_t new_led_count = mic_gain_to_led[codec_adc_pga_gain_reg_value]; uint8_t new_led_count = mic_gain_to_led[codec_adc_pga_gain_reg_value];
// 如果LED数减少关闭减少的那个LED // 如果LED数减少关闭减少的那个LED
if(new_led_count < old_led_count) { if(new_led_count < old_led_count) {
// 关闭的LED索引 = old_led_count - 1 // 关闭的LED索引 = old_led_count - 1
@@ -998,7 +1201,7 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
} }
} }
} }
// 检测是否快速旋转 // 检测是否快速旋转
if(current_dir == last_valid_direction) { if(current_dir == last_valid_direction) {
consecutive_same_dir++; consecutive_same_dir++;
@@ -1009,7 +1212,7 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
consecutive_same_dir = 0; consecutive_same_dir = 0;
fast_rotation_mode = 0; // 方向变化,退出快速模式 fast_rotation_mode = 0; // 方向变化,退出快速模式
} }
last_valid_direction = current_dir; last_valid_direction = current_dir;
rotation_active = 0; rotation_active = 0;
sample_count = 0; sample_count = 0;
@@ -1035,14 +1238,14 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
uint8_t hp_rotating = ((hp_encoder & 0b00100000) == 0); // 8D5 uint8_t hp_rotating = ((hp_encoder & 0b00100000) == 0); // 8D5
uint8_t hp_encode_input1 = ((hp_encoder & 0b00010000) != 0); // 8D4 uint8_t hp_encode_input1 = ((hp_encoder & 0b00010000) != 0); // 8D4
if(hp_rotating) { if(hp_rotating) {
if(!hp_rotation_active) { if(!hp_rotation_active) {
// 旋转开始 // 旋转开始
hp_prev_encode_input1 = hp_encode_input1; hp_prev_encode_input1 = hp_encode_input1;
hp_sample_count = 1; hp_sample_count = 1;
hp_rotation_active = 1; hp_rotation_active = 1;
// 根据上次方向预判 // 根据上次方向预判
if(hp_fast_rotation_mode) { if(hp_fast_rotation_mode) {
// 快速模式只需要2次采样 // 快速模式只需要2次采样
@@ -1050,14 +1253,14 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
} }
} else { } else {
hp_sample_count++; hp_sample_count++;
// 动态调整采样次数快速模式用2次普通模式用3次 // 动态调整采样次数快速模式用2次普通模式用3次
uint8_t hp_required_samples = hp_fast_rotation_mode ? 2 : 3; uint8_t hp_required_samples = hp_fast_rotation_mode ? 2 : 3;
if(hp_sample_count >= hp_required_samples) { if(hp_sample_count >= hp_required_samples) {
if(hp_encode_input1 != hp_prev_encode_input1) { if(hp_encode_input1 != hp_prev_encode_input1) {
uint8_t hp_current_dir = hp_encode_input1 ? 1 : 2; uint8_t hp_current_dir = hp_encode_input1 ? 1 : 2;
// 执行音量调节 // 执行音量调节
if(hp_current_dir == 1) { // 顺时针 if(hp_current_dir == 1) { // 顺时针
if(dac_level < DAC_LEVEL_MAX && flag_hp_mute == 0) { if(dac_level < DAC_LEVEL_MAX && flag_hp_mute == 0) {
@@ -1101,7 +1304,7 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
} }
} }
} }
// 检测是否快速旋转 // 检测是否快速旋转
if(hp_current_dir == hp_last_valid_direction) { if(hp_current_dir == hp_last_valid_direction) {
hp_consecutive_same_dir++; hp_consecutive_same_dir++;
@@ -1112,7 +1315,7 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
hp_consecutive_same_dir = 0; hp_consecutive_same_dir = 0;
hp_fast_rotation_mode = 0; // 方向变化,退出快速模式 hp_fast_rotation_mode = 0; // 方向变化,退出快速模式
} }
hp_last_valid_direction = hp_current_dir; hp_last_valid_direction = hp_current_dir;
hp_rotation_active = 0; hp_rotation_active = 0;
hp_sample_count = 0; hp_sample_count = 0;
@@ -1147,6 +1350,8 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
if(mode_change) if(mode_change)
if(flag_hp_mute) if(flag_hp_mute)
{ {
unsafe { NAU88C22_REGWRITE(0x0034, 0x0000, (client interface i2c_master_if)i_i2c_client); }
g_volume_level = 0;
current_mic_led_pos = dac_gain_to_led[dac_level] - 1; current_mic_led_pos = dac_gain_to_led[dac_level] - 1;
for(int i = 0; i <= current_mic_led_pos; i++) for(int i = 0; i <= current_mic_led_pos; i++)
{ {
@@ -1156,6 +1361,11 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
} }
else else
{ {
if(dac_level == DAC_LEVEL_MIN)
unsafe { NAU88C22_REGWRITE(0x0034, 0x0000, (client interface i2c_master_if)i_i2c_client); }
else
dac_volume(dac_level - DAC_LEVEL_MAX);
g_volume_level = dac_level;
current_mic_led_pos = dac_gain_to_led[dac_level] - 1; current_mic_led_pos = dac_gain_to_led[dac_level] - 1;
for(int i = 0; i <= current_mic_led_pos; i++) for(int i = 0; i <= current_mic_led_pos; i++)
{ {
@@ -1390,7 +1600,7 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
} }
} }
void AudioHwRemote(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol) void AudioHwRemote(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol, chanend c_audiohw_rx)
{ {
i2c_master_if i2c[1]; i2c_master_if i2c[1];
board_setup(); board_setup();
@@ -1398,7 +1608,7 @@ void AudioHwRemote(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vo
i2c_master(i2c, 1, p_scl, p_sda, 300); i2c_master(i2c, 1, p_scl, p_sda, 300);
{ {
unsafe {i_i2c_client = i2c[0];} unsafe {i_i2c_client = i2c[0];}
button_task(c_hidSendData, cc_mic_level, c_uac_vol); button_task(c_hidSendData, cc_mic_level, c_uac_vol, c_audiohw_rx);
} }
} }
} }
@@ -1421,10 +1631,23 @@ void AudioHwInit()
/* Configures the external audio hardware for the required sample frequency */ /* Configures the external audio hardware for the required sample frequency */
void AudioHwConfig(unsigned samFreq, unsigned mClk, unsigned dsdMode, unsigned sampRes_DAC, unsigned sampRes_ADC) void AudioHwConfig(unsigned samFreq, unsigned mClk, unsigned dsdMode, unsigned sampRes_DAC, unsigned sampRes_ADC)
{ {
static unsigned count = 0;
g_samfreq = samFreq; g_samfreq = samFreq;
{ {
sw_pll_fixed_clock(mClk); sw_pll_fixed_clock(mClk);
} }
p_ctl_mute <: 1; // 通知tile0 (button_task) 采样率已变化用于配置NAU88C22寄存器
} unsafe {uc_audiohw <: samFreq; }
unsafe {uc_audiohw <: dsdMode; }
if (count++ > 0)
{
p_ctl_mute <: 1;
}
else
{
debug_printf("don't unmute at boot\n");
}
unsafe {uc_audiohw :> dsdMode; }
}

View File

@@ -133,6 +133,7 @@ float fLevel[NUM_USB_CHAN_OUT] = {0,};
enum {UBM_A3D_OFF=0, UBM_A3D_VON=1, UBM_A3D_ON=2}; enum {UBM_A3D_OFF=0, UBM_A3D_VON=1, UBM_A3D_ON=2};
extern void buffer_exchange(chanend_t c_data, unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[]); extern void buffer_exchange(chanend_t c_data, unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[]);
extern unsigned int is_eq_disabled(void); extern unsigned int is_eq_disabled(void);
extern unsigned int g_eq_enable;
void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[]) void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[])
{ {
uint32_t is_3d; uint32_t is_3d;
@@ -819,7 +820,7 @@ void update_button(unsigned char b)
extern uint8_t mic_vol; extern uint8_t mic_vol;
//Tile 1 //Tile 1
void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c_hidSendData, chanend_t c_uac_vol) void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c_hidSendData, chanend_t c_uac_vol, chanend_t c_ex3d_hid_cmd)
{ {
#if defined(IR_SWITCHING_MODE) #if defined(IR_SWITCHING_MODE)
static uint32_t is_3d_on = IR_OFF; static uint32_t is_3d_on = IR_OFF;
@@ -851,6 +852,7 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
SELECT_RES( SELECT_RES(
CASE_THEN(cc_mic_level, event_mic_vol) CASE_THEN(cc_mic_level, event_mic_vol)
, CASE_THEN(c_hidRcvData, event_hid) , CASE_THEN(c_hidRcvData, event_hid)
, CASE_THEN(c_ex3d_hid_cmd, event_ex3d_hid)
, CASE_THEN(timer, event_polling) , CASE_THEN(timer, event_polling)
, CASE_THEN(c_uac_vol, event_uac_vol) , CASE_THEN(c_uac_vol, event_uac_vol)
) )
@@ -868,16 +870,28 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
debug_printf("hid_button_task received audio_mode: %d\n", current_mode_local); debug_printf("hid_button_task received audio_mode: %d\n", current_mode_local);
if (current_mode_local == 0) { if (current_mode_local == 0) {
// 关闭算法 // 无音效模式关闭EX3D和EQ算法
audio_ex3d_set_onoff(0); audio_ex3d_set_onoff(0);
g_eq_enable = 0;
#if IR_SWITCHING_MODE #if IR_SWITCHING_MODE
is_3d_on = IR_OFF; is_3d_on = IR_OFF;
#else #else
is_3d_on = A3D_OFF; is_3d_on = A3D_OFF;
#endif #endif
debug_printf("Mode 0: algorithm OFF\n"); debug_printf("Mode 0: EX3D+EQ OFF\n");
} else if (current_mode_local == 1) { } else if (current_mode_local == 1) {
// 游戏模式 (IR_GAME, stereo): SF index 0 // 音乐模式EX3D关闭EQ开启
audio_ex3d_set_onoff(0);
g_eq_enable = 1;
#if IR_SWITCHING_MODE
is_3d_on = IR_OFF;
#else
is_3d_on = A3D_OFF;
#endif
debug_printf("Mode 1: MUSIC, EQ ON, EX3D OFF\n");
} else if (current_mode_local == 2) {
// 游戏模式 (IR_GAME, stereo): SF index 0EQ开启
g_eq_enable = 1;
#if IR_SWITCHING_MODE #if IR_SWITCHING_MODE
audio_ex3d_set_sf(0); // SF 0 = STEREO GAME audio_ex3d_set_sf(0); // SF 0 = STEREO GAME
is_3d_on = IR_GAME; is_3d_on = IR_GAME;
@@ -885,9 +899,10 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
is_3d_on = A3D_ON; is_3d_on = A3D_ON;
#endif #endif
audio_ex3d_set_onoff(1); audio_ex3d_set_onoff(1);
debug_printf("Mode 1: GAME (IR_GAME) ON, sf=0\n"); debug_printf("Mode 2: GAME (IR_GAME) ON, sf=0, EQ ON\n");
} else if (current_mode_local == 2) { } else if (current_mode_local == 3) {
// AI7.1模式 (IR_7_1_GAME, 7.1): SF index 1 // AI7.1模式 (IR_7_1_GAME, 7.1): SF index 1EQ开启
g_eq_enable = 1;
#if IR_SWITCHING_MODE #if IR_SWITCHING_MODE
audio_ex3d_set_sf(1); // SF 1 = SPATIAL GAME (7.1) audio_ex3d_set_sf(1); // SF 1 = SPATIAL GAME (7.1)
is_3d_on = IR_7_1_GAME; is_3d_on = IR_7_1_GAME;
@@ -895,9 +910,17 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
is_3d_on = A3D_ON; is_3d_on = A3D_ON;
#endif #endif
audio_ex3d_set_onoff(1); audio_ex3d_set_onoff(1);
debug_printf("Mode 2: AI7.1 (IR_7_1_GAME) ON, sf=1\n"); debug_printf("Mode 3: AI7.1 (IR_7_1_GAME) ON, sf=1, EQ ON\n");
} }
SET_SHARED_GLOBAL(g_3d_on_off_t1, is_3d_on); SET_SHARED_GLOBAL(g_3d_on_off_t1, is_3d_on);
} else if (tmp == 0xFD) {
// 脚步增强按键发来的 expand gain 命令
int32_t gain = (int32_t)chan_in_word(cc_mic_level);
if ((0 <= gain) && (gain <= 20)) {
Ex3dExpandGain = gain;
EX3DAudio_SetExpandGain(Ex3dExpandGain);
debug_printf("Button set CMD_EXPAND_GAIN: %d\n", gain);
}
} else { } else {
// Mic 静音状态命令 // Mic 静音状态命令
switch (tmp) { switch (tmp) {
@@ -922,21 +945,58 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
event_hid: event_hid:
{ {
//uint8_t junk=chan_in_byte(c_hid);
unsigned length = chan_in_byte(c_hidRcvData); unsigned length = chan_in_byte(c_hidRcvData);
for(int i=0; i<length; i++) { for(int i=0; i<length; i++) {
RcvData[i] = chan_in_byte(c_hidRcvData); RcvData[i] = chan_in_byte(c_hidRcvData);
} }
if(RcvData[0] == 0x01) { // REPORT ID 1 if(RcvData[0] == 0x01) { // REPORT ID 1
#if (HID_CONTROLS == 1) #if (HID_CONTROLS == 1)
hid_receive_task_in_c(RcvData, SendData); // 0xB0/0xB1命令由process_send_params通过c_ex3d_hid_cmd直接发到tile1处理
for(int i=0; i<(HID_MAX_DATA_BYTES / 4) ;i++) { // 这里只需跳过不再通过c_hidSendData回传结果
chan_out_word(c_hidSendData, SendData[i]); if (length >= 3 && RcvData[1] == 0x77 &&
(RcvData[2] == 0xB0 || RcvData[2] == 0xB1)) {
// 丢弃由event_ex3d_hid处理
} else {
hid_receive_task_in_c(RcvData, SendData);
for(int i=0; i<(HID_MAX_DATA_BYTES / 4); i++) {
chan_out_word(c_hidSendData, SendData[i]);
}
} }
#endif #endif
} }
} }
continue; continue;
event_ex3d_hid:
{
#if (HID_CONTROLS == 1)
// 收到process_send_params发来的0xB0/0xB1 EX3D命令
// 协议: cmd(1 byte) + ex3d_cmd_code(1 word) + params_len(1 byte) + params(N bytes)
uint8_t hid_cmd = chan_in_byte(c_ex3d_hid_cmd);
uint32_t ex3d_cmd_code = chan_in_word(c_ex3d_hid_cmd);
uint8_t params_len = chan_in_byte(c_ex3d_hid_cmd);
// 构建EX3D原生格式缓冲区: [0x01, 0, 0, 0, cmd_code[4], params...]
unsigned char ex3d_rcv[64];
memset(ex3d_rcv, 0, 64);
ex3d_rcv[0] = 0x01;
ex3d_rcv[4] = (uint8_t)(ex3d_cmd_code & 0xFF);
ex3d_rcv[5] = (uint8_t)((ex3d_cmd_code >> 8) & 0xFF);
ex3d_rcv[6] = (uint8_t)((ex3d_cmd_code >> 16) & 0xFF);
ex3d_rcv[7] = (uint8_t)((ex3d_cmd_code >> 24) & 0xFF);
for (int i = 0; i < params_len && i < 56; i++) {
ex3d_rcv[8 + i] = chan_in_byte(c_ex3d_hid_cmd);
}
// 在tile1执行EX3D命令
hid_receive_task_in_c(ex3d_rcv, SendData);
// 将结果回传给process_send_params16个word
for (int i = 0; i < (HID_MAX_DATA_BYTES / 4); i++) {
chan_out_word(c_ex3d_hid_cmd, SendData[i]);
}
#endif
}
continue;
event_uac_vol: event_uac_vol:
{ {

View File

@@ -25,6 +25,9 @@ extern void device_reboot(void);
#include "biquad_standalone.h" #include "biquad_standalone.h"
#include "eq_flash_storage.h" #include "eq_flash_storage.h"
#include "user_func.h" #include "user_func.h"
#if (USE_EX3D == 1) && (HID_CONTROLS == 1)
#include <xcore/channel.h>
#endif
static struct { static struct {
uint8_t pending_cmd; // 0xB0/0xB1 or 0 uint8_t pending_cmd; // 0xB0/0xB1 or 0
@@ -449,7 +452,18 @@ static bool apply_eq_band_params(uint8_t mode, uint8_t band_index, uint8_t filte
void program_key(unsigned char *, signed int); void program_key(unsigned char *, signed int);
#if (USE_EX3D == 1) && (HID_CONTROLS == 1) #if (USE_EX3D == 1) && (HID_CONTROLS == 1)
extern void hid_receive_task_in_c(unsigned char * RcvData, unsigned * SendData); extern void hid_receive_task_in_c(unsigned char * RcvData, unsigned * SendData);
#ifndef HID_MAX_DATA_BYTES
#define HID_MAX_DATA_BYTES (64)
#endif #endif
static chanend_t g_ex3d_hid_chanend = 0;
static unsigned ex3d_b0b1_result[HID_MAX_DATA_BYTES / 4] = {0};
extern unsigned g_hid_expand_gain_request;
void SetEx3dHidChan(chanend_t c) { g_ex3d_hid_chanend = c; }
#endif
// 0x84 FACTORY_RESET: 删除Flash参数后触发重启由button_task轮询执行
extern unsigned g_request_factory_reset;
extern int lfs_remove_file(const char *path);
unsigned char process_send_params(uint8_t data[], uint16_t len) { unsigned char process_send_params(uint8_t data[], uint16_t len) {
if (len < 60) { if (len < 60) {
return false; return false;
@@ -684,31 +698,23 @@ unsigned char process_send_params(uint8_t data[], uint16_t len) {
return true; return true;
} }
// 处理设置游戏模式命令 (0xA4) - SET_GAME_MODE // 处理设置音效模式命令 (0xA4) - SET_SOUND_EFFECT_MODE
// 0=无音效(EQ/EX3D全关), 1=音乐模式, 2=游戏模式, 3=AI7.1模式
if (data[1] == 0xA4) { if (data[1] == 0xA4) {
uint8_t game_mode = data[2]; uint8_t game_mode = data[2];
// 参数验证 // 参数验证0-3
if (game_mode > 2) { if (game_mode > 3) {
return false; return false;
} }
extern unsigned g_uac_mode; extern unsigned g_request_game_mode;
unsigned uac_mode; SET_SHARED_GLOBAL(g_request_game_mode, game_mode);
GET_SHARED_GLOBAL(uac_mode, g_uac_mode);
if (uac_mode == 1) {
extern void request_game_mode_switch(unsigned game_mode);
//request_game_mode_switch(game_mode);
} else {
extern unsigned g_request_game_mode;
SET_SHARED_GLOBAL(g_request_game_mode, game_mode);
}
return true; return true;
} }
// 处理获取游戏模式命令 (0xA5) - GET_GAME_MODE // 处理获取音效模式命令 (0xA5) - GET_SOUND_EFFECT_MODE
if (data[1] == 0xA5) { if (data[1] == 0xA5) {
read_request.pending_cmd = 0xA5; read_request.pending_cmd = 0xA5;
return true; return true;
@@ -720,18 +726,58 @@ unsigned char process_send_params(uint8_t data[], uint16_t len) {
return true; return true;
} }
// 处理恢复出厂默认命令 (0x84) - FACTORY_RESET
if (data[1] == 0x84) {
// 删除所有Flash保存的参数文件
lfs_remove_file("game_mode");
lfs_remove_file("mic_vol");
lfs_remove_file("dac_vol");
lfs_remove_file("footstep");
// 删除EQ flash数据
eq_flash_clear_all();
// 通知button_task在合适时机重启避免在USB上下文中直接reboot
SET_SHARED_GLOBAL(g_request_factory_reset, 1);
read_request.pending_cmd = 0x84;
return true;
}
// 处理发送/读取EX3D命令 (0xB0/0xB1) - SET_EX3D_CMD / GET_EX3D_CMD // 处理发送/读取EX3D命令 (0xB0/0xB1) - SET_EX3D_CMD / GET_EX3D_CMD
// 数据通过 g_ex3d_hid_chanend 直接传到tile1的hid_button_task执行结果同步返回
if (data[1] == 0xB0 || data[1] == 0xB1) { if (data[1] == 0xB0 || data[1] == 0xB1) {
#if (USE_EX3D == 1) && (HID_CONTROLS == 1) #if (USE_EX3D == 1) && (HID_CONTROLS == 1)
if (!g_ex3d_hid_chanend) return false;
// 提取EX3D命令码4字节小端序 // 提取EX3D命令码4字节小端序
uint32_t ex3d_cmd = (uint32_t)data[2] | ((uint32_t)data[3] << 8) | uint32_t ex3d_cmd = (uint32_t)data[2] | ((uint32_t)data[3] << 8) |
((uint32_t)data[4] << 16) | ((uint32_t)data[5] << 24); ((uint32_t)data[4] << 16) | ((uint32_t)data[5] << 24);
// 提取参数从data[6]开始最多56字节 uint8_t params_len = (uint8_t)((len > 62) ? 56 : (len > 6 ? len - 6 : 0));
// 存储到ex3d_request供process_read_params构建响应
ex3d_request.ex3d_command_code = ex3d_cmd; ex3d_request.ex3d_command_code = ex3d_cmd;
ex3d_request.ex3d_params_len = (len > 62) ? 56 : (len - 6); ex3d_request.ex3d_params_len = params_len;
memcpy(ex3d_request.ex3d_params, &data[6], ex3d_request.ex3d_params_len); if (params_len > 0) memcpy(ex3d_request.ex3d_params, &data[6], params_len);
ex3d_request.pending_cmd = data[1]; ex3d_request.pending_cmd = data[1];
// 若是SET CMD_EXPAND_GAIN (0x93)同步更新footstep LED状态
if (data[1] == 0xB0 && ex3d_cmd == 0x93 && params_len >= 4) {
uint32_t gain_val = (uint32_t)data[6] | ((uint32_t)data[7] << 8) |
((uint32_t)data[8] << 16) | ((uint32_t)data[9] << 24);
SET_SHARED_GLOBAL(g_hid_expand_gain_request, gain_val);
}
// 发送命令到tile1并同步等待结果
// 协议: cmd(1 byte) + ex3d_cmd_code(4 bytes) + params_len(1 byte) + params(N bytes)
chan_out_byte(g_ex3d_hid_chanend, data[1]);
chan_out_word(g_ex3d_hid_chanend, ex3d_cmd);
chan_out_byte(g_ex3d_hid_chanend, params_len);
for (int i = 0; i < params_len; i++) {
chan_out_byte(g_ex3d_hid_chanend, data[6 + i]);
}
// 接收tile1返回的结果16个word
for (int i = 0; i < (HID_MAX_DATA_BYTES / 4); i++) {
ex3d_b0b1_result[i] = chan_in_word(g_ex3d_hid_chanend);
}
return true; return true;
#else #else
return false; return false;
@@ -819,7 +865,8 @@ void init_mode_info(void) {
// 初始化默认模式名称 // 初始化默认模式名称
const char* default_names[NUM_EQ_MODES] = { const char* default_names[NUM_EQ_MODES] = {
"JAZZ", "POP", "ROCK", "CLASIC", "R&B", "JAZZ", "POP", "ROCK", "CLASIC", "R&B",
"3A Game", "FPS", "user 1", "user 2", "user3" "3A Game", "FPS", "HI-FI", "VOCAL", "DANCE",
"user 1", "user 2"
}; };
// 初始化默认增益0dB // 初始化默认增益0dB
@@ -845,23 +892,6 @@ void user_read_hid_status(unsigned char hidPassData[])
} }
} }
#if (USE_EX3D == 1) && (HID_CONTROLS == 1)
static void ex3d_build_and_call(unsigned char rcv_data[64], unsigned send_data[16]) {
memset(rcv_data, 0, 64);
memset(send_data, 0, sizeof(unsigned) * 16);
rcv_data[0] = 0x01;
unsigned *pRcvBuf = (unsigned *)(rcv_data + 4);
pRcvBuf[0] = ex3d_request.ex3d_command_code;
for (int i = 0; i < ex3d_request.ex3d_params_len / 4 && i < 14; i++) {
pRcvBuf[i + 1] = (uint32_t)ex3d_request.ex3d_params[i * 4] |
((uint32_t)ex3d_request.ex3d_params[i * 4 + 1] << 8) |
((uint32_t)ex3d_request.ex3d_params[i * 4 + 2] << 16) |
((uint32_t)ex3d_request.ex3d_params[i * 4 + 3] << 24);
}
hid_receive_task_in_c(rcv_data, send_data);
}
#endif
// process_read_params: build HID response from pending request state // process_read_params: build HID response from pending request state
unsigned char process_read_params(uint8_t response[]) { unsigned char process_read_params(uint8_t response[]) {
memset(response, 0, 63); memset(response, 0, 63);
@@ -940,12 +970,11 @@ unsigned char process_read_params(uint8_t response[]) {
if (read_request.pending_cmd == 0x91) { if (read_request.pending_cmd == 0x91) {
RSP_HDR(response, 0x91); RSP_HDR(response, 0x91);
// 模式总数:预定义模式(0-5) + 用户模式(6-8) = 9,不包含禁用模式(10) // 模式总数:预定义模式(0-9) + 用户模式(10-11) = 12,不包含禁用模式(12)
// 注意NUM_EQ_MODES = 10但实际可用模式是0-8共9个不包含禁用模式10 uint8_t mode_count = NUM_EQ_MODES; // 固定返回12
uint8_t mode_count = NUM_EQ_MODES; // 固定返回10
response[2] = mode_count; response[2] = mode_count;
// 预定义模式数量0-6共7个预设模式 // 预定义模式数量0-9共10个预设模式
uint8_t preset_mode_count = EQ_PRESET_MODE_MAX + 1; uint8_t preset_mode_count = EQ_PRESET_MODE_MAX + 1;
response[3] = preset_mode_count; response[3] = preset_mode_count;
@@ -1044,11 +1073,7 @@ unsigned char process_read_params(uint8_t response[]) {
GET_SHARED_GLOBAL(game_mode, g_game_mode); GET_SHARED_GLOBAL(game_mode, g_game_mode);
// 当前游戏模式 (1字节位置2) // 当前游戏模式 (1字节位置2)
#if UAC2 == 1
response[2] = 0;
#else
response[2] = (uint8_t)game_mode; response[2] = (uint8_t)game_mode;
#endif
read_request.pending_cmd = 0; // Clear read request flag read_request.pending_cmd = 0; // Clear read request flag
return true; return true;
@@ -1067,21 +1092,24 @@ unsigned char process_read_params(uint8_t response[]) {
return true; return true;
} }
// 处理恢复出厂默认响应 (0x84) - FACTORY_RESET
if (read_request.pending_cmd == 0x84) {
RSP_HDR(response, 0x84);
response[2] = 0x00; // 成功
read_request.pending_cmd = 0;
return true;
}
// 处理发送EX3D命令响应 (0xB0) - SET_EX3D_CMD // 处理发送EX3D命令响应 (0xB0) - SET_EX3D_CMD
// 结果已在process_send_params中同步从tile1获取存于ex3d_b0b1_result
if (ex3d_request.pending_cmd == 0xB0) { if (ex3d_request.pending_cmd == 0xB0) {
RSP_HDR(response, 0xB0); RSP_HDR(response, 0xB0);
#if (USE_EX3D == 1) && (HID_CONTROLS == 1) #if (USE_EX3D == 1) && (HID_CONTROLS == 1)
unsigned char rcv_data[64]; unsigned *send_data = ex3d_b0b1_result;
unsigned send_data[16];
ex3d_build_and_call(rcv_data, send_data);
// 状态码检查send_data[1]是否有错误返回值0xFFFFFFFF表示参数错误 // 状态码检查send_data[1]是否有错误返回值0xFFFFFFFF表示参数错误
uint8_t status = 0x00; // 默认成功 uint8_t status = (send_data[1] == 0xFFFFFFFF) ? 0x01 : 0x00;
if (send_data[1] == 0xFFFFFFFF) {
status = 0x01; // 失败
}
response[2] = status; response[2] = status;
// 回显命令码4字节 // 回显命令码4字节
@@ -1090,20 +1118,11 @@ unsigned char process_read_params(uint8_t response[]) {
response[5] = (uint8_t)((ex3d_request.ex3d_command_code >> 16) & 0xFF); response[5] = (uint8_t)((ex3d_request.ex3d_command_code >> 16) & 0xFF);
response[6] = (uint8_t)((ex3d_request.ex3d_command_code >> 24) & 0xFF); response[6] = (uint8_t)((ex3d_request.ex3d_command_code >> 24) & 0xFF);
// 返回send_data中的返回值(如果有) // 返回send_data[1]中的返回值
if (send_data[1] != 0xFFFFFFFF) { response[7] = (uint8_t)(send_data[1] & 0xFF);
// 某些SET命令可能返回数据将send_data[1]开始的数据复制到响应 response[8] = (uint8_t)((send_data[1] >> 8) & 0xFF);
response[7] = (uint8_t)(send_data[1] & 0xFF); response[9] = (uint8_t)((send_data[1] >> 16) & 0xFF);
response[8] = (uint8_t)((send_data[1] >> 8) & 0xFF); response[10] = (uint8_t)((send_data[1] >> 24) & 0xFF);
response[9] = (uint8_t)((send_data[1] >> 16) & 0xFF);
response[10] = (uint8_t)((send_data[1] >> 24) & 0xFF);
} else {
// 错误时返回0xFFFFFFFF
response[7] = 0xFF;
response[8] = 0xFF;
response[9] = 0xFF;
response[10] = 0xFF;
}
#else #else
response[2] = 0x01; // 失败EX3D支持未启用 response[2] = 0x01; // 失败EX3D支持未启用
#endif #endif
@@ -1113,13 +1132,12 @@ unsigned char process_read_params(uint8_t response[]) {
} }
// 处理读取EX3D命令响应 (0xB1) - GET_EX3D_CMD // 处理读取EX3D命令响应 (0xB1) - GET_EX3D_CMD
// 结果已在process_send_params中同步从tile1获取存于ex3d_b0b1_result
if (ex3d_request.pending_cmd == 0xB1) { if (ex3d_request.pending_cmd == 0xB1) {
RSP_HDR(response, 0xB1); RSP_HDR(response, 0xB1);
#if (USE_EX3D == 1) && (HID_CONTROLS == 1) #if (USE_EX3D == 1) && (HID_CONTROLS == 1)
unsigned char rcv_data[64]; unsigned *send_data = ex3d_b0b1_result;
unsigned send_data[16];
ex3d_build_and_call(rcv_data, send_data);
// 回显命令码4字节 // 回显命令码4字节
response[2] = (uint8_t)(ex3d_request.ex3d_command_code & 0xFF); response[2] = (uint8_t)(ex3d_request.ex3d_command_code & 0xFF);

View File

@@ -7,15 +7,15 @@
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
#define NUM_EQ_MODES 10 #define NUM_EQ_MODES 12
#define NUM_EQ_CHANS 2 #define NUM_EQ_CHANS 2
#define MAX_EQ_BANDS 8 #define MAX_EQ_BANDS 8
#define EQ_DISABLED_MODE 10 // 禁用EQ的模式编号 #define EQ_DISABLED_MODE 12 // 禁用EQ的模式编号(超出有效范围)
#define EQ_PRESET_MODE_MIN 0 // 预设模式最小编号 #define EQ_PRESET_MODE_MIN 0 // 预设模式最小编号
#define EQ_PRESET_MODE_MAX 6 // 预设模式最大编号preset1-preset6 #define EQ_PRESET_MODE_MAX 9 // 预设模式最大编号preset1-preset10
#define EQ_USER_MODE_MIN 7 // 用户模式最小编号 #define EQ_USER_MODE_MIN 10 // 用户模式最小编号
#define EQ_USER_MODE_MAX 9 // 用户模式最大编号user 1-4 #define EQ_USER_MODE_MAX 11 // 用户模式最大编号user 1-2
#define EQ_MODE_MAX (NUM_EQ_MODES) // 模式最大编号user 1-4 #define EQ_MODE_MAX (NUM_EQ_MODES) // 模式最大编号
// Filter type definition // Filter type definition

View File

@@ -53,8 +53,8 @@ from filter_utils import (BiquadFilterCalculator, make_biquad_bypass, make_biqua
# 常量定义 # 常量定义
MAX_EQ_BANDS = 8 # 最大EQ滤波器数量 (0-7) MAX_EQ_BANDS = 8 # 最大EQ滤波器数量 (0-7)
NUM_EQ_MODES = 10 # EQ模式数量 NUM_EQ_MODES = 12 # EQ模式数量10预设 + 2用户
EQ_DISABLED_MODE = 10 # 禁用EQ的模式编号 EQ_DISABLED_MODE = 12 # 禁用EQ的模式编号
class BandFilter(QGroupBox): class BandFilter(QGroupBox):
"""单个滤波器带控件""" """单个滤波器带控件"""
@@ -406,6 +406,10 @@ class EQDesigner(QMainWindow):
self.total_bshift = 0 # 初始化total_bshift为0 self.total_bshift = 0 # 初始化total_bshift为0
self.log_level = LOG_LEVEL_VERBOSE # 设置默认日志级别 self.log_level = LOG_LEVEL_VERBOSE # 设置默认日志级别
# HID通知轮询定时器接收设备主动上报的0x9F采样率变化等通知
self._notification_timer = QTimer(self)
self._notification_timer.timeout.connect(self._poll_hid_notification)
# 创建菜单栏 # 创建菜单栏
# 改动原因:添加菜单栏,包含视图菜单用于隐藏/显示左侧面板的各组 # 改动原因:添加菜单栏,包含视图菜单用于隐藏/显示左侧面板的各组
self.create_menu_bar() self.create_menu_bar()
@@ -522,12 +526,14 @@ class EQDesigner(QMainWindow):
# 添加音效模式设置组 # 添加音效模式设置组
mode_group = QGroupBox("音效模式设置") mode_group = QGroupBox("EQ模式")
self.ui_groups['mode'] = mode_group # 保存引用 self.ui_groups['mode'] = mode_group # 保存引用
mode_layout = QFormLayout(mode_group) mode_layout = QFormLayout(mode_group)
self.mode_label = QLabel("音效模式:") self.mode_label = QLabel("EQ模式:")
self.mode_combo = QComboBox() self.mode_combo = QComboBox()
self.mode_combo.addItems(["预设模式1", "预设模式2", "预设模式3", "预设模式4", "预设模式5", "预设模式6", "用户模式1", "用户模式2", "用户模式3", "bypass", "禁用EQ"]) self.mode_combo.addItems(["预设模式1", "预设模式2", "预设模式3", "预设模式4", "预设模式5",
"预设模式6", "预设模式7", "预设模式8", "预设模式9", "预设模式10",
"用户模式1", "用户模式2", "禁用EQ"])
self.mode_combo.currentIndexChanged.connect(self.on_mode_changed) self.mode_combo.currentIndexChanged.connect(self.on_mode_changed)
mode_layout.addRow(self.mode_label, self.mode_combo) mode_layout.addRow(self.mode_label, self.mode_combo)
@@ -540,19 +546,19 @@ class EQDesigner(QMainWindow):
mode_layout.addRow(self.mode_name_label, self.mode_name_edit) mode_layout.addRow(self.mode_name_label, self.mode_name_edit)
# 切换音效模式按钮只发送0x8A命令 # 切换音效模式按钮只发送0x8A命令
self.switch_mode_btn = QPushButton("切换音效模式") self.switch_mode_btn = QPushButton("切换EQ模式")
self.switch_mode_btn.clicked.connect(self.on_switch_mode) self.switch_mode_btn.clicked.connect(self.on_switch_mode)
self.switch_mode_btn.hide() self.switch_mode_btn.hide()
mode_layout.addRow(self.switch_mode_btn) mode_layout.addRow(self.switch_mode_btn)
# 获取音效模式按钮只处理0x8B命令 # 获取音效模式按钮只处理0x8B命令
# 改动原因移除hide()调用,让按钮显示出来,方便用户获取当前模式 # 改动原因移除hide()调用,让按钮显示出来,方便用户获取当前模式
self.get_mode_btn = QPushButton("获取当前音效模式") self.get_mode_btn = QPushButton("获取当前EQ模式")
self.get_mode_btn.clicked.connect(self.on_get_mode) self.get_mode_btn.clicked.connect(self.on_get_mode)
mode_layout.addRow(self.get_mode_btn) mode_layout.addRow(self.get_mode_btn)
# 设置并保存音效模式按钮发送0x92命令 # 设置并保存音效模式按钮发送0x92命令
self.set_and_save_mode_btn = QPushButton("设置并保存音效模式") self.set_and_save_mode_btn = QPushButton("设置并保存EQ模式")
self.set_and_save_mode_btn.clicked.connect(self.on_set_and_save_mode) self.set_and_save_mode_btn.clicked.connect(self.on_set_and_save_mode)
mode_layout.addRow(self.set_and_save_mode_btn) mode_layout.addRow(self.set_and_save_mode_btn)
@@ -560,17 +566,17 @@ class EQDesigner(QMainWindow):
# 添加音效参数配置组EQ参数相关可通过菜单隐藏 # 添加音效参数配置组EQ参数相关可通过菜单隐藏
# 改动原因将音效参数配置组也添加到ui_groups中使其可以通过菜单隐藏/显示 # 改动原因将音效参数配置组也添加到ui_groups中使其可以通过菜单隐藏/显示
param_group = QGroupBox("音效参数配置") param_group = QGroupBox("EQ参数配置")
self.ui_groups['param'] = param_group # 保存引用,用于菜单控制可见性 self.ui_groups['param'] = param_group # 保存引用,用于菜单控制可见性
param_layout = QVBoxLayout(param_group) param_layout = QVBoxLayout(param_group)
# 配置音效参数按钮 # 配置音效参数按钮
self.config_params_btn = QPushButton("配置音效参数") self.config_params_btn = QPushButton("配置EQ参数")
self.config_params_btn.clicked.connect(self.on_config_params) self.config_params_btn.clicked.connect(self.on_config_params)
param_layout.addWidget(self.config_params_btn) param_layout.addWidget(self.config_params_btn)
# 读取音效参数按钮 # 读取音效参数按钮
self.read_params_btn = QPushButton("读取音效参数") self.read_params_btn = QPushButton("读取EQ参数")
self.read_params_btn.hide() self.read_params_btn.hide()
self.read_params_btn.clicked.connect(self.on_read_params) self.read_params_btn.clicked.connect(self.on_read_params)
param_layout.addWidget(self.read_params_btn) param_layout.addWidget(self.read_params_btn)
@@ -644,70 +650,32 @@ class EQDesigner(QMainWindow):
self.get_sample_format_btn.clicked.connect(self.on_get_sample_format) self.get_sample_format_btn.clicked.connect(self.on_get_sample_format)
volume_layout.addRow(self.get_sample_format_btn) volume_layout.addRow(self.get_sample_format_btn)
# 采样率状态显示自动从设备主动上报的0x9F通知更新
self.sample_format_status_label = QLabel("当前采样率: 未知")
volume_layout.addRow("采样率状态(0x9F):", self.sample_format_status_label)
left_content_layout.addWidget(volume_group) left_content_layout.addWidget(volume_group)
# 添加设备模式控制组(增益模式、滤波器模式、游戏模式) # 添加音效模式控制组
device_mode_group = QGroupBox("设备模式控制") device_mode_group = QGroupBox("音效模式控制")
self.ui_groups['device_mode'] = device_mode_group # 保存引用 self.ui_groups['device_mode'] = device_mode_group # 保存引用
device_mode_layout = QFormLayout(device_mode_group) device_mode_layout = QFormLayout(device_mode_group)
# 增益模式 # 音效模式
gain_control_layout = QHBoxLayout()
self.gain_mode_combo = QComboBox()
self.gain_mode_combo.addItem("低阻模式 (0)", 0)
self.gain_mode_combo.addItem("高阻模式 (1)", 1)
gain_control_layout.addWidget(QLabel("增益模式:"))
gain_control_layout.addWidget(self.gain_mode_combo)
device_mode_layout.addRow(gain_control_layout)
gain_btn_layout = QHBoxLayout()
self.set_gain_mode_btn = QPushButton("设置增益模式")
self.set_gain_mode_btn.clicked.connect(self.on_set_gain_mode)
self.get_gain_mode_btn = QPushButton("读取增益模式")
self.get_gain_mode_btn.clicked.connect(self.on_get_gain_mode)
gain_btn_layout.addWidget(self.set_gain_mode_btn)
gain_btn_layout.addWidget(self.get_gain_mode_btn)
device_mode_layout.addRow(gain_btn_layout)
# 滤波器模式
# 改动原因添加第8种滤波器模式支持0-7共8种模式
filter_control_layout = QHBoxLayout()
self.filter_mode_combo = QComboBox()
self.filter_mode_combo.addItem("Minimum Phase filter (default) (0)", 0)
self.filter_mode_combo.addItem("Linear Phase Apodizing Fast Roll-off filter (1)", 1)
self.filter_mode_combo.addItem("Linear phase fast roll-off filter (2)", 2)
self.filter_mode_combo.addItem("Linear Phase Fast Roll-off low-ripple filter (3)", 3)
self.filter_mode_combo.addItem("Linear phase slow roll-off filter (4)", 4)
self.filter_mode_combo.addItem("Minimum phase fast roll-off filter (5)", 5)
self.filter_mode_combo.addItem("Minimum phase slow roll-off filter (6)", 6)
self.filter_mode_combo.addItem("Minimum Phase Fast Roll-Off Low Dispersion (7)", 7)
filter_control_layout.addWidget(QLabel("滤波器模式:"))
filter_control_layout.addWidget(self.filter_mode_combo)
device_mode_layout.addRow(filter_control_layout)
filter_btn_layout = QHBoxLayout()
self.set_filter_mode_btn = QPushButton("设置滤波器模式")
self.set_filter_mode_btn.clicked.connect(self.on_set_filter_mode)
self.get_filter_mode_btn = QPushButton("读取滤波器模式")
self.get_filter_mode_btn.clicked.connect(self.on_get_filter_mode)
filter_btn_layout.addWidget(self.set_filter_mode_btn)
filter_btn_layout.addWidget(self.get_filter_mode_btn)
device_mode_layout.addRow(filter_btn_layout)
# 游戏模式
game_control_layout = QHBoxLayout() game_control_layout = QHBoxLayout()
self.game_mode_combo = QComboBox() self.game_mode_combo = QComboBox()
self.game_mode_combo.addItem("无音效 (0)", 0) self.game_mode_combo.addItem("无音效 (0)", 0)
self.game_mode_combo.addItem("FPS模式 (1)", 1) self.game_mode_combo.addItem("音乐模式 (1)", 1)
self.game_mode_combo.addItem("虚拟7.1 (2)", 2) self.game_mode_combo.addItem("游戏模式 (2)", 2)
game_control_layout.addWidget(QLabel("游戏模式:")) self.game_mode_combo.addItem("AI7.1模式 (3)", 3)
game_control_layout.addWidget(QLabel("音效模式:"))
game_control_layout.addWidget(self.game_mode_combo) game_control_layout.addWidget(self.game_mode_combo)
device_mode_layout.addRow(game_control_layout) device_mode_layout.addRow(game_control_layout)
game_btn_layout = QHBoxLayout() game_btn_layout = QHBoxLayout()
self.set_game_mode_btn = QPushButton("设置游戏模式") self.set_game_mode_btn = QPushButton("设置音效模式")
self.set_game_mode_btn.clicked.connect(self.on_set_game_mode) self.set_game_mode_btn.clicked.connect(self.on_set_game_mode)
self.get_game_mode_btn = QPushButton("读取游戏模式") self.get_game_mode_btn = QPushButton("读取音效模式")
self.get_game_mode_btn.clicked.connect(self.on_get_game_mode) self.get_game_mode_btn.clicked.connect(self.on_get_game_mode)
game_btn_layout.addWidget(self.set_game_mode_btn) game_btn_layout.addWidget(self.set_game_mode_btn)
game_btn_layout.addWidget(self.get_game_mode_btn) game_btn_layout.addWidget(self.get_game_mode_btn)
@@ -720,113 +688,15 @@ class EQDesigner(QMainWindow):
firmware_btn_layout.addWidget(self.get_firmware_version_btn) firmware_btn_layout.addWidget(self.get_firmware_version_btn)
device_mode_layout.addRow(firmware_btn_layout) device_mode_layout.addRow(firmware_btn_layout)
# 恢复出厂默认按钮
factory_reset_btn_layout = QHBoxLayout()
self.factory_reset_btn = QPushButton("恢复出厂默认 (0x84)")
self.factory_reset_btn.clicked.connect(self.on_factory_reset)
factory_reset_btn_layout.addWidget(self.factory_reset_btn)
device_mode_layout.addRow(factory_reset_btn_layout)
left_content_layout.addWidget(device_mode_group) left_content_layout.addWidget(device_mode_group)
# 添加LED控制组
led_group = QGroupBox("LED控制")
self.ui_groups['led'] = led_group # 保存引用
led_layout = QFormLayout(led_group)
# LED索引选择
led_index_layout = QHBoxLayout()
self.led_index_label = QLabel("LED索引:")
self.led_index_spin = QSpinBox()
self.led_index_spin.setRange(0, 7)
self.led_index_spin.setValue(0)
led_index_layout.addWidget(self.led_index_label)
led_index_layout.addWidget(self.led_index_spin)
led_layout.addRow(led_index_layout)
# LED开关
led_switch_layout = QHBoxLayout()
self.led_switch_label = QLabel("LED开关:")
self.led_switch_combo = QComboBox()
self.led_switch_combo.addItems(["OFF (关闭)", "ON (开启)"])
self.led_switch_combo.setCurrentIndex(1) # 默认开启
led_switch_layout.addWidget(self.led_switch_label)
led_switch_layout.addWidget(self.led_switch_combo)
led_layout.addRow(led_switch_layout)
# LED信息显示
self.led_info_label = QLabel("LED信息: 未获取")
led_layout.addRow("LED信息:", self.led_info_label)
# LED状态显示
self.led_status_label = QLabel("LED状态: 未获取")
led_layout.addRow("LED状态:", self.led_status_label)
# LED控制按钮
led_buttons_layout = QVBoxLayout()
# 获取LED信息按钮
self.get_led_info_btn = QPushButton("获取LED信息")
self.get_led_info_btn.clicked.connect(self.on_get_led_info)
led_buttons_layout.addWidget(self.get_led_info_btn)
# 设置LED开关按钮
self.set_led_switch_btn = QPushButton("设置LED开关")
self.set_led_switch_btn.clicked.connect(self.on_set_led_switch)
led_buttons_layout.addWidget(self.set_led_switch_btn)
# 获取LED开关按钮
self.get_led_switch_btn = QPushButton("获取LED开关")
self.get_led_switch_btn.clicked.connect(self.on_get_led_switch)
led_buttons_layout.addWidget(self.get_led_switch_btn)
# 获取LED状态按钮
self.get_led_status_btn = QPushButton("获取LED状态")
self.get_led_status_btn.clicked.connect(self.on_get_led_status)
led_buttons_layout.addWidget(self.get_led_status_btn)
# 获取LED总数按钮
self.get_led_count_btn = QPushButton("获取LED总数")
self.get_led_count_btn.clicked.connect(self.on_get_led_count)
led_buttons_layout.addWidget(self.get_led_count_btn)
led_layout.addRow(led_buttons_layout)
left_content_layout.addWidget(led_group)
# 添加UAC控制组
uac_group = QGroupBox("UAC模式控制")
self.ui_groups['uac'] = uac_group # 保存引用
uac_layout = QFormLayout(uac_group)
# UAC模式选择
uac_mode_layout = QHBoxLayout()
self.uac_mode_label = QLabel("UAC模式:")
self.uac_mode_combo = QComboBox()
self.uac_mode_combo.addItems(["UAC2.0", "UAC1.0"])
self.uac_mode_combo.setCurrentIndex(0) # 默认UAC2.0
uac_mode_layout.addWidget(self.uac_mode_label)
uac_mode_layout.addWidget(self.uac_mode_combo)
uac_layout.addRow(uac_mode_layout)
# 当前UAC模式显示
self.current_uac_mode_label = QLabel("当前UAC模式: 未获取")
uac_layout.addRow("当前模式:", self.current_uac_mode_label)
# UAC控制按钮
uac_buttons_layout = QVBoxLayout()
# 获取UAC模式信息按钮
self.get_uac_mode_info_btn = QPushButton("获取UAC模式信息")
self.get_uac_mode_info_btn.clicked.connect(self.on_get_uac_mode_info)
uac_buttons_layout.addWidget(self.get_uac_mode_info_btn)
# 设置UAC模式按钮
self.set_uac_mode_btn = QPushButton("设置UAC模式")
self.set_uac_mode_btn.clicked.connect(self.on_set_uac_mode)
uac_buttons_layout.addWidget(self.set_uac_mode_btn)
# 获取当前UAC模式按钮
self.get_current_uac_mode_btn = QPushButton("获取当前UAC模式")
self.get_current_uac_mode_btn.clicked.connect(self.on_get_current_uac_mode)
uac_buttons_layout.addWidget(self.get_current_uac_mode_btn)
uac_layout.addRow(uac_buttons_layout)
left_content_layout.addWidget(uac_group)
# 添加EQ使能控制组 # 添加EQ使能控制组
eq_enable_group = QGroupBox("EQ使能控制") eq_enable_group = QGroupBox("EQ使能控制")
@@ -1005,12 +875,10 @@ class EQDesigner(QMainWindow):
# 改动原因:添加'param'(音效参数配置)到菜单控制列表中 # 改动原因:添加'param'(音效参数配置)到菜单控制列表中
group_names = { group_names = {
'device_info': '设备信息', 'device_info': '设备信息',
'mode': '音效模式设置', 'mode': 'EQ模式',
'param': '音效参数配置', 'param': 'EQ参数配置',
'volume': '音量控制', 'volume': '音量控制',
'device_mode': '设备模式控制', 'device_mode': '音效模式控制',
'led': 'LED控制',
'uac': 'UAC模式控制',
'eq_enable': 'EQ使能控制', 'eq_enable': 'EQ使能控制',
'ex3d': 'EX3D控制' 'ex3d': 'EX3D控制'
} }
@@ -1034,12 +902,10 @@ class EQDesigner(QMainWindow):
if group_key in self.view_actions: if group_key in self.view_actions:
group_names = { group_names = {
'device_info': '设备信息', 'device_info': '设备信息',
'mode': '音效模式设置', 'mode': 'EQ模式',
'param': '音效参数配置', 'param': 'EQ参数配置',
'volume': '音量控制', 'volume': '音量控制',
'device_mode': '设备模式控制', 'device_mode': '音效模式控制',
'led': 'LED控制',
'uac': 'UAC模式控制',
'eq_enable': 'EQ使能控制', 'eq_enable': 'EQ使能控制',
'ex3d': 'EX3D控制' 'ex3d': 'EX3D控制'
} }
@@ -1784,6 +1650,8 @@ eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{
self.on_get_mode() self.on_get_mode()
self.read_parameters() self.read_parameters()
log_message(LOG_LEVEL_DEBUG, f"找到设备: {info}", self.log_level) log_message(LOG_LEVEL_DEBUG, f"找到设备: {info}", self.log_level)
# 启动HID通知轮询接收设备主动上报0x9F采样率变化等
self._notification_timer.start(200)
def on_debug_changed(self, state): def on_debug_changed(self, state):
"""当调试开关状态改变时更新所有滤波器""" """当调试开关状态改变时更新所有滤波器"""
@@ -2173,6 +2041,83 @@ eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{
except Exception as e: except Exception as e:
log_message(LOG_LEVEL_ERROR, f"复位EQ参数时出错: {str(e)}", self.log_level) log_message(LOG_LEVEL_ERROR, f"复位EQ参数时出错: {str(e)}", self.log_level)
def on_factory_reset(self):
"""恢复出厂默认发送0x84命令"""
if self.device_combo.currentData() is None:
log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level)
return
reply = QMessageBox.warning(
self,
"确认恢复出厂默认",
"这将删除所有已保存的参数音效模式、麦克风增益、监听音量、脚步声增强、EQ预设\n"
"恢复出厂默认值,并重启设备。\n\n"
"出厂默认值:\n"
" · 音效模式: AI7.1 (3)\n"
" · 脚步声增强: 12dB (全亮)\n"
" · 麦克风增益: 21dB\n"
" · 监听音量: -14dB\n"
" · AI降噪: 开启\n"
" · EQ预设: 头文件默认值\n\n"
"是否继续?",
QMessageBox.Yes | QMessageBox.No,
QMessageBox.No
)
if reply == QMessageBox.Yes:
self.send_factory_reset()
def send_factory_reset(self):
"""发送恢复出厂默认命令0x84命令"""
if self.device_combo.currentData() is None:
log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level)
return
try:
device_info = self.device_combo.currentData()
h = hid.device()
h.open(device_info['vendor_id'], device_info['product_id'])
h.set_nonblocking(1)
# 构建0x84数据包
data = bytearray(63) # 63字节数据包
data[0] = 0x77 # 同步头1
data[1] = 0x84 # 命令码 (FACTORY_RESET)
# data[2..62] 保留保持为0
log_message(LOG_LEVEL_INFO, "正在发送恢复出厂默认命令...", self.log_level)
h.write([0x01] + list(data)) # 0x01是report_id
# 读取响应(设备重启前会先回复)
reply = h.get_input_report(0x1, 64)
if reply and len(reply) == 64:
if reply[0] == 0x01 and reply[1] == 0x77 and reply[2] == 0x84:
status = reply[3]
if status == 0x00:
log_message(LOG_LEVEL_INFO, "恢复出厂默认成功,设备即将重启...", self.log_level)
QMessageBox.information(
self,
"恢复出厂默认",
"命令已发送设备将在500ms后重启。\n请稍候重新连接设备。"
)
else:
log_message(LOG_LEVEL_ERROR, f"恢复出厂默认失败 (状态码: 0x{status:02x})", self.log_level)
else:
log_message(LOG_LEVEL_ERROR, f"无效的0x84响应: 0x{reply[1]:02x} 0x{reply[2]:02x}", self.log_level)
else:
# 设备可能已开始重启,视为成功
log_message(LOG_LEVEL_INFO, "未收到响应,设备可能已开始重启", self.log_level)
QMessageBox.information(
self,
"恢复出厂默认",
"命令已发送,设备将重启。\n请稍候重新连接设备。"
)
h.close()
except Exception as e:
log_message(LOG_LEVEL_ERROR, f"恢复出厂默认时出错: {str(e)}", self.log_level)
def on_get_mode_count(self): def on_get_mode_count(self):
"""获取EQ模式总数发送0x91命令""" """获取EQ模式总数发送0x91命令"""
if self.device_combo.currentData() is None: if self.device_combo.currentData() is None:
@@ -2520,6 +2465,7 @@ eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{
log_message(LOG_LEVEL_INFO, log_message(LOG_LEVEL_INFO,
f"采样率和格式信息: 采样率={samfreq}Hz, 格式={format_type}", f"采样率和格式信息: 采样率={samfreq}Hz, 格式={format_type}",
self.log_level) self.log_level)
self._update_sample_format_status(samfreq, dsd_mode)
QMessageBox.information( QMessageBox.information(
self, self,
"采样率和格式信息", "采样率和格式信息",
@@ -2537,6 +2483,41 @@ eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{
except Exception as e: except Exception as e:
log_message(LOG_LEVEL_ERROR, f"读取采样率和格式时出错: {str(e)}", self.log_level) log_message(LOG_LEVEL_ERROR, f"读取采样率和格式时出错: {str(e)}", self.log_level)
def _update_sample_format_status(self, samfreq, dsd_mode):
"""更新采样率状态标签并同步EQ采样率下拉框"""
format_type = "PCM" if dsd_mode == 0 else f"DSD (模式 {dsd_mode})"
self.sample_format_status_label.setText(f"{samfreq} Hz {format_type}")
# 同步EQ计算用采样率下拉框
idx = self.sample_rate.findText(str(samfreq))
if idx >= 0:
self.sample_rate.blockSignals(True)
self.sample_rate.setCurrentIndex(idx)
self.sample_rate.blockSignals(False)
def _poll_hid_notification(self):
"""轮询HID输入报告处理设备主动上报的0x9F采样率变化通知"""
if self.device_combo.currentData() is None:
return
try:
device_info = self.device_combo.currentData()
h = hid.device()
h.open(device_info['vendor_id'], device_info['product_id'])
h.set_nonblocking(1)
data = h.read(64)
h.close()
if data and len(data) >= 8:
# 0x9F: 采样率变化主动上报 [Report_ID=0x01, 0x77, 0x9F, samfreq(4B LE), dsd_mode]
if data[0] == 0x01 and data[1] == 0x77 and data[2] == 0x9F:
samfreq = data[3] | (data[4] << 8) | (data[5] << 16) | (data[6] << 24)
dsd_mode = data[7]
self._update_sample_format_status(samfreq, dsd_mode)
log_message(LOG_LEVEL_INFO,
f"[0x9F通知] 采样率变化: {samfreq} Hz, "
f"{'PCM' if dsd_mode == 0 else f'DSD({dsd_mode})'}",
self.log_level)
except Exception:
pass
def on_get_led_info(self): def on_get_led_info(self):
"""获取LED信息发送0x95命令""" """获取LED信息发送0x95命令"""
if self.device_combo.currentData() is None: if self.device_combo.currentData() is None:
@@ -3354,20 +3335,20 @@ eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{
log_message(LOG_LEVEL_ERROR, f"读取滤波器模式时出错: {str(e)}", self.log_level) log_message(LOG_LEVEL_ERROR, f"读取滤波器模式时出错: {str(e)}", self.log_level)
def on_set_game_mode(self): def on_set_game_mode(self):
"""设置游戏模式发送0xA4命令""" """设置音效模式发送0xA4命令"""
if self.device_combo.currentData() is None: if self.device_combo.currentData() is None:
log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level)
return return
# 获取游戏模式值 # 获取音效模式值
game_mode = self.game_mode_combo.currentData() game_mode = self.game_mode_combo.currentData()
# 弹出确认对话框 # 弹出确认对话框
reply = QMessageBox.question( reply = QMessageBox.question(
self, self,
"确认设置游戏模式", "确认设置音效模式",
f"将要设置游戏模式为: {self.game_mode_combo.currentText()}\n\n" f"将要设置音效模式为: {self.game_mode_combo.currentText()}\n\n"
f"游戏模式: 0=无音效, 1=FPS, 2=虚拟7.1\n\n" f"音效模式: 0=无音效, 1=音乐模式, 2=游戏模式, 3=AI7.1模式\n\n"
f"是否继续?", f"是否继续?",
QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes | QMessageBox.No,
QMessageBox.No QMessageBox.No
@@ -3383,27 +3364,27 @@ eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{
# 构建0xA4数据包 # 构建0xA4数据包
data = bytearray(63) # 63字节数据包 data = bytearray(63) # 63字节数据包
data[0] = 0x77 # 同步头1 data[0] = 0x77 # 同步头1
data[1] = 0xA4 # 命令码 (SET_GAME_MODE) data[1] = 0xA4 # 命令码 (SET_SOUND_EFFECT_MODE)
data[2] = game_mode # 游戏模式值 (0-2) data[2] = game_mode # 音效模式值 (0-3)
# 其余字节保持为0 # 其余字节保持为0
# 发送请求 # 发送请求
log_message(LOG_LEVEL_INFO, f"正在设置游戏模式为 {game_mode}...", self.log_level) log_message(LOG_LEVEL_INFO, f"正在设置音效模式为 {game_mode}...", self.log_level)
h.write([0x01] + list(data)) h.write([0x01] + list(data))
h.close() h.close()
log_message(LOG_LEVEL_INFO, f"游戏模式 {game_mode} 设置成功", self.log_level) log_message(LOG_LEVEL_INFO, f"音效模式 {game_mode} 设置成功", self.log_level)
QMessageBox.information( QMessageBox.information(
self, self,
"成功", "成功",
f"游戏模式已设置为: {self.game_mode_combo.currentText()}" f"音效模式已设置为: {self.game_mode_combo.currentText()}"
) )
except Exception as e: except Exception as e:
log_message(LOG_LEVEL_ERROR, f"设置游戏模式时出错: {str(e)}", self.log_level) log_message(LOG_LEVEL_ERROR, f"设置音效模式时出错: {str(e)}", self.log_level)
def on_get_game_mode(self): def on_get_game_mode(self):
"""读取游戏模式发送0xA5命令""" """读取音效模式发送0xA5命令"""
if self.device_combo.currentData() is None: if self.device_combo.currentData() is None:
log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level)
return return
@@ -3417,11 +3398,11 @@ eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{
# 构建0xA5数据包 # 构建0xA5数据包
data = bytearray(63) # 63字节数据包 data = bytearray(63) # 63字节数据包
data[0] = 0x77 # 同步头1 data[0] = 0x77 # 同步头1
data[1] = 0xA5 # 命令码 (GET_GAME_MODE) data[1] = 0xA5 # 命令码 (GET_SOUND_EFFECT_MODE)
# 其余字节保持为0 # 其余字节保持为0
# 发送请求 # 发送请求
log_message(LOG_LEVEL_INFO, "正在读取游戏模式...", self.log_level) log_message(LOG_LEVEL_INFO, "正在读取音效模式...", self.log_level)
h.write([0x01] + list(data)) h.write([0x01] + list(data))
# 读取响应 # 读取响应
@@ -3431,7 +3412,7 @@ eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{
if reply and len(reply) == 64: if reply and len(reply) == 64:
# 检查Report ID和同步头 # 检查Report ID和同步头
if reply[0] == 0x01 and reply[1] == 0x77 and reply[2] == 0xA5: if reply[0] == 0x01 and reply[1] == 0x77 and reply[2] == 0xA5:
# 解析游戏模式 # 解析音效模式
game_mode = reply[3] game_mode = reply[3]
# 更新UI显示 # 更新UI显示
@@ -3439,14 +3420,14 @@ eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{
if index >= 0: if index >= 0:
self.game_mode_combo.setCurrentIndex(index) self.game_mode_combo.setCurrentIndex(index)
mode_names = ["无音效", "FPS模式", "虚拟7.1"] mode_names = ["无音效", "音乐模式", "游戏模式", "AI7.1模式"]
mode_name = mode_names[game_mode] if game_mode < len(mode_names) else "未知" mode_name = mode_names[game_mode] if game_mode < len(mode_names) else "未知"
log_message(LOG_LEVEL_INFO, f"当前游戏模式: {game_mode} ({mode_name})", self.log_level) log_message(LOG_LEVEL_INFO, f"当前音效模式: {game_mode} ({mode_name})", self.log_level)
QMessageBox.information( QMessageBox.information(
self, self,
"游戏模式", "音效模式",
f"当前游戏模式: {game_mode}\n\n" f"当前音效模式: {game_mode}\n\n"
f"{mode_name}" f"{mode_name}"
) )
else: else:
@@ -3457,7 +3438,7 @@ eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{
h.close() h.close()
except Exception as e: except Exception as e:
log_message(LOG_LEVEL_ERROR, f"读取游戏模式时出错: {str(e)}", self.log_level) log_message(LOG_LEVEL_ERROR, f"读取音效模式时出错: {str(e)}", self.log_level)
def on_get_firmware_version(self): def on_get_firmware_version(self):
"""读取固件版本发送0xA6命令""" """读取固件版本发送0xA6命令"""

View File

@@ -10,6 +10,7 @@
|--------|----------|------|------|------| |--------|----------|------|------|------|
| 0x82 | SET_MIC_VOLUME | 设置麦克风增益级别 | 主机→设备 | 设置麦克风PGA增益0=静音, 1-37=0dB~36dB, 1dB/步) | | 0x82 | SET_MIC_VOLUME | 设置麦克风增益级别 | 主机→设备 | 设置麦克风PGA增益0=静音, 1-37=0dB~36dB, 1dB/步) |
| 0x83 | GET_MIC_VOLUME | 获取麦克风增益级别 | 主机→设备 | 读取当前麦克风PGA增益级别0=静音, 1-37=0dB~36dB | | 0x83 | GET_MIC_VOLUME | 获取麦克风增益级别 | 主机→设备 | 读取当前麦克风PGA增益级别0=静音, 1-37=0dB~36dB |
| 0x84 | FACTORY_RESET | 恢复出厂默认设置 | 主机→设备 | 删除Flash中所有已保存参数设备重启后自动恢复出厂默认值 |
| 0x8A | SET_EQ_MODE | 切换EQ模式 | 主机→设备 | 切换EQ模式 | | 0x8A | SET_EQ_MODE | 切换EQ模式 | 主机→设备 | 切换EQ模式 |
| 0x8B | GET_EQ_MODE | 获取当前EQ模式信息 | 主机→设备 | 读取设备当前EQ模式和名称 | | 0x8B | GET_EQ_MODE | 获取当前EQ模式信息 | 主机→设备 | 读取设备当前EQ模式和名称 |
| 0x8C | SET_MODE_GAIN_AND_NAME | 设置模式整体增益和名称 | 主机→设备 | 设置模式整体增益和名称 | | 0x8C | SET_MODE_GAIN_AND_NAME | 设置模式整体增益和名称 | 主机→设备 | 设置模式整体增益和名称 |
@@ -24,8 +25,8 @@
| 0x9D | SET_EQ_ENABLE | 设置EQ使能开关 | 主机→设备 | 设置EQ使能开关ON/OFF禁用时保存当前模式启用时恢复之前模式 | | 0x9D | SET_EQ_ENABLE | 设置EQ使能开关 | 主机→设备 | 设置EQ使能开关ON/OFF禁用时保存当前模式启用时恢复之前模式 |
| 0x9E | GET_EQ_ENABLE | 获取EQ使能开关 | 主机→设备 | 读取EQ使能开关状态ON/OFF | | 0x9E | GET_EQ_ENABLE | 获取EQ使能开关 | 主机→设备 | 读取EQ使能开关状态ON/OFF |
| 0x9F | GET_SAMPLE_FORMAT | 获取采样率和格式 | 主机→设备 | 读取当前采样率、DSD模式和DAC采样分辨率 | | 0x9F | GET_SAMPLE_FORMAT | 获取采样率和格式 | 主机→设备 | 读取当前采样率、DSD模式和DAC采样分辨率 |
| 0xA4 | SET_GAME_MODE | 设置游戏模式 | 主机→设备 | 设置游戏模式0=无音效1=FPS2=虚拟7.1 | | 0xA4 | SET_SOUND_EFFECT_MODE | 设置音效模式 | 主机→设备 | 设置音效模式0=无音效1=音乐模式2=游戏模式3=AI7.1模式 |
| 0xA5 | GET_GAME_MODE | 获取游戏模式 | 主机→设备 | 读取当前游戏模式0-2 | | 0xA5 | GET_SOUND_EFFECT_MODE | 获取音效模式 | 主机→设备 | 读取当前音效模式0-3 |
| 0xA6 | GET_FIRMWARE_VERSION | 获取固件版本 | 主机→设备 | 读取设备固件版本号BCD格式主版本.次版本.修订版本) | | 0xA6 | GET_FIRMWARE_VERSION | 获取固件版本 | 主机→设备 | 读取设备固件版本号BCD格式主版本.次版本.修订版本) |
| 0xB0 | SET_EX3D_CMD | 发送EX3D命令 | 主机→设备 | 发送EX3D设置命令封装所有EX3D SET命令 | | 0xB0 | SET_EX3D_CMD | 发送EX3D命令 | 主机→设备 | 发送EX3D设置命令封装所有EX3D SET命令 |
| 0xB1 | GET_EX3D_CMD | 读取EX3D命令 | 主机→设备 | 读取EX3D参数封装所有EX3D GET命令 | | 0xB1 | GET_EX3D_CMD | 读取EX3D命令 | 主机→设备 | 读取EX3D参数封装所有EX3D GET命令 |
@@ -98,6 +99,54 @@
- 编码器旋转导致增益变化时设备主动向主机上报当前增益最大上报37内部38时上报37 - 编码器旋转导致增益变化时设备主动向主机上报当前增益最大上报37内部38时上报37
- HID SET_MIC_VOLUME0x82命令成功执行后设备也主动上报新增益 - HID SET_MIC_VOLUME0x82命令成功执行后设备也主动上报新增益
### 2.0c 0x84 - FACTORY_RESET (恢复出厂默认设置)
**功能**: 删除Flash中所有已保存的用户参数设备重启后自动恢复出厂默认值
**方向**: 主机→设备
**数据包格式**:
```
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x77 | 同步头1
1 | 1 | 0x84 | 命令码
2-62 | 61 | 0x00 | 保留字节
```
**出厂默认参数**:
| 参数 | 出厂默认值 | 说明 |
|------|-----------|------|
| AI7.1音效模式 | 3 (AI7.1开启) | 音效模式 0=无音效, 1=音乐, 2=游戏, 3=AI7.1 |
| 脚步增强 | 12dB (全亮, 状态2) | LED全亮, 扩展增益12dB |
| 麦克风音量 | 22 (21dB) | PGA寄存器值22 = 21dB |
| 监听音量 | 15 (-14dB) | DAC level 15 = 0dB - 14 = -14dB |
| EQ参数 | 头文件预设 | 删除所有用户EQ参数恢复固件内置预设 |
| AI降噪 | 开启 | 每次上电默认开启不保存到Flash |
**设备端处理**:
1. 删除Flash中保存的以下参数文件
- `game_mode`(音效模式)
- `mic_vol`(麦克风音量)
- `dac_vol`(监听音量)
- `footstep`(脚步增强状态)
- 所有EQ参数文件调用eq_flash_clear_all
2. 设置重启标志约500ms后设备自动重启
3. 重启后自动加载出厂默认参数
**响应数据包格式**:
```
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x01 | Report ID
1 | 1 | 0x77 | 同步头1
2 | 1 | 0x84 | 同步头2
3 | 1 | uint8 | 状态码 (0x00=成功, 0x01=失败)
4-62 | 59 | 0x00 | 保留字节
```
**注意**:
- 执行后设备将在约500ms后自动重启USB连接会短暂断开后重连
- 重启后所有参数将恢复为出厂默认值
- 此操作不可撤销
### 2.1 0x8A - SET_EQ_MODE (切换EQ模式) ### 2.1 0x8A - SET_EQ_MODE (切换EQ模式)
**功能**: 切换当前EQ模式 **功能**: 切换当前EQ模式
**方向**: 主机→设备 **方向**: 主机→设备
@@ -107,7 +156,7 @@
---------|------|------|------ ---------|------|------|------
0 | 1 | 0x77 | 同步头1 0 | 1 | 0x77 | 同步头1
1 | 1 | 0x8A | 命令码 1 | 1 | 0x8A | 命令码
2 | 1 | uint8 | 模式值 (0-5: 预设模式, 6-8: 用户模式, 9: bypass) 2 | 1 | uint8 | 模式值 (0-9: 预设模式, 10-11: 用户模式)
3-62 | 60 | 0x00 | 保留字节 3-62 | 60 | 0x00 | 保留字节
``` ```
@@ -121,13 +170,13 @@
---------|------|------|------ ---------|------|------|------
0 | 1 | 0x77 | 同步头1 0 | 1 | 0x77 | 同步头1
1 | 1 | 0x8B | 命令码 1 | 1 | 0x8B | 命令码
2 | 1 | uint8 | 模式值 (0-9: 有效模式值, 0xFF: 获取当前模式信息) 2 | 1 | uint8 | 模式值 (0-11: 有效模式值, 0xFF: 获取当前模式信息)
3-62 | 60 | 0x00 | 保留字节 3-62 | 60 | 0x00 | 保留字节
``` ```
**设备端处理**: **设备端处理**:
- 如果mode值为0xFF返回当前模式值、整体增益和模式名称 - 如果mode值为0xFF返回当前模式值、整体增益和模式名称
- 如果mode值为有效模式值(0-9),返回指定模式值、整体增益和模式名称 - 如果mode值为有效模式值(0-11),返回指定模式值、整体增益和模式名称
@@ -146,7 +195,7 @@
**使用说明**: **使用说明**:
- 发送mode=0xFF时返回当前激活的EQ模式信息 - 发送mode=0xFF时返回当前激活的EQ模式信息
- 发送mode=0-9时,返回指定模式的增益和名称信息(不切换当前模式) - 发送mode=0-11时,返回指定模式的增益和名称信息(不切换当前模式)
### 2.3 0x8C - SET_MODE_GAIN_AND_NAME (设置模式整体增益和名称) ### 2.3 0x8C - SET_MODE_GAIN_AND_NAME (设置模式整体增益和名称)
**功能**: 设置EQ模式整体增益和名称 **功能**: 设置EQ模式整体增益和名称
@@ -157,7 +206,7 @@
---------|------|------|------ ---------|------|------|------
0 | 1 | 0x77 | 同步头1 0 | 1 | 0x77 | 同步头1
1 | 1 | 0x8C | 命令码 1 | 1 | 0x8C | 命令码
2 | 1 | uint8 | 模式值 (0-9) 2 | 1 | uint8 | 模式值 (0-11)
3-6 | 4 | int32 | 增益值 (范围0到-50dB有符号整数) 3-6 | 4 | int32 | 增益值 (范围0到-50dB有符号整数)
7-22 | 16 | char | 模式名称 (UTF-8编码16字节) 7-22 | 16 | char | 模式名称 (UTF-8编码16字节)
23-62 | 40 | 0x00 | 保留字节 23-62 | 40 | 0x00 | 保留字节
@@ -177,7 +226,7 @@
---------|------|------|------ ---------|------|------|------
0 | 1 | 0x77 | 同步头1 0 | 1 | 0x77 | 同步头1
1 | 1 | 0x8D | 命令码 1 | 1 | 0x8D | 命令码
2 | 1 | uint8 | 模式值 (0-9) 2 | 1 | uint8 | 模式值 (0-11)
3 | 1 | uint8 | 滤波器Band索引 (0-7) 3 | 1 | uint8 | 滤波器Band索引 (0-7)
4 | 1 | uint8 | 滤波器类型 4 | 1 | uint8 | 滤波器类型
5-8 | 4 | float | 中心频率 (Hz) 5-8 | 4 | float | 中心频率 (Hz)
@@ -211,7 +260,7 @@
---------|------|------|------ ---------|------|------|------
0 | 1 | 0x77 | 同步头1 0 | 1 | 0x77 | 同步头1
1 | 1 | 0x8E | 命令码 1 | 1 | 0x8E | 命令码
2 | 1 | uint8 | 模式值 (0-9) 2 | 1 | uint8 | 模式值 (0-11)
3 | 1 | uint8 | EQ索引 (0-7) 3 | 1 | uint8 | EQ索引 (0-7)
4-62 | 59 | 0x00 | 保留字节 4-62 | 59 | 0x00 | 保留字节
``` ```
@@ -223,7 +272,7 @@
0 | 1 | 0x01 | Report ID 0 | 1 | 0x01 | Report ID
1 | 1 | 0x77 | 同步头1 1 | 1 | 0x77 | 同步头1
2 | 1 | 0x8E | 同步头2 2 | 1 | 0x8E | 同步头2
3 | 1 | uint8 | 模式值 (0-9) 3 | 1 | uint8 | 模式值 (0-11)
4 | 1 | uint8 | 滤波器Band索引 (0-7) 4 | 1 | uint8 | 滤波器Band索引 (0-7)
5 | 1 | uint8 | 滤波器类型 5 | 1 | uint8 | 滤波器类型
6-9 | 4 | float | 中心频率 (Hz) 6-9 | 4 | float | 中心频率 (Hz)
@@ -269,7 +318,7 @@
---------|------|------|------ ---------|------|------|------
0 | 1 | 0x77 | 同步头1 0 | 1 | 0x77 | 同步头1
1 | 1 | 0x90 | 命令码 1 | 1 | 0x90 | 命令码
2 | 1 | uint8 | 模式号 (0-9, 0xFF表示恢复所有包括EQ参数总体增益模式名称 ) 2 | 1 | uint8 | 模式号 (0-11, 0xFF表示恢复所有包括EQ参数总体增益模式名称 )
3-62 | 60 | 0x00 | 保留字节 3-62 | 60 | 0x00 | 保留字节
``` ```
@@ -303,8 +352,8 @@
0 | 1 | 0x01 | Report ID 0 | 1 | 0x01 | Report ID
1 | 1 | 0x77 | 同步头1 1 | 1 | 0x77 | 同步头1
2 | 1 | 0x91 | 同步头2 2 | 1 | 0x91 | 同步头2
3 | 1 | uint8 | 模式总数 (当前为9包含0-8共9个模式,不包含禁用模式) 3 | 1 | uint8 | 模式总数 (当前为12包含0-11共12个模式,不包含禁用模式)
4 | 1 | uint8 | 预定义模式数量 (当前为6包含0-5共6个预设模式) 4 | 1 | uint8 | 预定义模式数量 (当前为10包含0-9共10个预设模式)
5-62 | 58 | 0x00 | 保留字节 5-62 | 58 | 0x00 | 保留字节
``` ```
@@ -317,7 +366,7 @@
---------|------|------|------ ---------|------|------|------
0 | 1 | 0x77 | 同步头1 0 | 1 | 0x77 | 同步头1
1 | 1 | 0x92 | 命令码 1 | 1 | 0x92 | 命令码
2 | 1 | uint8 | 模式值 (0-9: 0-5预设模式, 6-8用户模式, 9: bypass) 2 | 1 | uint8 | 模式值 (0-11: 0-9预设模式, 10-11用户模式)
3-62 | 60 | 0x00 | 保留字节 3-62 | 60 | 0x00 | 保留字节
``` ```
@@ -500,8 +549,8 @@
- 返回当前EQ使能开关状态 - 返回当前EQ使能开关状态
- 返回之前保存的模式值(如果存在) - 返回之前保存的模式值(如果存在)
### 2.27 0xA4 - SET_GAME_MODE (设置游戏模式) ### 2.27 0xA4 - SET_SOUND_EFFECT_MODE (设置音效模式)
**功能**: 设置游戏模式 **功能**: 设置音效模式
**方向**: 主机→设备 **方向**: 主机→设备
**数据包格式**: **数据包格式**:
``` ```
@@ -509,26 +558,28 @@
---------|------|------|------ ---------|------|------|------
0 | 1 | 0x77 | 同步头1 0 | 1 | 0x77 | 同步头1
1 | 1 | 0xA4 | 命令码 1 | 1 | 0xA4 | 命令码
2 | 1 | uint8 | 游戏模式值 (0=无音效, 1=FPS, 2=虚拟7.1) 2 | 1 | uint8 | 音效模式值 (0=无音效, 1=音乐模式, 2=游戏模式, 3=AI7.1模式)
3-62 | 60 | 0x00 | 保留字节 3-62 | 60 | 0x00 | 保留字节
``` ```
**参数说明**: **参数说明**:
- **游戏模式范围:** 0-2 - **音效模式范围:** 0-3
- **说明:** 选择游戏音效模式 - **说明:** 选择音效模式,与硬件按键效果相同
- 0: 无音效(标准立体声) - 0: 无音效 — 所有模式按键灯灭EQ算法关闭EX3D算法关闭
- 1: FPS模式增强定位感 - 1: 音乐模式 — 音乐键灯亮EQ算法开启EX3D算法关闭
- 2: 虚拟7.1(环绕声效果) - 2: 游戏模式 — 游戏键灯亮EQ算法开启EX3D游戏声场(SF=0)开启
- 3: AI7.1模式 — AI7.1键灯亮EQ算法开启EX3D AI7.1声场(SF=1)开启
**设备端处理**: **设备端处理**:
- 效果等同于按下相应的硬件模式按键
- 参数会通过现有的定时保存机制自动保存到Flash - 参数会通过现有的定时保存机制自动保存到Flash
- 如果参数超出范围(>2固件将拒绝设置并返回false - 如果参数超出范围(>3固件将拒绝设置并返回false
**返回值**: **返回值**:
无直接返回值。如需确认游戏模式是否设置成功请使用GET_GAME_MODE命令读取当前游戏模式。 无直接返回值。如需确认音效模式是否设置成功请使用GET_SOUND_EFFECT_MODE命令读取当前音效模式。
### 2.28 0xA5 - GET_GAME_MODE (获取游戏模式) ### 2.28 0xA5 - GET_SOUND_EFFECT_MODE (获取音效模式)
**功能**: 读取设备当前游戏模式 **功能**: 读取设备当前音效模式
**方向**: 主机→设备 **方向**: 主机→设备
**请求数据包格式**: **请求数据包格式**:
``` ```
@@ -546,7 +597,7 @@
0 | 1 | 0x01 | Report ID 0 | 1 | 0x01 | Report ID
1 | 1 | 0x77 | 同步头1 1 | 1 | 0x77 | 同步头1
2 | 1 | 0xA5 | 同步头2 2 | 1 | 0xA5 | 同步头2
3 | 1 | uint8 | 当前游戏模式 (0=无音效, 1=FPS, 2=虚拟7.1) 3 | 1 | uint8 | 当前音效模式 (0=无音效, 1=音乐模式, 2=游戏模式, 3=AI7.1模式)
4-62 | 59 | 0x00 | 保留字节 4-62 | 59 | 0x00 | 保留字节
``` ```

View File

@@ -1645,4 +1645,110 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {
}, },
} }
}, },
// 用户模式 10 (user 1) - 平坦初始值,用户可自定义
[10][0] = {
.sample_rate = 44100,
.total_bshift = 0,
.post_gain_db = 0,
.bands = {
{ .index = 0, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
{ .index = 1, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
{ .index = 2, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
{ .index = 3, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
{ .index = 4, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
{ .index = 5, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
{ .index = 6, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
{ .index = 7, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
},
.filter = {
.biquad_count = MAX_EQ_BANDS,
.state = {{0}},
.coef = {
{0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000},
{0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
},
}
},
[10][1] = {
.sample_rate = 44100,
.total_bshift = 0,
.post_gain_db = 0,
.bands = {
{ .index = 0, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
{ .index = 1, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
{ .index = 2, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
{ .index = 3, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
{ .index = 4, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
{ .index = 5, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
{ .index = 6, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
{ .index = 7, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
},
.filter = {
.biquad_count = MAX_EQ_BANDS,
.state = {{0}},
.coef = {
{0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000},
{0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
},
}
},
// 用户模式 11 (user 2) - 平坦初始值,用户可自定义
[11][0] = {
.sample_rate = 44100,
.total_bshift = 0,
.post_gain_db = 0,
.bands = {
{ .index = 0, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
{ .index = 1, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
{ .index = 2, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
{ .index = 3, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
{ .index = 4, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
{ .index = 5, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
{ .index = 6, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
{ .index = 7, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
},
.filter = {
.biquad_count = MAX_EQ_BANDS,
.state = {{0}},
.coef = {
{0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000},
{0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
},
}
},
[11][1] = {
.sample_rate = 44100,
.total_bshift = 0,
.post_gain_db = 0,
.bands = {
{ .index = 0, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
{ .index = 1, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
{ .index = 2, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
{ .index = 3, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
{ .index = 4, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
{ .index = 5, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
{ .index = 6, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
{ .index = 7, .type = FILTER_TYPE_BYPASS, .fc = 1000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f },
},
.filter = {
.biquad_count = MAX_EQ_BANDS,
.state = {{0}},
.coef = {
{0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000},
{0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
},
}
},
}; };

View File

@@ -226,7 +226,7 @@ int led_set_brightness(led_control_t *ctx,
int led_on(led_control_t *ctx, led_id_t led) int led_on(led_control_t *ctx, led_id_t led)
{ {
return led_set_brightness(ctx, led, 1/*255*/); return led_set_brightness(ctx, led, 30/*255*/);
} }
int led_off(led_control_t *ctx, led_id_t led) int led_off(led_control_t *ctx, led_id_t led)

View File

@@ -425,12 +425,13 @@ extern void dsp_core0(void);
extern void board_setup(); extern void board_setup();
extern void dsp_main (chanend c_data); extern void dsp_main (chanend c_data);
extern void SetEqDataChan (chanend c); extern void SetEqDataChan (chanend c);
extern void SetEx3dHidChan (chanend c);
extern int dsp_worker_tile(chanend c_dsp_to_ex3d, int worker_id); extern int dsp_worker_tile(chanend c_dsp_to_ex3d, int worker_id);
//extern int dsp_worker_tile_1(chanend c_dsp_to_ex3d, int worker_id); //extern int dsp_worker_tile_1(chanend c_dsp_to_ex3d, int worker_id);
extern void ex3d_task(); extern void ex3d_task();
extern void hid_button_task(chanend cc_mic_level, chanend c_hid, chanend c_hidSendData, chanend c_uac_vol); extern void hid_button_task(chanend cc_mic_level, chanend c_hid, chanend c_hidSendData, chanend c_uac_vol, chanend c_ex3d_hid_cmd);
extern void AudioHwRemote(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol); extern void AudioHwRemote(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol, chanend c_audiohw_rx);
extern void dnr_dsp_proc_task(void); extern void dnr_dsp_proc_task(void);
extern unsafe chanend uc_dsp_to_ex3d[DSP_WORKER_COUNT]; extern unsafe chanend uc_dsp_to_ex3d[DSP_WORKER_COUNT];
@@ -531,12 +532,14 @@ int main()
USER_MAIN_DECLARATIONS USER_MAIN_DECLARATIONS
chan c_dsp_to_ex3d[DSP_WORKER_COUNT]; chan c_dsp_to_ex3d[DSP_WORKER_COUNT];
chan cc_mic_level; chan cc_mic_level;
chan c_key; chan c_hidSendData; chan c_audiohw;
chan c_hidRcvData; chan c_key; chan c_hidSendData;
chan c_eq_data; chan c_hidRcvData;
chan c_eq_data;
chan c_uac_vol; chan c_uac_vol;
chan c_ex3d_hid_cmd;
par par
{ {
@@ -544,7 +547,8 @@ int main()
on tile[1] : { on tile[1] : {
par { par {
unsafe { unsafe {
hid_button_task(cc_mic_level, c_hidRcvData, c_hidSendData, c_uac_vol); uc_audiohw = (chanend)c_audiohw;
hid_button_task(cc_mic_level, c_hidRcvData, c_hidSendData, c_uac_vol, c_ex3d_hid_cmd);
} }
#if USE_EX3D == 1 #if USE_EX3D == 1
par(int i = 0; i < DSP_WORKER_COUNT; i++) par(int i = 0; i < DSP_WORKER_COUNT; i++)
@@ -568,7 +572,7 @@ int main()
#if USE_EX3D == 1 #if USE_EX3D == 1
unsafe { key_receiver(c_key); } unsafe { key_receiver(c_key); }
#endif #endif
AudioHwRemote(c_hidSendData, cc_mic_level, c_uac_vol); AudioHwRemote(c_hidSendData, cc_mic_level, c_uac_vol, c_audiohw);
} }
} }
} }
@@ -675,6 +679,7 @@ int main()
{ {
thread_speed(); thread_speed();
#if (USE_EX3D == 1) && (HID_CONTROLS > 0) #if (USE_EX3D == 1) && (HID_CONTROLS > 0)
SetEx3dHidChan(c_ex3d_hid_cmd);
XUA_Endpoint0( c_xud_out[0], c_xud_in[0], c_hidRcvData, c_aud_ctl, c_mix_ctl, c_clk_ctl, c_EANativeTransport_ctrl, dfuInterface VENDOR_REQUESTS_PARAMS_); XUA_Endpoint0( c_xud_out[0], c_xud_in[0], c_hidRcvData, c_aud_ctl, c_mix_ctl, c_clk_ctl, c_EANativeTransport_ctrl, dfuInterface VENDOR_REQUESTS_PARAMS_);
#else #else
XUA_Endpoint0( c_xud_out[0], c_xud_in[0], c_aud_ctl, c_mix_ctl, c_clk_ctl, c_EANativeTransport_ctrl, dfuInterface VENDOR_REQUESTS_PARAMS_); XUA_Endpoint0( c_xud_out[0], c_xud_in[0], c_aud_ctl, c_mix_ctl, c_clk_ctl, c_EANativeTransport_ctrl, dfuInterface VENDOR_REQUESTS_PARAMS_);