Compare commits
10 Commits
3057690b98
...
17ad9324de
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
17ad9324de | ||
|
|
93a74910bf | ||
|
|
fbcd59dfc6 | ||
|
|
5d6cd95ed9 | ||
|
|
b7e21b5fc7 | ||
|
|
8a1af892aa | ||
|
|
80d3dda19d | ||
|
|
f3d757417c | ||
|
|
c9235923ed | ||
|
|
e7975a9a5c |
@@ -31,7 +31,7 @@ XUD_Result_t HidInterfaceClassRequests(
|
||||
#endif
|
||||
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 char buffer[65] = {0};
|
||||
#endif
|
||||
@@ -41,8 +41,10 @@ XUD_Result_t HidInterfaceClassRequests(
|
||||
case HID_GET_REPORT:
|
||||
unsigned ret_len = 65;
|
||||
|
||||
#if ((USE_EX3D == 1) || (EQ_EN == 1))
|
||||
buffer[0] = 0x1;
|
||||
process_read_params(&buffer[1]);
|
||||
#endif
|
||||
#if DEBUG_MEMORY_LOG_ENABLED
|
||||
ret_len = 65;
|
||||
UserReadHIDLog(&buffer[1]);
|
||||
@@ -64,7 +66,7 @@ XUD_Result_t HidInterfaceClassRequests(
|
||||
case HID_GET_PROTOCOL:
|
||||
/* Do nothing - i.e. STALL */
|
||||
break;
|
||||
|
||||
|
||||
#if ((USE_EX3D == 1) || (EQ_EN == 1))
|
||||
case HID_SET_REPORT:
|
||||
result = XUD_GetBuffer(c_ep0_out, (buffer, unsigned char[]), datalength);
|
||||
@@ -97,7 +99,7 @@ XUD_Result_t HidInterfaceClassRequests(
|
||||
|
||||
case HID_SET_PROTOCOL:
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
-DI2S_CHANS_ADC=2
|
||||
-DAUDIO_CLASS=1
|
||||
-DAUDIO_CLASS=1
|
||||
-DMIN_FREQ=48000
|
||||
-DMAX_FREQ=48000
|
||||
-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
|
||||
-DI2S_CHANS_ADC=2
|
||||
-DMIN_FREQ=48000
|
||||
-DMIN_FREQ=44100
|
||||
-DMAX_FREQ=192000
|
||||
-DF1_MUSIC_UAC2=1
|
||||
#-DUSE_EX3D
|
||||
@@ -154,7 +154,7 @@ set(APP_COMPILER_FLAGS_f1_music_uac2 ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC
|
||||
-DMIN_VOLUME=0xE000
|
||||
-DINPUT_VOLUME_CONTROL=1
|
||||
-DOUTPUT_VOLUME_CONTROL=1
|
||||
-DDEBUG_MEMORY_LOG_ENABLED=1
|
||||
#-DDEBUG_MEMORY_LOG_ENABLED=1
|
||||
-DXUA_DFU_EN=1
|
||||
#-DIR_SWITCHING_MODE
|
||||
-DHID_CONTROLS=1)
|
||||
|
||||
@@ -110,12 +110,20 @@
|
||||
/*** Defines relating to audio frequencies ***/
|
||||
/* Master clock defines (in Hz) */
|
||||
#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 */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#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 */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Minumum sample frequency device runs at */
|
||||
#ifndef MIN_FREQ
|
||||
|
||||
@@ -93,11 +93,17 @@ unsigned g_format_delay_time = 0;
|
||||
unsigned g_mclk_select = 0;
|
||||
// 改动原因:添加LED开关全局变量,控制LED是否显示(0=关闭,1=开启)
|
||||
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();
|
||||
unsigned g_disable_i2c = 0;
|
||||
unsigned g_dac_mode = 10;
|
||||
unsigned g_new_dac_mode = 0;
|
||||
unsigned g_samfreq = 48000;
|
||||
unsafe chanend uc_audiohw; // tile[1] end: AudioHwConfig → button_task (tile[0])
|
||||
// 改动原因:添加DSD模式全局变量,用于HID命令读取采样率和格式信息(已去掉DAC采样分辨率)
|
||||
unsigned g_dsd_mode = 0; // DSD模式:0=PCM, >0=DSD
|
||||
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
|
||||
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();
|
||||
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);
|
||||
|
||||
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 变量
|
||||
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),
|
||||
// 2=game (LED_GAME_MODE, IR_GAME), 3=AI7.1 (LED_AI7_1, IR_7_1_GAME)
|
||||
unsigned active_mode = 0;
|
||||
unsigned flag_footsteps_enhancement = 0;
|
||||
unsigned flag_aidenoise_onoff = 0;
|
||||
// 脚步增强3档状态: 0=关(0dB), 1=中亮/6dB, 2=高亮/12dB;出厂默认开启(12dB)
|
||||
unsigned flag_footsteps_enhancement = 2;
|
||||
// 出厂默认:AI降噪开启
|
||||
unsigned flag_aidenoise_onoff = 1;
|
||||
|
||||
// Buttons state
|
||||
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);
|
||||
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)
|
||||
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);
|
||||
}
|
||||
#else
|
||||
// if (saved_mode == 255)
|
||||
{
|
||||
#if defined(F1_MUSIC_UAC2)
|
||||
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
|
||||
if (saved_mode == 255) {
|
||||
// 出厂默认:AI7.1开启(mode=3)
|
||||
saved_mode = 3;
|
||||
save_value(path, 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;
|
||||
{
|
||||
unsigned hid_mode_init = (active_mode >= 2) ? (active_mode - 1) : 0;
|
||||
SET_SHARED_GLOBAL(g_game_mode, hid_mode_init);
|
||||
debug_printf("active_mode=%d hid_mode=%d\n", active_mode, hid_mode_init);
|
||||
SET_SHARED_GLOBAL(g_game_mode, active_mode);
|
||||
debug_printf("active_mode=%d\n", active_mode);
|
||||
}
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
|
||||
// 设置PWM频率为22kHz (避免可闻噪声)
|
||||
//htr3236_set_frequency(i2c, HTR3236_FREQ_22KHZ);
|
||||
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");
|
||||
|
||||
|
||||
// 初始化LED控制
|
||||
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)
|
||||
codec_adc_pga_gain_reg_value = saved_mic;
|
||||
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);
|
||||
if(saved_dac <= DAC_LEVEL_MAX)
|
||||
dac_level = saved_dac;
|
||||
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
|
||||
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 <: hid_mode_startup;
|
||||
debug_printf("Sent hid_mode %d (active_mode=%d) to hid_button_task\n", hid_mode_startup, active_mode);
|
||||
cc_mic_level <: 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_ctrl_keys = 0;//port_in(p_ctrl_keys);
|
||||
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)
|
||||
for (int i=1; i<(HID_MAX_DATA_BYTES/4); i++) {
|
||||
//reportData[i] = chan_in_word(c_hidSendData);
|
||||
c_hidSendData :> reportData[i];
|
||||
}
|
||||
hidSetChangePending(1);
|
||||
@@ -691,6 +736,65 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
|
||||
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 :
|
||||
{
|
||||
//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_game_mode :> button_game_mode; // 1L
|
||||
p_button_ai71_onoff :> button_ai71_onoff; // 1M
|
||||
|
||||
|
||||
p_mic_gain_encoder1 :> mic_encoder1; // 4F2
|
||||
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;
|
||||
|
||||
// 处理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) {
|
||||
// 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);
|
||||
|
||||
// Always update g_game_mode so 0xA5 reads correctly
|
||||
SET_SHARED_GLOBAL(g_game_mode, active_mode);
|
||||
#if USE_EX3D == 1
|
||||
{
|
||||
// hid_mode: 0=IR_OFF, 1=IR_GAME, 2=IR_7_1_GAME
|
||||
unsigned hid_mode = (active_mode >= 2) ? (active_mode - 1) : 0;
|
||||
SET_SHARED_GLOBAL(g_game_mode, hid_mode);
|
||||
// sound_effect_mode: 0=无音效, 1=音乐, 2=游戏, 3=AI7.1
|
||||
cc_mic_level <: 0xFC;
|
||||
cc_mic_level <: hid_mode;
|
||||
debug_printf("Mode changed: active=%d hid=%d\n", active_mode, hid_mode);
|
||||
cc_mic_level <: active_mode;
|
||||
debug_printf("Mode changed: active_mode=%d\n", active_mode);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#if USE_EX3D == 1
|
||||
mode_change = 0;
|
||||
if(button_footsteps_enhancement == 0)
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
push_button_footsteps_enhancement_state_old = button_footsteps_enhancement;
|
||||
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);
|
||||
}
|
||||
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;
|
||||
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);
|
||||
#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;
|
||||
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(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;
|
||||
for(int i = 0; i <= current_mic_led_pos; i++)
|
||||
{
|
||||
if ((i < 15) && (i >= 0))
|
||||
// 点亮L系列当前位置
|
||||
led_off(&led_ctx, led_l_physical_map[i]);
|
||||
}
|
||||
}
|
||||
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;
|
||||
for(int i = 0; i <= current_mic_led_pos; i++)
|
||||
{
|
||||
if ((i < 15) && (i >= 0))
|
||||
// 点亮L系列当前位置
|
||||
led_on(&led_ctx, led_l_physical_map[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// 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 encode_input1 = ((mic_encoder1 & 0b0100) != 0); // 4F2
|
||||
|
||||
|
||||
if(rotating) {
|
||||
if(!rotation_active) {
|
||||
// 旋转开始
|
||||
prev_encode_input1 = encode_input1;
|
||||
sample_count = 1;
|
||||
rotation_active = 1;
|
||||
|
||||
|
||||
// 根据上次方向预判
|
||||
if(fast_rotation_mode) {
|
||||
// 快速模式只需要2次采样
|
||||
@@ -951,14 +1154,14 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
|
||||
}
|
||||
} else {
|
||||
sample_count++;
|
||||
|
||||
|
||||
// 动态调整采样次数:快速模式用2次,普通模式用3次
|
||||
uint8_t required_samples = fast_rotation_mode ? 2 : 3;
|
||||
|
||||
|
||||
if(sample_count >= required_samples) {
|
||||
if(encode_input1 != prev_encode_input1) {
|
||||
uint8_t current_dir = encode_input1 ? 1 : 2;
|
||||
|
||||
|
||||
// 执行音量调节
|
||||
if(current_dir == 1) { // 顺时针
|
||||
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;
|
||||
debug_printf("volume down %d\n", 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];
|
||||
|
||||
|
||||
// 如果LED数减少,关闭减少的那个LED
|
||||
if(new_led_count < old_led_count) {
|
||||
// 关闭的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) {
|
||||
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;
|
||||
fast_rotation_mode = 0; // 方向变化,退出快速模式
|
||||
}
|
||||
|
||||
|
||||
last_valid_direction = current_dir;
|
||||
rotation_active = 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_encode_input1 = ((hp_encoder & 0b00010000) != 0); // 8D4
|
||||
|
||||
|
||||
if(hp_rotating) {
|
||||
if(!hp_rotation_active) {
|
||||
// 旋转开始
|
||||
hp_prev_encode_input1 = hp_encode_input1;
|
||||
hp_sample_count = 1;
|
||||
hp_rotation_active = 1;
|
||||
|
||||
|
||||
// 根据上次方向预判
|
||||
if(hp_fast_rotation_mode) {
|
||||
// 快速模式只需要2次采样
|
||||
@@ -1050,14 +1253,14 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
|
||||
}
|
||||
} else {
|
||||
hp_sample_count++;
|
||||
|
||||
|
||||
// 动态调整采样次数:快速模式用2次,普通模式用3次
|
||||
uint8_t hp_required_samples = hp_fast_rotation_mode ? 2 : 3;
|
||||
|
||||
|
||||
if(hp_sample_count >= hp_required_samples) {
|
||||
if(hp_encode_input1 != hp_prev_encode_input1) {
|
||||
uint8_t hp_current_dir = hp_encode_input1 ? 1 : 2;
|
||||
|
||||
|
||||
// 执行音量调节
|
||||
if(hp_current_dir == 1) { // 顺时针
|
||||
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) {
|
||||
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_fast_rotation_mode = 0; // 方向变化,退出快速模式
|
||||
}
|
||||
|
||||
|
||||
hp_last_valid_direction = hp_current_dir;
|
||||
hp_rotation_active = 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(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;
|
||||
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
|
||||
{
|
||||
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;
|
||||
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];
|
||||
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);
|
||||
{
|
||||
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 */
|
||||
void AudioHwConfig(unsigned samFreq, unsigned mClk, unsigned dsdMode, unsigned sampRes_DAC, unsigned sampRes_ADC)
|
||||
{
|
||||
static unsigned count = 0;
|
||||
g_samfreq = samFreq;
|
||||
{
|
||||
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; }
|
||||
}
|
||||
|
||||
@@ -133,6 +133,7 @@ float fLevel[NUM_USB_CHAN_OUT] = {0,};
|
||||
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 unsigned int is_eq_disabled(void);
|
||||
extern unsigned int g_eq_enable;
|
||||
void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[])
|
||||
{
|
||||
uint32_t is_3d;
|
||||
@@ -819,7 +820,7 @@ void update_button(unsigned char b)
|
||||
|
||||
extern uint8_t mic_vol;
|
||||
//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)
|
||||
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(
|
||||
CASE_THEN(cc_mic_level, event_mic_vol)
|
||||
, CASE_THEN(c_hidRcvData, event_hid)
|
||||
, CASE_THEN(c_ex3d_hid_cmd, event_ex3d_hid)
|
||||
, CASE_THEN(timer, event_polling)
|
||||
, 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);
|
||||
|
||||
if (current_mode_local == 0) {
|
||||
// 关闭算法
|
||||
// 无音效模式:关闭EX3D和EQ算法
|
||||
audio_ex3d_set_onoff(0);
|
||||
g_eq_enable = 0;
|
||||
#if IR_SWITCHING_MODE
|
||||
is_3d_on = IR_OFF;
|
||||
#else
|
||||
is_3d_on = A3D_OFF;
|
||||
#endif
|
||||
debug_printf("Mode 0: algorithm OFF\n");
|
||||
debug_printf("Mode 0: EX3D+EQ OFF\n");
|
||||
} 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 0,EQ开启
|
||||
g_eq_enable = 1;
|
||||
#if IR_SWITCHING_MODE
|
||||
audio_ex3d_set_sf(0); // SF 0 = STEREO 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;
|
||||
#endif
|
||||
audio_ex3d_set_onoff(1);
|
||||
debug_printf("Mode 1: GAME (IR_GAME) ON, sf=0\n");
|
||||
} else if (current_mode_local == 2) {
|
||||
// AI7.1模式 (IR_7_1_GAME, 7.1): SF index 1
|
||||
debug_printf("Mode 2: GAME (IR_GAME) ON, sf=0, EQ ON\n");
|
||||
} else if (current_mode_local == 3) {
|
||||
// AI7.1模式 (IR_7_1_GAME, 7.1): SF index 1,EQ开启
|
||||
g_eq_enable = 1;
|
||||
#if IR_SWITCHING_MODE
|
||||
audio_ex3d_set_sf(1); // SF 1 = SPATIAL GAME (7.1)
|
||||
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;
|
||||
#endif
|
||||
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);
|
||||
} 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 {
|
||||
// Mic 静音状态命令
|
||||
switch (tmp) {
|
||||
@@ -922,21 +945,58 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
|
||||
|
||||
event_hid:
|
||||
{
|
||||
//uint8_t junk=chan_in_byte(c_hid);
|
||||
unsigned length = chan_in_byte(c_hidRcvData);
|
||||
for(int i=0; i<length; i++) {
|
||||
RcvData[i] = chan_in_byte(c_hidRcvData);
|
||||
}
|
||||
if(RcvData[0] == 0x01) { // REPORT ID 1
|
||||
#if (HID_CONTROLS == 1)
|
||||
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]);
|
||||
// 0xB0/0xB1命令由process_send_params通过c_ex3d_hid_cmd直接发到tile1处理
|
||||
// 这里只需跳过,不再通过c_hidSendData回传结果
|
||||
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
|
||||
}
|
||||
}
|
||||
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_params(16个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:
|
||||
{
|
||||
|
||||
@@ -25,6 +25,9 @@ extern void device_reboot(void);
|
||||
#include "biquad_standalone.h"
|
||||
#include "eq_flash_storage.h"
|
||||
#include "user_func.h"
|
||||
#if (USE_EX3D == 1) && (HID_CONTROLS == 1)
|
||||
#include <xcore/channel.h>
|
||||
#endif
|
||||
|
||||
static struct {
|
||||
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);
|
||||
#if (USE_EX3D == 1) && (HID_CONTROLS == 1)
|
||||
extern void hid_receive_task_in_c(unsigned char * RcvData, unsigned * SendData);
|
||||
#ifndef HID_MAX_DATA_BYTES
|
||||
#define HID_MAX_DATA_BYTES (64)
|
||||
#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) {
|
||||
if (len < 60) {
|
||||
return false;
|
||||
@@ -684,31 +698,23 @@ unsigned char process_send_params(uint8_t data[], uint16_t len) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// 处理设置游戏模式命令 (0xA4) - SET_GAME_MODE
|
||||
// 处理设置音效模式命令 (0xA4) - SET_SOUND_EFFECT_MODE
|
||||
// 0=无音效(EQ/EX3D全关), 1=音乐模式, 2=游戏模式, 3=AI7.1模式
|
||||
if (data[1] == 0xA4) {
|
||||
uint8_t game_mode = data[2];
|
||||
|
||||
// 参数验证
|
||||
if (game_mode > 2) {
|
||||
// 参数验证:0-3
|
||||
if (game_mode > 3) {
|
||||
return false;
|
||||
}
|
||||
|
||||
extern unsigned g_uac_mode;
|
||||
unsigned uac_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);
|
||||
}
|
||||
extern unsigned g_request_game_mode;
|
||||
SET_SHARED_GLOBAL(g_request_game_mode, game_mode);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// 处理获取游戏模式命令 (0xA5) - GET_GAME_MODE
|
||||
// 处理获取音效模式命令 (0xA5) - GET_SOUND_EFFECT_MODE
|
||||
if (data[1] == 0xA5) {
|
||||
read_request.pending_cmd = 0xA5;
|
||||
return true;
|
||||
@@ -720,18 +726,58 @@ unsigned char process_send_params(uint8_t data[], uint16_t len) {
|
||||
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
|
||||
// 数据通过 g_ex3d_hid_chanend 直接传到tile1的hid_button_task执行,结果同步返回
|
||||
if (data[1] == 0xB0 || data[1] == 0xB1) {
|
||||
#if (USE_EX3D == 1) && (HID_CONTROLS == 1)
|
||||
if (!g_ex3d_hid_chanend) return false;
|
||||
|
||||
// 提取EX3D命令码(4字节,小端序)
|
||||
uint32_t ex3d_cmd = (uint32_t)data[2] | ((uint32_t)data[3] << 8) |
|
||||
((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_params_len = (len > 62) ? 56 : (len - 6);
|
||||
memcpy(ex3d_request.ex3d_params, &data[6], ex3d_request.ex3d_params_len);
|
||||
ex3d_request.ex3d_params_len = params_len;
|
||||
if (params_len > 0) memcpy(ex3d_request.ex3d_params, &data[6], params_len);
|
||||
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;
|
||||
#else
|
||||
return false;
|
||||
@@ -819,7 +865,8 @@ void init_mode_info(void) {
|
||||
// 初始化默认模式名称
|
||||
const char* default_names[NUM_EQ_MODES] = {
|
||||
"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)
|
||||
@@ -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
|
||||
unsigned char process_read_params(uint8_t response[]) {
|
||||
memset(response, 0, 63);
|
||||
@@ -940,12 +970,11 @@ unsigned char process_read_params(uint8_t response[]) {
|
||||
if (read_request.pending_cmd == 0x91) {
|
||||
RSP_HDR(response, 0x91);
|
||||
|
||||
// 模式总数:预定义模式(0-5) + 用户模式(6-8) = 9,不包含禁用模式(10)
|
||||
// 注意:NUM_EQ_MODES = 10,但实际可用模式是0-8共9个(不包含禁用模式10)
|
||||
uint8_t mode_count = NUM_EQ_MODES; // 固定返回10
|
||||
// 模式总数:预定义模式(0-9) + 用户模式(10-11) = 12,不包含禁用模式(12)
|
||||
uint8_t mode_count = NUM_EQ_MODES; // 固定返回12
|
||||
response[2] = mode_count;
|
||||
|
||||
// 预定义模式数量:0-6共7个预设模式
|
||||
// 预定义模式数量:0-9共10个预设模式
|
||||
uint8_t preset_mode_count = EQ_PRESET_MODE_MAX + 1;
|
||||
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);
|
||||
|
||||
// 当前游戏模式 (1字节,位置2)
|
||||
#if UAC2 == 1
|
||||
response[2] = 0;
|
||||
#else
|
||||
response[2] = (uint8_t)game_mode;
|
||||
#endif
|
||||
|
||||
read_request.pending_cmd = 0; // Clear read request flag
|
||||
return true;
|
||||
@@ -1067,21 +1092,24 @@ unsigned char process_read_params(uint8_t response[]) {
|
||||
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
|
||||
// 结果已在process_send_params中同步从tile1获取,存于ex3d_b0b1_result
|
||||
if (ex3d_request.pending_cmd == 0xB0) {
|
||||
RSP_HDR(response, 0xB0);
|
||||
|
||||
#if (USE_EX3D == 1) && (HID_CONTROLS == 1)
|
||||
unsigned char rcv_data[64];
|
||||
unsigned send_data[16];
|
||||
ex3d_build_and_call(rcv_data, send_data);
|
||||
unsigned *send_data = ex3d_b0b1_result;
|
||||
|
||||
// 状态码:检查send_data[1]是否有错误返回值(0xFFFFFFFF表示参数错误)
|
||||
uint8_t status = 0x00; // 默认成功
|
||||
if (send_data[1] == 0xFFFFFFFF) {
|
||||
status = 0x01; // 失败
|
||||
}
|
||||
|
||||
uint8_t status = (send_data[1] == 0xFFFFFFFF) ? 0x01 : 0x00;
|
||||
response[2] = status;
|
||||
|
||||
// 回显命令码(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[6] = (uint8_t)((ex3d_request.ex3d_command_code >> 24) & 0xFF);
|
||||
|
||||
// 返回send_data中的返回值(如果有)
|
||||
if (send_data[1] != 0xFFFFFFFF) {
|
||||
// 某些SET命令可能返回数据,将send_data[1]开始的数据复制到响应
|
||||
response[7] = (uint8_t)(send_data[1] & 0xFF);
|
||||
response[8] = (uint8_t)((send_data[1] >> 8) & 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;
|
||||
}
|
||||
// 返回send_data[1]中的返回值
|
||||
response[7] = (uint8_t)(send_data[1] & 0xFF);
|
||||
response[8] = (uint8_t)((send_data[1] >> 8) & 0xFF);
|
||||
response[9] = (uint8_t)((send_data[1] >> 16) & 0xFF);
|
||||
response[10] = (uint8_t)((send_data[1] >> 24) & 0xFF);
|
||||
#else
|
||||
response[2] = 0x01; // 失败:EX3D支持未启用
|
||||
#endif
|
||||
@@ -1113,13 +1132,12 @@ unsigned char process_read_params(uint8_t response[]) {
|
||||
}
|
||||
|
||||
// 处理读取EX3D命令响应 (0xB1) - GET_EX3D_CMD
|
||||
// 结果已在process_send_params中同步从tile1获取,存于ex3d_b0b1_result
|
||||
if (ex3d_request.pending_cmd == 0xB1) {
|
||||
RSP_HDR(response, 0xB1);
|
||||
|
||||
#if (USE_EX3D == 1) && (HID_CONTROLS == 1)
|
||||
unsigned char rcv_data[64];
|
||||
unsigned send_data[16];
|
||||
ex3d_build_and_call(rcv_data, send_data);
|
||||
unsigned *send_data = ex3d_b0b1_result;
|
||||
|
||||
// 回显命令码(4字节)
|
||||
response[2] = (uint8_t)(ex3d_request.ex3d_command_code & 0xFF);
|
||||
|
||||
@@ -7,15 +7,15 @@
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#define NUM_EQ_MODES 10
|
||||
#define NUM_EQ_MODES 12
|
||||
#define NUM_EQ_CHANS 2
|
||||
#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_MAX 6 // 预设模式最大编号(preset1-preset6)
|
||||
#define EQ_USER_MODE_MIN 7 // 用户模式最小编号
|
||||
#define EQ_USER_MODE_MAX 9 // 用户模式最大编号(user 1-4)
|
||||
#define EQ_MODE_MAX (NUM_EQ_MODES) // 模式最大编号(user 1-4)
|
||||
#define EQ_PRESET_MODE_MAX 9 // 预设模式最大编号(preset1-preset10)
|
||||
#define EQ_USER_MODE_MIN 10 // 用户模式最小编号
|
||||
#define EQ_USER_MODE_MAX 11 // 用户模式最大编号(user 1-2)
|
||||
#define EQ_MODE_MAX (NUM_EQ_MODES) // 模式最大编号
|
||||
|
||||
|
||||
// Filter type definition
|
||||
|
||||
@@ -53,8 +53,8 @@ from filter_utils import (BiquadFilterCalculator, make_biquad_bypass, make_biqua
|
||||
|
||||
# 常量定义
|
||||
MAX_EQ_BANDS = 8 # 最大EQ滤波器数量 (0-7)
|
||||
NUM_EQ_MODES = 10 # EQ模式数量
|
||||
EQ_DISABLED_MODE = 10 # 禁用EQ的模式编号
|
||||
NUM_EQ_MODES = 12 # EQ模式数量(10预设 + 2用户)
|
||||
EQ_DISABLED_MODE = 12 # 禁用EQ的模式编号
|
||||
|
||||
class BandFilter(QGroupBox):
|
||||
"""单个滤波器带控件"""
|
||||
@@ -406,6 +406,10 @@ class EQDesigner(QMainWindow):
|
||||
self.total_bshift = 0 # 初始化total_bshift为0
|
||||
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()
|
||||
@@ -522,12 +526,14 @@ class EQDesigner(QMainWindow):
|
||||
|
||||
|
||||
# 添加音效模式设置组
|
||||
mode_group = QGroupBox("音效模式设置")
|
||||
mode_group = QGroupBox("EQ模式")
|
||||
self.ui_groups['mode'] = mode_group # 保存引用
|
||||
mode_layout = QFormLayout(mode_group)
|
||||
self.mode_label = QLabel("音效模式:")
|
||||
self.mode_label = QLabel("EQ模式:")
|
||||
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)
|
||||
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)
|
||||
|
||||
# 切换音效模式按钮(只发送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.hide()
|
||||
mode_layout.addRow(self.switch_mode_btn)
|
||||
|
||||
# 获取音效模式按钮(只处理0x8B命令)
|
||||
# 改动原因:移除hide()调用,让按钮显示出来,方便用户获取当前模式
|
||||
self.get_mode_btn = QPushButton("获取当前音效模式")
|
||||
self.get_mode_btn = QPushButton("获取当前EQ模式")
|
||||
self.get_mode_btn.clicked.connect(self.on_get_mode)
|
||||
mode_layout.addRow(self.get_mode_btn)
|
||||
|
||||
# 设置并保存音效模式按钮(发送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)
|
||||
mode_layout.addRow(self.set_and_save_mode_btn)
|
||||
|
||||
@@ -560,17 +566,17 @@ class EQDesigner(QMainWindow):
|
||||
|
||||
# 添加音效参数配置组(EQ参数相关,可通过菜单隐藏)
|
||||
# 改动原因:将音效参数配置组也添加到ui_groups中,使其可以通过菜单隐藏/显示
|
||||
param_group = QGroupBox("音效参数配置")
|
||||
param_group = QGroupBox("EQ参数配置")
|
||||
self.ui_groups['param'] = 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)
|
||||
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.clicked.connect(self.on_read_params)
|
||||
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)
|
||||
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)
|
||||
|
||||
# 添加设备模式控制组(增益模式、滤波器模式、游戏模式)
|
||||
device_mode_group = QGroupBox("设备模式控制")
|
||||
# 添加音效模式控制组
|
||||
device_mode_group = QGroupBox("音效模式控制")
|
||||
self.ui_groups['device_mode'] = 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()
|
||||
self.game_mode_combo = QComboBox()
|
||||
self.game_mode_combo.addItem("无音效 (0)", 0)
|
||||
self.game_mode_combo.addItem("FPS模式 (1)", 1)
|
||||
self.game_mode_combo.addItem("虚拟7.1 (2)", 2)
|
||||
game_control_layout.addWidget(QLabel("游戏模式:"))
|
||||
self.game_mode_combo.addItem("音乐模式 (1)", 1)
|
||||
self.game_mode_combo.addItem("游戏模式 (2)", 2)
|
||||
self.game_mode_combo.addItem("AI7.1模式 (3)", 3)
|
||||
game_control_layout.addWidget(QLabel("音效模式:"))
|
||||
game_control_layout.addWidget(self.game_mode_combo)
|
||||
device_mode_layout.addRow(game_control_layout)
|
||||
|
||||
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.get_game_mode_btn = QPushButton("读取游戏模式")
|
||||
self.get_game_mode_btn = QPushButton("读取音效模式")
|
||||
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.get_game_mode_btn)
|
||||
@@ -720,113 +688,15 @@ class EQDesigner(QMainWindow):
|
||||
firmware_btn_layout.addWidget(self.get_firmware_version_btn)
|
||||
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)
|
||||
|
||||
# 添加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_enable_group = QGroupBox("EQ使能控制")
|
||||
@@ -1005,12 +875,10 @@ class EQDesigner(QMainWindow):
|
||||
# 改动原因:添加'param'(音效参数配置)到菜单控制列表中
|
||||
group_names = {
|
||||
'device_info': '设备信息',
|
||||
'mode': '音效模式设置',
|
||||
'param': '音效参数配置',
|
||||
'mode': 'EQ模式',
|
||||
'param': 'EQ参数配置',
|
||||
'volume': '音量控制',
|
||||
'device_mode': '设备模式控制',
|
||||
'led': 'LED控制',
|
||||
'uac': 'UAC模式控制',
|
||||
'device_mode': '音效模式控制',
|
||||
'eq_enable': 'EQ使能控制',
|
||||
'ex3d': 'EX3D控制'
|
||||
}
|
||||
@@ -1034,12 +902,10 @@ class EQDesigner(QMainWindow):
|
||||
if group_key in self.view_actions:
|
||||
group_names = {
|
||||
'device_info': '设备信息',
|
||||
'mode': '音效模式设置',
|
||||
'param': '音效参数配置',
|
||||
'mode': 'EQ模式',
|
||||
'param': 'EQ参数配置',
|
||||
'volume': '音量控制',
|
||||
'device_mode': '设备模式控制',
|
||||
'led': 'LED控制',
|
||||
'uac': 'UAC模式控制',
|
||||
'device_mode': '音效模式控制',
|
||||
'eq_enable': 'EQ使能控制',
|
||||
'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.read_parameters()
|
||||
log_message(LOG_LEVEL_DEBUG, f"找到设备: {info}", self.log_level)
|
||||
# 启动HID通知轮询,接收设备主动上报(0x9F采样率变化等)
|
||||
self._notification_timer.start(200)
|
||||
|
||||
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:
|
||||
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):
|
||||
"""获取EQ模式总数(发送0x91命令)"""
|
||||
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,
|
||||
f"采样率和格式信息: 采样率={samfreq}Hz, 格式={format_type}",
|
||||
self.log_level)
|
||||
self._update_sample_format_status(samfreq, dsd_mode)
|
||||
QMessageBox.information(
|
||||
self,
|
||||
"采样率和格式信息",
|
||||
@@ -2537,6 +2483,41 @@ eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{
|
||||
except Exception as e:
|
||||
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):
|
||||
"""获取LED信息(发送0x95命令)"""
|
||||
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)
|
||||
|
||||
def on_set_game_mode(self):
|
||||
"""设置游戏模式(发送0xA4命令)"""
|
||||
"""设置音效模式(发送0xA4命令)"""
|
||||
if self.device_combo.currentData() is None:
|
||||
log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level)
|
||||
return
|
||||
|
||||
# 获取游戏模式值
|
||||
# 获取音效模式值
|
||||
game_mode = self.game_mode_combo.currentData()
|
||||
|
||||
# 弹出确认对话框
|
||||
reply = QMessageBox.question(
|
||||
self,
|
||||
"确认设置游戏模式",
|
||||
f"将要设置游戏模式为: {self.game_mode_combo.currentText()}\n\n"
|
||||
f"游戏模式: 0=无音效, 1=FPS, 2=虚拟7.1\n\n"
|
||||
"确认设置音效模式",
|
||||
f"将要设置音效模式为: {self.game_mode_combo.currentText()}\n\n"
|
||||
f"音效模式: 0=无音效, 1=音乐模式, 2=游戏模式, 3=AI7.1模式\n\n"
|
||||
f"是否继续?",
|
||||
QMessageBox.Yes | QMessageBox.No,
|
||||
QMessageBox.No
|
||||
@@ -3383,27 +3364,27 @@ eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{
|
||||
# 构建0xA4数据包
|
||||
data = bytearray(63) # 63字节数据包
|
||||
data[0] = 0x77 # 同步头1
|
||||
data[1] = 0xA4 # 命令码 (SET_GAME_MODE)
|
||||
data[2] = game_mode # 游戏模式值 (0-2)
|
||||
data[1] = 0xA4 # 命令码 (SET_SOUND_EFFECT_MODE)
|
||||
data[2] = game_mode # 音效模式值 (0-3)
|
||||
# 其余字节保持为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.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(
|
||||
self,
|
||||
"成功",
|
||||
f"游戏模式已设置为: {self.game_mode_combo.currentText()}"
|
||||
f"音效模式已设置为: {self.game_mode_combo.currentText()}"
|
||||
)
|
||||
|
||||
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):
|
||||
"""读取游戏模式(发送0xA5命令)"""
|
||||
"""读取音效模式(发送0xA5命令)"""
|
||||
if self.device_combo.currentData() is None:
|
||||
log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level)
|
||||
return
|
||||
@@ -3417,11 +3398,11 @@ eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{
|
||||
# 构建0xA5数据包
|
||||
data = bytearray(63) # 63字节数据包
|
||||
data[0] = 0x77 # 同步头1
|
||||
data[1] = 0xA5 # 命令码 (GET_GAME_MODE)
|
||||
data[1] = 0xA5 # 命令码 (GET_SOUND_EFFECT_MODE)
|
||||
# 其余字节保持为0
|
||||
|
||||
# 发送请求
|
||||
log_message(LOG_LEVEL_INFO, "正在读取游戏模式...", self.log_level)
|
||||
log_message(LOG_LEVEL_INFO, "正在读取音效模式...", self.log_level)
|
||||
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:
|
||||
# 检查Report ID和同步头
|
||||
if reply[0] == 0x01 and reply[1] == 0x77 and reply[2] == 0xA5:
|
||||
# 解析游戏模式
|
||||
# 解析音效模式
|
||||
game_mode = reply[3]
|
||||
|
||||
# 更新UI显示
|
||||
@@ -3439,14 +3420,14 @@ eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{
|
||||
if index >= 0:
|
||||
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 "未知"
|
||||
|
||||
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(
|
||||
self,
|
||||
"游戏模式",
|
||||
f"当前游戏模式: {game_mode}\n\n"
|
||||
"音效模式",
|
||||
f"当前音效模式: {game_mode}\n\n"
|
||||
f"{mode_name}"
|
||||
)
|
||||
else:
|
||||
@@ -3457,7 +3438,7 @@ eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{
|
||||
h.close()
|
||||
|
||||
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):
|
||||
"""读取固件版本(发送0xA6命令)"""
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
|--------|----------|------|------|------|
|
||||
| 0x82 | SET_MIC_VOLUME | 设置麦克风增益级别 | 主机→设备 | 设置麦克风PGA增益(0=静音, 1-37=0dB~36dB, 1dB/步) |
|
||||
| 0x83 | GET_MIC_VOLUME | 获取麦克风增益级别 | 主机→设备 | 读取当前麦克风PGA增益级别(0=静音, 1-37=0dB~36dB) |
|
||||
| 0x84 | FACTORY_RESET | 恢复出厂默认设置 | 主机→设备 | 删除Flash中所有已保存参数,设备重启后自动恢复出厂默认值 |
|
||||
| 0x8A | SET_EQ_MODE | 切换EQ模式 | 主机→设备 | 切换EQ模式 |
|
||||
| 0x8B | GET_EQ_MODE | 获取当前EQ模式信息 | 主机→设备 | 读取设备当前EQ模式和名称 |
|
||||
| 0x8C | SET_MODE_GAIN_AND_NAME | 设置模式整体增益和名称 | 主机→设备 | 设置模式整体增益和名称 |
|
||||
@@ -24,8 +25,8 @@
|
||||
| 0x9D | SET_EQ_ENABLE | 设置EQ使能开关 | 主机→设备 | 设置EQ使能开关(ON/OFF),禁用时保存当前模式,启用时恢复之前模式 |
|
||||
| 0x9E | GET_EQ_ENABLE | 获取EQ使能开关 | 主机→设备 | 读取EQ使能开关状态(ON/OFF) |
|
||||
| 0x9F | GET_SAMPLE_FORMAT | 获取采样率和格式 | 主机→设备 | 读取当前采样率、DSD模式和DAC采样分辨率 |
|
||||
| 0xA4 | SET_GAME_MODE | 设置游戏模式 | 主机→设备 | 设置游戏模式(0=无音效,1=FPS,2=虚拟7.1) |
|
||||
| 0xA5 | GET_GAME_MODE | 获取游戏模式 | 主机→设备 | 读取当前游戏模式(0-2) |
|
||||
| 0xA4 | SET_SOUND_EFFECT_MODE | 设置音效模式 | 主机→设备 | 设置音效模式(0=无音效,1=音乐模式,2=游戏模式,3=AI7.1模式) |
|
||||
| 0xA5 | GET_SOUND_EFFECT_MODE | 获取音效模式 | 主机→设备 | 读取当前音效模式(0-3) |
|
||||
| 0xA6 | GET_FIRMWARE_VERSION | 获取固件版本 | 主机→设备 | 读取设备固件版本号(BCD格式:主版本.次版本.修订版本) |
|
||||
| 0xB0 | SET_EX3D_CMD | 发送EX3D命令 | 主机→设备 | 发送EX3D设置命令(封装所有EX3D SET命令) |
|
||||
| 0xB1 | GET_EX3D_CMD | 读取EX3D命令 | 主机→设备 | 读取EX3D参数(封装所有EX3D GET命令) |
|
||||
@@ -98,6 +99,54 @@
|
||||
- 编码器旋转导致增益变化时,设备主动向主机上报当前增益(最大上报37,内部38时上报37)
|
||||
- HID SET_MIC_VOLUME(0x82)命令成功执行后,设备也主动上报新增益
|
||||
|
||||
### 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模式)
|
||||
**功能**: 切换当前EQ模式
|
||||
**方向**: 主机→设备
|
||||
@@ -107,7 +156,7 @@
|
||||
---------|------|------|------
|
||||
0 | 1 | 0x77 | 同步头1
|
||||
1 | 1 | 0x8A | 命令码
|
||||
2 | 1 | uint8 | 模式值 (0-5: 预设模式, 6-8: 用户模式, 9: bypass)
|
||||
2 | 1 | uint8 | 模式值 (0-9: 预设模式, 10-11: 用户模式)
|
||||
3-62 | 60 | 0x00 | 保留字节
|
||||
```
|
||||
|
||||
@@ -121,13 +170,13 @@
|
||||
---------|------|------|------
|
||||
0 | 1 | 0x77 | 同步头1
|
||||
1 | 1 | 0x8B | 命令码
|
||||
2 | 1 | uint8 | 模式值 (0-9: 有效模式值, 0xFF: 获取当前模式信息)
|
||||
2 | 1 | uint8 | 模式值 (0-11: 有效模式值, 0xFF: 获取当前模式信息)
|
||||
3-62 | 60 | 0x00 | 保留字节
|
||||
```
|
||||
|
||||
**设备端处理**:
|
||||
- 如果mode值为0xFF,返回当前模式值、整体增益和模式名称
|
||||
- 如果mode值为有效模式值(0-9),返回指定模式值、整体增益和模式名称
|
||||
- 如果mode值为有效模式值(0-11),返回指定模式值、整体增益和模式名称
|
||||
|
||||
|
||||
|
||||
@@ -146,7 +195,7 @@
|
||||
|
||||
**使用说明**:
|
||||
- 发送mode=0xFF时,返回当前激活的EQ模式信息
|
||||
- 发送mode=0-9时,返回指定模式的增益和名称信息(不切换当前模式)
|
||||
- 发送mode=0-11时,返回指定模式的增益和名称信息(不切换当前模式)
|
||||
|
||||
### 2.3 0x8C - SET_MODE_GAIN_AND_NAME (设置模式整体增益和名称)
|
||||
**功能**: 设置EQ模式整体增益和名称
|
||||
@@ -157,7 +206,7 @@
|
||||
---------|------|------|------
|
||||
0 | 1 | 0x77 | 同步头1
|
||||
1 | 1 | 0x8C | 命令码
|
||||
2 | 1 | uint8 | 模式值 (0-9)
|
||||
2 | 1 | uint8 | 模式值 (0-11)
|
||||
3-6 | 4 | int32 | 增益值 (范围0到-50dB,有符号整数)
|
||||
7-22 | 16 | char | 模式名称 (UTF-8编码,16字节)
|
||||
23-62 | 40 | 0x00 | 保留字节
|
||||
@@ -177,7 +226,7 @@
|
||||
---------|------|------|------
|
||||
0 | 1 | 0x77 | 同步头1
|
||||
1 | 1 | 0x8D | 命令码
|
||||
2 | 1 | uint8 | 模式值 (0-9)
|
||||
2 | 1 | uint8 | 模式值 (0-11)
|
||||
3 | 1 | uint8 | 滤波器Band索引 (0-7)
|
||||
4 | 1 | uint8 | 滤波器类型
|
||||
5-8 | 4 | float | 中心频率 (Hz)
|
||||
@@ -211,7 +260,7 @@
|
||||
---------|------|------|------
|
||||
0 | 1 | 0x77 | 同步头1
|
||||
1 | 1 | 0x8E | 命令码
|
||||
2 | 1 | uint8 | 模式值 (0-9)
|
||||
2 | 1 | uint8 | 模式值 (0-11)
|
||||
3 | 1 | uint8 | EQ索引 (0-7)
|
||||
4-62 | 59 | 0x00 | 保留字节
|
||||
```
|
||||
@@ -223,7 +272,7 @@
|
||||
0 | 1 | 0x01 | Report ID
|
||||
1 | 1 | 0x77 | 同步头1
|
||||
2 | 1 | 0x8E | 同步头2
|
||||
3 | 1 | uint8 | 模式值 (0-9)
|
||||
3 | 1 | uint8 | 模式值 (0-11)
|
||||
4 | 1 | uint8 | 滤波器Band索引 (0-7)
|
||||
5 | 1 | uint8 | 滤波器类型
|
||||
6-9 | 4 | float | 中心频率 (Hz)
|
||||
@@ -269,7 +318,7 @@
|
||||
---------|------|------|------
|
||||
0 | 1 | 0x77 | 同步头1
|
||||
1 | 1 | 0x90 | 命令码
|
||||
2 | 1 | uint8 | 模式号 (0-9, 0xFF表示恢复所有包括EQ参数,总体增益,模式名称 )
|
||||
2 | 1 | uint8 | 模式号 (0-11, 0xFF表示恢复所有包括EQ参数,总体增益,模式名称 )
|
||||
3-62 | 60 | 0x00 | 保留字节
|
||||
```
|
||||
|
||||
@@ -303,8 +352,8 @@
|
||||
0 | 1 | 0x01 | Report ID
|
||||
1 | 1 | 0x77 | 同步头1
|
||||
2 | 1 | 0x91 | 同步头2
|
||||
3 | 1 | uint8 | 模式总数 (当前为9,包含0-8共9个模式,不包含禁用模式)
|
||||
4 | 1 | uint8 | 预定义模式数量 (当前为6,包含0-5共6个预设模式)
|
||||
3 | 1 | uint8 | 模式总数 (当前为12,包含0-11共12个模式,不包含禁用模式)
|
||||
4 | 1 | uint8 | 预定义模式数量 (当前为10,包含0-9共10个预设模式)
|
||||
5-62 | 58 | 0x00 | 保留字节
|
||||
```
|
||||
|
||||
@@ -317,7 +366,7 @@
|
||||
---------|------|------|------
|
||||
0 | 1 | 0x77 | 同步头1
|
||||
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 | 保留字节
|
||||
```
|
||||
|
||||
@@ -500,8 +549,8 @@
|
||||
- 返回当前EQ使能开关状态
|
||||
- 返回之前保存的模式值(如果存在)
|
||||
|
||||
### 2.27 0xA4 - SET_GAME_MODE (设置游戏模式)
|
||||
**功能**: 设置游戏模式
|
||||
### 2.27 0xA4 - SET_SOUND_EFFECT_MODE (设置音效模式)
|
||||
**功能**: 设置音效模式
|
||||
**方向**: 主机→设备
|
||||
**数据包格式**:
|
||||
```
|
||||
@@ -509,26 +558,28 @@
|
||||
---------|------|------|------
|
||||
0 | 1 | 0x77 | 同步头1
|
||||
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 | 保留字节
|
||||
```
|
||||
|
||||
**参数说明**:
|
||||
- **游戏模式范围:** 0-2
|
||||
- **说明:** 选择游戏音效模式
|
||||
- 0: 无音效(标准立体声)
|
||||
- 1: FPS模式(增强定位感)
|
||||
- 2: 虚拟7.1(环绕声效果)
|
||||
- **音效模式范围:** 0-3
|
||||
- **说明:** 选择音效模式,与硬件按键效果相同
|
||||
- 0: 无音效 — 所有模式按键灯灭,EQ算法关闭,EX3D算法关闭
|
||||
- 1: 音乐模式 — 音乐键灯亮,EQ算法开启,EX3D算法关闭
|
||||
- 2: 游戏模式 — 游戏键灯亮,EQ算法开启,EX3D游戏声场(SF=0)开启
|
||||
- 3: AI7.1模式 — AI7.1键灯亮,EQ算法开启,EX3D AI7.1声场(SF=1)开启
|
||||
|
||||
**设备端处理**:
|
||||
- 效果等同于按下相应的硬件模式按键
|
||||
- 参数会通过现有的定时保存机制自动保存到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
|
||||
1 | 1 | 0x77 | 同步头1
|
||||
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 | 保留字节
|
||||
```
|
||||
|
||||
|
||||
@@ -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},
|
||||
},
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
@@ -226,7 +226,7 @@ int led_set_brightness(led_control_t *ctx,
|
||||
|
||||
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)
|
||||
|
||||
@@ -425,12 +425,13 @@ extern void dsp_core0(void);
|
||||
extern void board_setup();
|
||||
extern void dsp_main (chanend c_data);
|
||||
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_1(chanend c_dsp_to_ex3d, int worker_id);
|
||||
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 AudioHwRemote(chanend c_hidSendData, chanend cc_mic_level, 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, chanend c_audiohw_rx);
|
||||
extern void dnr_dsp_proc_task(void);
|
||||
|
||||
extern unsafe chanend uc_dsp_to_ex3d[DSP_WORKER_COUNT];
|
||||
@@ -531,12 +532,14 @@ int main()
|
||||
|
||||
USER_MAIN_DECLARATIONS
|
||||
|
||||
chan c_dsp_to_ex3d[DSP_WORKER_COUNT];
|
||||
chan cc_mic_level;
|
||||
chan c_key; chan c_hidSendData;
|
||||
chan c_hidRcvData;
|
||||
chan c_eq_data;
|
||||
chan c_dsp_to_ex3d[DSP_WORKER_COUNT];
|
||||
chan cc_mic_level;
|
||||
chan c_audiohw;
|
||||
chan c_key; chan c_hidSendData;
|
||||
chan c_hidRcvData;
|
||||
chan c_eq_data;
|
||||
chan c_uac_vol;
|
||||
chan c_ex3d_hid_cmd;
|
||||
|
||||
par
|
||||
{
|
||||
@@ -544,7 +547,8 @@ int main()
|
||||
on tile[1] : {
|
||||
par {
|
||||
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
|
||||
par(int i = 0; i < DSP_WORKER_COUNT; i++)
|
||||
@@ -568,7 +572,7 @@ int main()
|
||||
#if USE_EX3D == 1
|
||||
unsafe { key_receiver(c_key); }
|
||||
#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();
|
||||
#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_);
|
||||
#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_);
|
||||
|
||||
Reference in New Issue
Block a user