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 4aeb6e0..64be47b 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 @@ -556,6 +556,23 @@ static void tx1_rgb_volume_bar_refresh(htr3236_t *dev, client interface i2c_mast void save_value(unsigned char * unsafe path, unsigned char value); unsigned char load_value(unsigned char * unsafe path); + +/* 改动原因:MIC 静音与 golden/phaten 一致——g_mute_switch 驱动定时器里 effective_adc_vol=0, + * 并立即写 NAU88 ADC 寄存器;old_adc_vol 与定时器分支保持同步避免重复 I2C。 */ +static void tx1_apply_mic_mute_hw(unsigned mic_muted, unsigned &old_adc_vol, + client interface i2c_master_if i2c) +{ + SET_SHARED_GLOBAL(g_mute_switch, mic_muted); + if (mic_muted) { + mic_volume(0, i2c); + old_adc_vol = 0; + } else { + unsigned adc_vol; + GET_SHARED_GLOBAL(adc_vol, g_adc_vol); + mic_volume(adc_vol, i2c); + old_adc_vol = adc_vol; + } +} /* 改动原因:c_dfu 仅接收 FIRMWARE_UPGRADE_START,在此线程执行 handle_firmware_upgrade_start。 * 移除未使用的 chanend c_erase:原占位参数无任何 select/通信,会导致 main 侧被迫接 dummy 通道且与当前拓扑无关。 */ #if HID_DFU_EN @@ -590,6 +607,27 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli tx1_feature_mode_t feature_mode = FEATURE_MODE_NONE; unsigned feature_volume = 12; // 改动原因:与 jok ui_app gunshot/footstep/mic 默认 12 一致 unsigned mic_muted = 0; + /* 改动原因:与 phaten golden 相同 LFS 键名,断电保存 MIC 静音;255=首次无记录默认未静音 */ + unsigned char mic_mute_path[] = "mic_mute"; + { + unsigned char saved_mic_mute = load_value(mic_mute_path); + if (saved_mic_mute == 1) { + mic_muted = 1; + } else { + mic_muted = 0; + if (saved_mic_mute == 255) { + save_value(mic_mute_path, (unsigned char)0); + } + } + SET_SHARED_GLOBAL(g_mute_switch, mic_muted); + /* 改动原因:与 g_dac_vol 相同技巧,首轮定时器必写 ADC;若已静音则 effective_adc_vol=0 */ + { + unsigned init_adc_vol; + GET_SHARED_GLOBAL(init_adc_vol, g_adc_vol); + old_adc_vol = mic_muted ? (~init_adc_vol) : (~0u); + } + debug_printf("TX1: Loaded mic_mute from flash: mic_muted=%d\n", mic_muted); + } unsigned dnr_enabled = 1; unsigned high_perf_mode = 0; @@ -1308,10 +1346,13 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli mic_long_fired = 0; } else { if (!mic_long_fired && (now - mic_press_time) < 1000000000ull) { - // Short press: toggle mic mute + /* 改动原因:短按 MIC 切换静音——mute ADC(mic_volume(0))、 + * g_mute_switch 供 HID 0xB2,save_value 断电记忆,开机 load_value 恢复 */ mic_muted = !mic_muted; + tx1_apply_mic_mute_hw(mic_muted, old_adc_vol, i2c); + save_value(mic_mute_path, (unsigned char)mic_muted); gpio_leds_dirty = 1; - debug_printf("TX1: MIC short press - mic_muted=%d\n", mic_muted); + debug_printf("TX1: MIC short press - mic_muted=%d saved\n", mic_muted); } } prev_mic = mic;