diff --git a/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/audiohw.xc b/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/audiohw.xc index 428829d..5510395 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/audiohw.xc +++ b/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/audiohw.xc @@ -58,6 +58,8 @@ unsigned g_mute_switch = 0; // 改动原因:与g_adc_loop一致,记录MCU unsigned g_led_enable = 0; unsigned g_dnr_enable = 1; unsigned g_3d_enable = 1; +/* 改动原因:GAME+MIC 高性能模式,0=DAC 在用户等级基础上减 6 格(约 -6dB),1=不减;默认 0 */ +unsigned g_high_perf_mode = 0; unsigned g_led_mode = 0; unsigned g_fps_enable = 0; uint32_t get_reference_time(); @@ -509,6 +511,8 @@ void mic_volume(unsigned level, client interface i2c_master_if i2c) #define TX1_MIC_HID_LEVEL_MAX 48 #define TX1_MIC_HID_LEVEL_DEFAULT 48 #define TX1_VOL_BAR_MAX 12 +/* 改动原因:非高性能时 DAC 在用户 HID 等级上最多降低 6 格(约 6dB),最低落到 level 0(约 -34dB) */ +#define TX1_HIGH_PERF_DAC_ATTEN_LEVELS 6u /* 改动原因:与 phaten golden / SY102dac 表一致,DAC HID 0~48 级映射 NAU88 0x0034 寄存器值 */ static const uint8_t tx1_dac_level_to_reg[49] = { @@ -559,17 +563,38 @@ static unsigned tx1_bar_to_hid_level(unsigned bar) return (bar * TX1_DAC_HID_LEVEL_MAX) / TX1_VOL_BAR_MAX; } -/* 改动原因:统一把 DAC HID 等级写入 g_volume_level/g_dac_vol,定时器请求分支写 0x0034 并 Flash */ +/** + * 改动原因:g_volume_level 保存用户/Flash 目标等级;写 0x0034 时高性能=原等级,否则减 6 格且不低于 0。 + */ +static unsigned tx1_effective_dac_hid_level(unsigned user_hid, unsigned high_perf) +{ + if (user_hid > TX1_DAC_HID_LEVEL_MAX) { + user_hid = TX1_DAC_HID_LEVEL_MAX; + } + if (high_perf) { + return user_hid; + } + if (user_hid <= TX1_HIGH_PERF_DAC_ATTEN_LEVELS) { + return 0; + } + return user_hid - TX1_HIGH_PERF_DAC_ATTEN_LEVELS; +} + +static unsigned tx1_dac_reg_from_hid_level(unsigned hid_level) +{ + if (hid_level == 0) { + return 0u; + } + return (unsigned)tx1_dac_level_to_reg[hid_level]; +} + +/* 改动原因:仅更新用户 DAC HID 等级并请求写寄存器;实际 0x0034 值在定时器里按 g_high_perf_mode 衰减 */ static void tx1_apply_dac_hid_level(unsigned hid_level) { - unsigned reg; - if (hid_level > TX1_DAC_HID_LEVEL_MAX) { hid_level = TX1_DAC_HID_LEVEL_MAX; } - reg = (hid_level == 0) ? 0u : (unsigned)tx1_dac_level_to_reg[hid_level]; SET_SHARED_GLOBAL(g_volume_level, hid_level); - SET_SHARED_GLOBAL(g_dac_vol, reg); SET_SHARED_GLOBAL(g_request_volume_set, 1); } @@ -1343,6 +1368,7 @@ void AudioHwRemote2(streaming chanend c, chanend cc_mic_level, client interface unsigned dnr_enabled = 1; /* 改动原因:FPS+MIC 组合键切换 EX3D 总开关,默认开启;D8 绿灯亮=开、灭=关 */ unsigned ex3d_enable = 1; + /* 改动原因:默认 0;开机从 Flash 覆盖,与 g_high_perf_mode 同步 */ unsigned high_perf_mode = 0; htr3236_t htr3236_dev; @@ -1449,10 +1475,11 @@ void AudioHwRemote2(streaming chanend c, chanend cc_mic_level, client interface debug_printf("FPS71_UAC2 running, g_3d_fps=%u\n", (unsigned)game_mode); #endif - /* 改动原因:开机恢复 DAC/MIC 音量(放在 OS 检测/切固件之后,与 c1_lp 一致避免阻塞枚举过久) */ + /* 改动原因:开机恢复 DAC/MIC 音量与高性能模式(放在 OS 检测/切固件之后,与 c1_lp 一致避免阻塞枚举过久) */ { unsigned char saved_dac = tx1_load_dac_volume(); unsigned char saved_mic = tx1_load_mic_volume(); + unsigned char saved_hp = tx1_load_high_perf_mode(); if (saved_dac == 255) { saved_dac = (unsigned char)TX1_DAC_HID_LEVEL_DEFAULT; @@ -1462,10 +1489,14 @@ void AudioHwRemote2(streaming chanend c, chanend cc_mic_level, client interface saved_mic = (unsigned char)TX1_MIC_HID_LEVEL_DEFAULT; tx1_save_mic_volume(saved_mic); } + high_perf_mode = (unsigned)saved_hp; + SET_SHARED_GLOBAL(g_high_perf_mode, high_perf_mode); tx1_apply_dac_hid_level((unsigned)saved_dac); tx1_apply_mic_hid_level((unsigned)saved_mic); feature_volume = tx1_hid_level_to_bar((unsigned)saved_mic); - debug_printf("TX1: Loaded dac_hid=%u mic_hid=%u\n", (unsigned)saved_dac, (unsigned)saved_mic); + gpio_leds_dirty = 1; + debug_printf("TX1: Loaded dac_hid=%u mic_hid=%u high_perf=%u\n", + (unsigned)saved_dac, (unsigned)saved_mic, high_perf_mode); } while(1) @@ -1581,14 +1612,19 @@ void AudioHwRemote2(streaming chanend c, chanend cc_mic_level, client interface unsigned req_vol; GET_SHARED_GLOBAL(req_vol, g_request_volume_set); if (req_vol) { - unsigned hid_lvl; + unsigned user_hid; + unsigned eff_hid; unsigned reg; + unsigned hp; SET_SHARED_GLOBAL(g_request_volume_set, 0); - GET_SHARED_GLOBAL(hid_lvl, g_volume_level); - if (hid_lvl <= TX1_DAC_HID_LEVEL_MAX) { - reg = (hid_lvl == 0) ? 0u : (unsigned)tx1_dac_level_to_reg[hid_lvl]; + GET_SHARED_GLOBAL(user_hid, g_volume_level); + GET_SHARED_GLOBAL(hp, g_high_perf_mode); + high_perf_mode = hp; + if (user_hid <= TX1_DAC_HID_LEVEL_MAX) { + eff_hid = tx1_effective_dac_hid_level(user_hid, hp); + reg = tx1_dac_reg_from_hid_level(eff_hid); SET_SHARED_GLOBAL(g_dac_vol, reg); - if (hid_lvl == 0) { + if (eff_hid == 0) { unsafe { NAU88C22_REGWRITE(0x0034, 0x0000, i2c); } } else { /* 改动原因:必须用 SY102 查表值直写 0x0034,不能用 dac_volume 线性公式 */ @@ -1598,8 +1634,9 @@ void AudioHwRemote2(streaming chanend c, chanend cc_mic_level, client interface } } old_dac_vol = reg; - tx1_save_dac_volume((unsigned char)hid_lvl); - debug_printf("HID/panel SET_VOLUME: dac_hid=%u reg=0x%x\n", hid_lvl, reg); + tx1_save_dac_volume((unsigned char)user_hid); + debug_printf("HID/panel SET_VOLUME: user_hid=%u eff_hid=%u hp=%u reg=0x%x\n", + user_hid, eff_hid, hp, reg); } } } @@ -2150,8 +2187,10 @@ void AudioHwRemote2(streaming chanend c, chanend cc_mic_level, client interface if (current_combo != COMBO_NONE && !combo_triggered) { combo_triggered = 1; if (current_combo == COMBO_GAME_MIC) { - // Toggle high performance mode high_perf_mode = !high_perf_mode; + SET_SHARED_GLOBAL(g_high_perf_mode, high_perf_mode); + tx1_save_high_perf_mode((unsigned char)high_perf_mode); + SET_SHARED_GLOBAL(g_request_volume_set, 1); gpio_leds_dirty = 1; debug_printf("TX1: GAME+MIC combo - high_perf_mode=%d\n", high_perf_mode); } else if (current_combo == COMBO_VOL_UP_DOWN) { @@ -2410,13 +2449,10 @@ void AudioHwRemote2(streaming chanend c, chanend cc_mic_level, client interface if (ex3d_enable) { led_tile0_shadow &= ~(1 << TX1_LED_D8_GREEN_BIT); } - // D11_BLUE = MIC Level indicator (feature_mode == MIC_LEVEL) - if (feature_mode == FEATURE_MODE_MIC_LEVEL) { - led_tile0_shadow &= ~(1 << TX1_LED_D11_BLUE_BIT); - } - // D9_BLUE = High Performance indicator + /* 改动原因:D11 蓝灯=高性能模式开;关时 DAC 降 6 格,灯灭 */ + GET_SHARED_GLOBAL(high_perf_mode, g_high_perf_mode); if (high_perf_mode) { - led_tile0_shadow &= ~(1 << TX1_LED_D9_BLUE_BIT); + led_tile0_shadow &= ~(1 << TX1_LED_D11_BLUE_BIT); } p_led_tile0 <: led_tile0_shadow; diff --git a/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/user_func.c b/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/user_func.c index a512f1a..dbae064 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/user_func.c +++ b/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/user_func.c @@ -185,6 +185,25 @@ unsigned char tx1_load_mic_volume(void) return v; } +/* 改动原因:GAME+MIC 组合键切换高性能模式,0=DAC 降 6dB(6 格),1=正常音量;默认 0 */ +static unsigned char tx1_high_perf_lfs_path[] = "tx1_hi_perf"; + +void tx1_save_high_perf_mode(unsigned char enabled) +{ + save_value(tx1_high_perf_lfs_path, (enabled != 0) ? 1 : 0); +} + +unsigned char tx1_load_high_perf_mode(void) +{ + unsigned char v = load_value(tx1_high_perf_lfs_path); + + if (v == 255) { + v = 0; + save_value(tx1_high_perf_lfs_path, v); + } + return (v != 0) ? 1 : 0; +} + /* 改动原因:Flash 存 save_code=(-threshold)+1,范围 1~36,避免 0 作未初始化哨兵(与 eq.c HID 一致) */ static unsigned char tx1_lmt_thr_lfs_path[] = "tx1_lmt_thr"; static unsigned char tx1_expand_gain_lfs_path[] = "tx1_exp_gain"; diff --git a/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/user_func.h b/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/user_func.h index 5ae2427..92641d3 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/user_func.h +++ b/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/user_func.h @@ -70,6 +70,10 @@ unsigned char tx1_load_dac_volume(void); void tx1_save_mic_volume(unsigned char level); unsigned char tx1_load_mic_volume(void); +/* 改动原因:GAME+MIC 高性能模式断电记忆,0=关(DAC -6dB),1=开(正常 DAC) */ +void tx1_save_high_perf_mode(unsigned char enabled); +unsigned char tx1_load_high_perf_mode(void); + /* 改动原因:枪声 CMD_LMT_THRESHOLD(-35~0) 与脚步声 CMD_EXPAND_GAIN(0~20) 断电记忆,编码同 eq.c HID 0xB0 */ void tx1_save_lmt_threshold_code(unsigned char save_code); unsigned char tx1_load_lmt_threshold_code(void);