implement high_perf_mode DAC attenuation and D11 LED

GAME+MIC toggles high_perf_mode (default off, saved to Flash). When on, DAC uses user HID level and D11 lights; when off, hardware level is user level minus 6 steps (max -6dB, floor at level 0). g_volume_level keeps the user level for HID and persistence.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Steven Dan
2026-06-01 15:44:33 +08:00
parent 2df72a04b3
commit 022a46fb6f
3 changed files with 80 additions and 21 deletions

View File

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

View File

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

View File

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