add FPS+MIC combo to toggle EX3D on/off

Short-press FPS and MIC together toggles g_3d_enable (default on), syncs to tile1 via cc_mic_level 0xFB, and calls audio_ex3d_set_onoff on tile1. D8 green LED shows EX3D on; off when disabled.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Steven Dan
2026-06-01 13:52:32 +08:00
parent 08d957becf
commit a58f52e4f0
3 changed files with 94 additions and 3 deletions

View File

@@ -963,6 +963,18 @@ static void tx1_send_game_mode_to_tile1(chanend cc_mic_level, unsigned mode)
cc_mic_level <: mode;
debug_printf("cc_mic_level send game_mode=%u\n", mode);
}
/**
* 改动原因FPS+MIC 组合键切换 EX3D 后,经 cc_mic_level 同步到 tile1由 hid_button_task 调用 audio_ex3d_set_onoff。
*/
static void tx1_send_ex3d_onoff_to_tile1(chanend cc_mic_level, unsigned onoff)
{
onoff = onoff ? 1u : 0u;
SET_SHARED_GLOBAL(g_3d_enable, onoff);
cc_mic_level <: TX1_CC_CMD_EX3D_ONOFF;
cc_mic_level <: onoff;
debug_printf("cc_mic_level send ex3d_onoff=%u\n", onoff);
}
/* 改动原因c_dfu 仅接收 FIRMWARE_UPGRADE_START在此线程执行 handle_firmware_upgrade_start。
* 移除未使用的 chanend c_erase原占位参数无任何 select/通信,会导致 main 侧被迫接 dummy 通道且与当前拓扑无关。 */
#if HID_DFU_EN
@@ -1020,6 +1032,8 @@ void AudioHwRemote2(streaming chanend c, chanend cc_mic_level, client interface
debug_printf("TX1: Loaded mic_mute from flash: mic_muted=%d\n", mic_muted);
}
unsigned dnr_enabled = 1;
/* 改动原因FPS+MIC 组合键切换 EX3D 总开关默认开启D8 绿灯亮=开、灭=关 */
unsigned ex3d_enable = 1;
unsigned high_perf_mode = 0;
htr3236_t htr3236_dev;
@@ -1062,7 +1076,8 @@ void AudioHwRemote2(streaming chanend c, chanend cc_mic_level, client interface
unsigned vol_plus_long_fired = 0, vol_minus_long_fired = 0;
// TX1 combo key state
typedef enum { COMBO_NONE = 0, COMBO_GAME_MIC, COMBO_VOL_UP_DOWN } tx1_combo_t;
/* 改动原因:增加 FPS+MIC 组合键切换 EX3D 算法开关 */
typedef enum { COMBO_NONE = 0, COMBO_GAME_MIC, COMBO_VOL_UP_DOWN, COMBO_FPS_MIC } tx1_combo_t;
tx1_combo_t current_combo = COMBO_NONE;
unsigned combo_triggered = 0;
unsigned combo_release_time = 0;
@@ -1102,6 +1117,9 @@ void AudioHwRemote2(streaming chanend c, chanend cc_mic_level, client interface
unsigned char saved_gm = tx1_load_game_mode();
game_mode = (tx1_game_mode_t)saved_gm;
tx1_sync_game_mode_state((unsigned)game_mode, 0, cc_mic_level, led_if);
/* 改动原因:开机默认 EX3D 开启,同步 tile1 并点亮 D8 绿灯 */
ex3d_enable = 1;
tx1_send_ex3d_onoff_to_tile1(cc_mic_level, ex3d_enable);
gpio_leds_dirty = 1;
debug_printf("TX1: Loaded game_mode from flash: %u\n", (unsigned)game_mode);
}
@@ -1744,6 +1762,8 @@ void AudioHwRemote2(streaming chanend c, chanend cc_mic_level, client interface
tx1_combo_t new_combo = COMBO_NONE;
if (game == 0 && mic == 0) {
new_combo = COMBO_GAME_MIC;
} else if (fps == 0 && mic == 0) {
new_combo = COMBO_FPS_MIC;
} else if (vol_plus == 0 && vol_minus == 0) {
new_combo = COMBO_VOL_UP_DOWN;
}
@@ -1777,6 +1797,11 @@ void AudioHwRemote2(streaming chanend c, chanend cc_mic_level, client interface
feature_timeout_ticks = 0;
gpio_leds_dirty = 1;
}
} else if (current_combo == COMBO_FPS_MIC) {
ex3d_enable = !ex3d_enable;
tx1_send_ex3d_onoff_to_tile1(cc_mic_level, ex3d_enable);
gpio_leds_dirty = 1;
debug_printf("TX1: FPS+MIC combo - ex3d_enable=%d\n", ex3d_enable);
}
}
@@ -1986,8 +2011,8 @@ void AudioHwRemote2(streaming chanend c, chanend cc_mic_level, client interface
if (feature_mode == FEATURE_MODE_SYSTEM_VOLUME) {
led_tile0_shadow &= ~(1 << TX1_LED_D10_GREEN_BIT);
}
// D8_GREEN = DNR indicator
if (dnr_enabled) {
/* 改动原因D8 绿灯指示 EX3D 算法开/关FPS+MIC 组合键);不再用作 DNR 灯 */
if (ex3d_enable) {
led_tile0_shadow &= ~(1 << TX1_LED_D8_GREEN_BIT);
}
// D11_BLUE = MIC Level indicator (feature_mode == MIC_LEVEL)

View File

@@ -95,9 +95,12 @@ unsigned g_3d_on_off_t1 = IR_OFF; // Default 3D off
static unsigned g_tx1_last_ex3d_game_applied = 0xFFFFFFFFu;
extern unsigned g_3d_fps;
extern unsigned g_3d_enable;
extern unsigned g_request_game_mode;
extern unsigned g_tx1_azimuth_mode;
static void tx1_apply_ex3d_for_game_mode(unsigned game_mode);
/**
* 改动原因g_3d_fps 三档(0=FPS20,1=FPS71,2=3A),已去掉 BYPASS/IR_OFF映射 EX3D 声场。
* 须在 tile1 且 g_ex3d_init_done 后调用 audio_ex3d_*。
@@ -106,6 +109,9 @@ static void tx1_apply_ex3d_for_game_mode(unsigned game_mode)
{
unsigned ir_mode;
unsigned azimuth_mode;
unsigned enable;
GET_SHARED_GLOBAL(enable, g_3d_enable);
if (game_mode >= TX1_GAME_MODE_COUNT) {
game_mode = 0;
@@ -138,6 +144,12 @@ static void tx1_apply_ex3d_for_game_mode(unsigned game_mode)
return;
}
if (!enable) {
audio_ex3d_set_onoff(0);
debug_printf("TX1 ex3d: disabled (g_3d_enable=0), game_mode=%u\n", game_mode);
return;
}
if (ir_mode == IR_GAME) {
audio_ex3d_set_sf(0);
audio_ex3d_set_onoff(1);
@@ -153,6 +165,32 @@ static void tx1_apply_ex3d_for_game_mode(unsigned game_mode)
}
}
/**
* 改动原因FPS+MIC 组合键经 0xFB 下发enable=0 仅关算法enable=1 按当前 g_3d_fps 恢复声场。
*/
static void tx1_apply_ex3d_enable(unsigned enable)
{
enable = enable ? 1u : 0u;
if (!g_ex3d_init_done) {
debug_printf("TX1 ex3d: defer enable=%u\n", enable);
return;
}
if (!enable) {
audio_ex3d_set_onoff(0);
debug_printf("TX1 ex3d: set_onoff(0) by enable\n");
return;
}
{
unsigned gm;
GET_SHARED_GLOBAL(gm, g_3d_fps);
tx1_apply_ex3d_for_game_mode(gm);
g_tx1_last_ex3d_game_applied = gm;
}
}
#endif /* USE_EX3D == 1 */
#else
@@ -1077,8 +1115,23 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
break;
}
SET_SHARED_GLOBAL(g_3d_on_off_t1, is_3d_on);
{
unsigned en;
GET_SHARED_GLOBAL(en, g_3d_enable);
if (!en) {
audio_ex3d_set_onoff(0);
}
}
#endif
} else if (tmp == TX1_CC_CMD_EX3D_ONOFF) {
unsigned onoff = chan_in_word(cc_mic_level);
onoff = onoff ? 1u : 0u;
#if USE_EX3D == 1
tx1_apply_ex3d_enable(onoff);
#endif
debug_printf("hid 0xFB: EX3D enable=%u\n", onoff);
} else if (tmp == 0xFD) {
// 脚步增强按键发来的 expand gain 命令
// 必须先读取payload无论是否启用EX3D
@@ -1317,6 +1370,13 @@ void ex3d_task(chanend_t c_ex3d_to_ubm){
GET_SHARED_GLOBAL(init_gm, g_3d_fps);
tx1_apply_ex3d_for_game_mode(init_gm);
g_tx1_last_ex3d_game_applied = init_gm;
{
unsigned en;
GET_SHARED_GLOBAL(en, g_3d_enable);
if (!en) {
audio_ex3d_set_onoff(0);
}
}
}
#endif

View File

@@ -30,4 +30,10 @@ extern unsigned g_tx1_azimuth_mode;
/* 改动原因tile0 从 Flash 恢复 g_3d_fps 后置 1tile1 ex3d_task 强制重新 apply防 init 早于 load */
extern unsigned g_tx1_ex3d_resync_req;
/* 改动原因FPS+MIC 组合键切换 EX3D 总开关,默认 1=开启tile0/tile1 经 SHARED_GLOBAL 同步 */
extern unsigned g_3d_enable;
/* tile0 audiohw → tile1 hid_button_task0xFB + onoff(0/1) → audio_ex3d_set_onoff */
#define TX1_CC_CMD_EX3D_ONOFF 0xFB
#endif /* TX1_EX3D_GAME_H */