Compare commits

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
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;
}

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
-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)

View File

@@ -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

View File

@@ -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; }
}

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};
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 0EQ开启
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 1EQ开启
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_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:
{

View File

@@ -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);

View File

@@ -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

View File

@@ -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命令"""

View File

@@ -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=FPS2=虚拟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_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模式)
**功能**: 切换当前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 | 保留字节
```

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)
{
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)

View File

@@ -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_);