From a58f52e4f0e78053eb28dd5231f113d53154f63c Mon Sep 17 00:00:00 2001 From: Steven Dan Date: Mon, 1 Jun 2026 13:52:32 +0800 Subject: [PATCH] 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 --- .../src/extensions/audiohw.xc | 31 +++++++++- .../src/extensions/dsp.c | 60 +++++++++++++++++++ .../src/extensions/tx1_ex3d_game.h | 6 ++ 3 files changed, 94 insertions(+), 3 deletions(-) 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 3d109fc..71d944f 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 @@ -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) diff --git a/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/dsp.c b/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/dsp.c index 0f47e9c..fa31453 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/dsp.c +++ b/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/dsp.c @@ -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 diff --git a/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/tx1_ex3d_game.h b/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/tx1_ex3d_game.h index a437036..89b9e45 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/tx1_ex3d_game.h +++ b/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/tx1_ex3d_game.h @@ -30,4 +30,10 @@ extern unsigned g_tx1_azimuth_mode; /* 改动原因:tile0 从 Flash 恢复 g_3d_fps 后置 1,tile1 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_task:0xFB + onoff(0/1) → audio_ex3d_set_onoff */ +#define TX1_CC_CMD_EX3D_ONOFF 0xFB + #endif /* TX1_EX3D_GAME_H */