From 34e83ace9f5099a0df19c3ac1186dbd451832916 Mon Sep 17 00:00:00 2001 From: Steven Dan Date: Fri, 22 May 2026 15:35:40 +0800 Subject: [PATCH] update mic button support detail --- .../src/extensions/audiohw.xc | 97 ++++++++++++++----- .../src/extensions/user_main.h | 3 + .../src/extensions/audiohw.xc | 97 ++++++++++++++----- .../src/extensions/user_main.h | 3 + 4 files changed, 148 insertions(+), 52 deletions(-) diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/audiohw.xc b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/audiohw.xc index d693e7f..0f2b383 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/audiohw.xc +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/audiohw.xc @@ -126,6 +126,10 @@ timer tm; // 改动原因:DAC 音量单独持久化路径,与 mode 的 c1_mode 文件分离,避免互相覆盖且便于维护。 #define C1_DAC_VOL_INFO_PATH "c1_dac_vol" +// 改动原因:麦克风按键三种状态(静音/变声/DNR)均需断电保存,上电恢复并同步LED显示。 +#define C1_MIC_MUTE_INFO_PATH "c1_mic_mute" +#define C1_VOICE_FX_INFO_PATH "c1_voice_fx" +#define C1_DNR_EN_INFO_PATH "c1_dnr_en" // 改动原因:与 FORMAT_DELAY(30000000) 相同时间基准(get_reference_time 滴答),用户停止调节 300ms 后再写 Flash,减少磨损并满足需求。 #define C1_DAC_VOL_SAVE_DELAY (30000000) @@ -615,14 +619,35 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli dac_vol_persist_deadline = 0; } - // 改动原因:tile1 上电已硬件全灭;先下发当前 g_mute_switch 再下发 Flash 中的 c1_mode,使首帧 apply 时 mic 已正确,避免仅 set_mode 时用占位 mic 闪错 mute 灯。 - unsigned init_mute_for_led; - GET_SHARED_GLOBAL(init_mute_for_led, g_mute_switch); - i_c1_led_ctrl.set_mic_mute_state(init_mute_for_led); - i_c1_led_ctrl.set_mode_led_color(c1_mode_to_tile_mode_led_code(c1_mode)); - // 改动原因:上电默认关闭变声灯效覆盖,避免未初始化随机亮橙。 - i_c1_led_ctrl.set_mic_voice_fx(0); - last_mute_switch_for_led = init_mute_for_led; + + // 改动原因:三种 mic 状态(静音/变声/DNR)均需断电保存,上电从 Flash 读取并恢复;无效値(非 0/1)时使用默认値。 + { + unsigned char loaded_mute = load_value(C1_MIC_MUTE_INFO_PATH); + unsigned init_mute = (loaded_mute == 0 || loaded_mute == 1) ? (unsigned)loaded_mute : 1u; + SET_SHARED_GLOBAL(g_mute_switch, init_mute); + } + { + unsigned char loaded_vfx = load_value(C1_VOICE_FX_INFO_PATH); + c1_mic_voice_fx = (loaded_vfx == 1) ? 1u : 0u; + } + { + unsigned char loaded_dnr = load_value(C1_DNR_EN_INFO_PATH); + unsigned init_dnr = (loaded_dnr == 0 || loaded_dnr == 1) ? (unsigned)loaded_dnr : 1u; + SET_SHARED_GLOBAL(g_dnr_enable, init_dnr); + } + + // 改动原因:tile1 上电已硬件全灯;先下发三种mic状态再下发 mode,使首帧 apply 时 mic 已正确。 + { + unsigned init_mute_for_led; + unsigned init_dnr_for_led; + GET_SHARED_GLOBAL(init_mute_for_led, g_mute_switch); + GET_SHARED_GLOBAL(init_dnr_for_led, g_dnr_enable); + i_c1_led_ctrl.set_mic_mute_state(init_mute_for_led); + i_c1_led_ctrl.set_mode_led_color(c1_mode_to_tile_mode_led_code(c1_mode)); + i_c1_led_ctrl.set_mic_voice_fx(c1_mic_voice_fx); + i_c1_led_ctrl.set_mic_dnr_state(init_dnr_for_led); + last_mute_switch_for_led = init_mute_for_led; + } while(1) { @@ -886,6 +911,8 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli mic_volume(effective_adc_vol, i2c); } SET_SHARED_GLOBAL(g_mute_switch, current_mute_switch); + // 改动原因:静音状态变化后立即保存到Flash,保证断电后恢复正确的静音灯状态。 + save_value(C1_MIC_MUTE_INFO_PATH, (unsigned char)current_mute_switch); i_c1_led_ctrl.set_mic_mute_state(current_mute_switch); last_mute_switch_for_led = current_mute_switch; debug_printf("C1 key mic mute toggle (deferred single): %d\n", current_mute_switch); @@ -934,6 +961,9 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli GET_SHARED_GLOBAL(dnr_enable, g_dnr_enable); dnr_enable = (dnr_enable != 0) ? 0 : 1; SET_SHARED_GLOBAL(g_dnr_enable, dnr_enable); + // 改动原因:DNR状态变化后立即下发LED(开亮蓝灯/关灯),并保存到Flash供断电恢复。 + i_c1_led_ctrl.set_mic_dnr_state(dnr_enable); + save_value(C1_DNR_EN_INFO_PATH, (unsigned char)dnr_enable); mic_dnr_long_fired = 1; debug_printf("C1 mic DNR toggle (hold 1.5s): %d\n", dnr_enable); } @@ -1005,6 +1035,8 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli { c1_mic_voice_fx = (c1_mic_voice_fx ? 0 : 1); i_c1_led_ctrl.set_mic_voice_fx(c1_mic_voice_fx); + // 改动原因:变声状态变化后立即保存到Flash,保证断电后恢复正确的变声灯状态。 + save_value(C1_VOICE_FX_INFO_PATH, (unsigned char)c1_mic_voice_fx); mic_dbl_stage = 0; mic_defer_left = 0; debug_printf("C1 mic voice/beautifier toggle: %d\n", c1_mic_voice_fx); @@ -1948,23 +1980,29 @@ static inline void c1_panel_leds_force_all_off_hw(void) p_mic_mute_led_blue <: 1; } -// 改动原因:c1_mode 与灯索引一致:1=灭 2=蓝 3=绿 4=橙(R+G) 5=紫(R+B);仅驱动 mode 区(p_mode_led_red + p_leds bit0/1),不受 mic 变声影响。 -// mic_voice_fx_on:规格变声/美声橙灯在 mic 区——p_leds bit2 红 + bit3 绿同时点亮;关变声时 mic 区仅由静音决定 bit2,bit3 熄灭。 -static inline void apply_c1_panel_leds(unsigned mode_led_color_idx, unsigned mic_mute_switch, unsigned mic_voice_fx_on, unsigned &led_shadow) +// 改动原因:c1_mode 与灯索引一致:1=灯 2=蓝 3=绿 4=橙(R+G) 5=紫(R+B);仅驱动 mode 区(p_mode_led_red + p_leds bit0/1),不受 mic 变声影响。 +// 改动原因:mic 区灯优先级:静音=只亮红灯(覆盖变声/DNR);非静音时变声=橙(R+G),DNR=蓝(p_mic_mute_led_blue), +// 两者同开=橙+蓝混合,两者均关=全灯。 +static inline void apply_c1_panel_leds(unsigned mode_led_color_idx, unsigned mic_mute_switch, unsigned mic_voice_fx_on, unsigned mic_dnr_on, unsigned &led_shadow) { unsigned mode_red = 0; unsigned mode_green = 0; unsigned mode_blue = 0; - // 改动原因:与 user_main.h 约定一致——mic_mute_switch 存的是“非静音=1、静音=0”,静音时 mic 红灯(bit2)亮。 unsigned mic_red = 0; unsigned mic_green = 0; - if (mic_voice_fx_on) { - // 改动原因:变声开为橙=R+G,映射到 XS1_PORT_4D 的 mic 专用 bit2/bit3,不占用 mode 的 bit0/bit1。 - mic_red = 1; - mic_green = 1; - } else { - mic_red = (mic_mute_switch == 0) ? 1 : 0; + unsigned mic_blue = 0; + + // 改动原因:静音优先——静音(mic_mute_switch==0)时只亮红灯,屏蔽变声橙灯和DNR蓝灯; + // 关闭静音后恢复为变声/DNR/混合/全灯的组合状态,满足“关闭静音时回到其他模式的灯颜色”需求。 + if (mic_mute_switch == 0) { + mic_red = 1; mic_green = 0; + mic_blue = 0; + } else { + // 改动原因:变声=橙(R+G),DNR=蓝,两者同时开=橙+蓝混合,两者均关=全灯。 + mic_red = mic_voice_fx_on ? 1 : 0; + mic_green = mic_voice_fx_on ? 1 : 0; + mic_blue = mic_dnr_on ? 1 : 0; } if (mode_led_color_idx == 1) { @@ -1987,7 +2025,8 @@ static inline void apply_c1_panel_leds(unsigned mode_led_color_idx, unsigned mic mode_blue = 0; } - // 改动原因:硬件LED为低电平点亮(1灭/0亮);低四位 bit0~3 分别为 mode绿、mode蓝、mic红、mic绿,统一刷新避免旧代码固定 |=0x8 导致 bit3 永灭。 + // 改动原因:硬件LED为低电平点亮(1灯/0亮);低四位 bit0~3 分别为 mode绿、mode蓝、mic红、mic绿,统一刷新。 + // 改动原因:p_mic_mute_led_blue 由 mic_blue 驱动,DNR开且非静音时亮蓝灯(输出0=亮)。 p_mode_led_red <: (mode_red ? 0 : 1); led_shadow &= ~0xF; led_shadow |= (mode_green ? 0x0 : 0x1); @@ -1995,18 +2034,19 @@ static inline void apply_c1_panel_leds(unsigned mode_led_color_idx, unsigned mic led_shadow |= (mic_red ? 0x0 : 0x4); led_shadow |= (mic_green ? 0x0 : 0x8); p_leds <: led_shadow; - // 改动原因:该蓝灯当前不参与功能,保持熄灭(低电平有效下输出1表示灭)。 - p_mic_mute_led_blue <: 1; + p_mic_mute_led_blue <: (mic_blue ? 0 : 1); } void app_control_slave(server interface c1_led_ctrl_if i_c1_led_ctrl) { - // 改动原因:tile1 先于 tile0 运行,上电先把硬件灯全灭且不调用 apply,避免用占位 mic/mode 组合误亮;shadow 置为全灭电平便于首包 set_* 时 apply 与端口一致。 + // 改动原因:tile1 先于 tile0 运行,上电先把硬件灯全灯且不调用 apply,避免用占位 mic/mode 组合误亮;shadow 置为全灯灯电平便于首包 set_* 时 apply 与端口一致。 unsigned led_shadow = 0xF; unsigned mode_led_color_idx = 1; unsigned mic_mute_switch = 1; // 改动原因:变声/美声开时仅 p_leds bit2/bit3 显橙,与 set_mode_led_color 下发的 mode 灯独立;此处状态与 tile0 set_mic_voice_fx 同步。 unsigned mic_voice_fx_on = 0; + // 改动原因:AI通话降噪DNR开时点亮p_mic_mute_led_blue蓝灯;与变声同时开时橙+蓝混合;静音优先在 apply 内部处理。 + unsigned mic_dnr_on = 0; c1_panel_leds_force_all_off_hw(); unsigned eq_mode_time = 0; @@ -2025,19 +2065,24 @@ void app_control_slave(server interface c1_led_ctrl_if i_c1_led_ctrl) unsafe { select{ case i_c1_led_ctrl.set_mode_led_color(unsigned color_idx): - // 改动原因:color_idx 与 c1_mode 同值 1~5;越界时钳位为默认灯码,避免未定义索引。 + // 改动原因:color_idx 与 c1_mode 同値 1~5;越界时酆位为默认灯码,避免未定义索引。 mode_led_color_idx = color_idx; if (mode_led_color_idx > 5 || mode_led_color_idx < 1) mode_led_color_idx = C1_MODE_VALUE_DEFAULT; - apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, mic_voice_fx_on, led_shadow); + apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, mic_voice_fx_on, mic_dnr_on, led_shadow); break; case i_c1_led_ctrl.set_mic_mute_state(unsigned mute_state): mic_mute_switch = (mute_state != 0) ? 1 : 0; - apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, mic_voice_fx_on, led_shadow); + apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, mic_voice_fx_on, mic_dnr_on, led_shadow); break; case i_c1_led_ctrl.set_mic_voice_fx(unsigned voice_fx_enabled): mic_voice_fx_on = (voice_fx_enabled != 0) ? 1 : 0; - apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, mic_voice_fx_on, led_shadow); + apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, mic_voice_fx_on, mic_dnr_on, led_shadow); + break; + case i_c1_led_ctrl.set_mic_dnr_state(unsigned dnr_enabled): + // 改动原因:接收 tile0 按键逻辑下发的 DNR 状态,刷新 mic 区蓝灯;静音优先在 apply 内部处理。 + mic_dnr_on = (dnr_enabled != 0) ? 1 : 0; + apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, mic_voice_fx_on, mic_dnr_on, led_shadow); break; } } diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_main.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_main.h index 0eb4b5e..59edb91 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_main.h +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_main.h @@ -14,6 +14,9 @@ interface c1_led_ctrl_if { // 改动原因:麦克风键双击“变声/美声”仅改灯效时,在 tile1 点亮 p_leds 的 mic 区:非0=bit2 红 + bit3 绿(橙),0=仅按静音规则驱动 bit2、bit3 熄灭。 // 改动原因:参数名不能用 xC 保留字 on(on tile[:]: 语法),否则编译器在解析 interface 时报 parse error before "on"。 void set_mic_voice_fx(unsigned voice_fx_enabled); + // 改动原因:麦克风键长按1.5s切换AI通话降噪(DNR),开时点亮p_mic_mute_led_blue蓝灯; + // 与变声同时开时橙+蓝混合;静音优先(静音时所有mic灯被红灯取代)。断电需保存。 + void set_mic_dnr_state(unsigned dnr_enabled); }; void switch_handler(void); void flag_handler(); diff --git a/sw_usb_audio/app_usb_aud_fosi_c1_lp/src/extensions/audiohw.xc b/sw_usb_audio/app_usb_aud_fosi_c1_lp/src/extensions/audiohw.xc index 03c5f79..d5e2dd0 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1_lp/src/extensions/audiohw.xc +++ b/sw_usb_audio/app_usb_aud_fosi_c1_lp/src/extensions/audiohw.xc @@ -126,6 +126,10 @@ timer tm; // 改动原因:DAC 音量单独持久化路径,与 mode 的 c1_mode 文件分离,避免互相覆盖且便于维护。 #define C1_DAC_VOL_INFO_PATH "c1_dac_vol" +// 改动原因:麦克风按键三种状态(静音/变声/DNR)均需断电保存,上电恢复并同步LED显示。 +#define C1_MIC_MUTE_INFO_PATH "c1_mic_mute" +#define C1_VOICE_FX_INFO_PATH "c1_voice_fx" +#define C1_DNR_EN_INFO_PATH "c1_dnr_en" // 改动原因:与 FORMAT_DELAY(30000000) 相同时间基准(get_reference_time 滴答),用户停止调节 300ms 后再写 Flash,减少磨损并满足需求。 #define C1_DAC_VOL_SAVE_DELAY (30000000) @@ -618,14 +622,35 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli dac_vol_persist_deadline = 0; } - // 改动原因:tile1 上电已硬件全灭;先下发当前 g_mute_switch 再下发 Flash 中的 c1_mode,使首帧 apply 时 mic 已正确,避免仅 set_mode 时用占位 mic 闪错 mute 灯。 - unsigned init_mute_for_led; - GET_SHARED_GLOBAL(init_mute_for_led, g_mute_switch); - i_c1_led_ctrl.set_mic_mute_state(init_mute_for_led); - i_c1_led_ctrl.set_mode_led_color(c1_mode_to_tile_mode_led_code(c1_mode)); - // 改动原因:上电默认关闭变声灯效覆盖,避免未初始化随机亮橙。 - i_c1_led_ctrl.set_mic_voice_fx(0); - last_mute_switch_for_led = init_mute_for_led; + + // 改动原因:三种 mic 状态(静音/变声/DNR)均需断电保存,上电从 Flash 读取并恢复;无效値(非 0/1)时使用默认値。 + { + unsigned char loaded_mute = load_value(C1_MIC_MUTE_INFO_PATH); + unsigned init_mute = (loaded_mute == 0 || loaded_mute == 1) ? (unsigned)loaded_mute : 1u; + SET_SHARED_GLOBAL(g_mute_switch, init_mute); + } + { + unsigned char loaded_vfx = load_value(C1_VOICE_FX_INFO_PATH); + c1_mic_voice_fx = (loaded_vfx == 1) ? 1u : 0u; + } + { + unsigned char loaded_dnr = load_value(C1_DNR_EN_INFO_PATH); + unsigned init_dnr = (loaded_dnr == 0 || loaded_dnr == 1) ? (unsigned)loaded_dnr : 1u; + SET_SHARED_GLOBAL(g_dnr_enable, init_dnr); + } + + // 改动原因:tile1 上电已硬件全灯;先下发三种mic状态再下发 mode,使首帧 apply 时 mic 已正确。 + { + unsigned init_mute_for_led; + unsigned init_dnr_for_led; + GET_SHARED_GLOBAL(init_mute_for_led, g_mute_switch); + GET_SHARED_GLOBAL(init_dnr_for_led, g_dnr_enable); + i_c1_led_ctrl.set_mic_mute_state(init_mute_for_led); + i_c1_led_ctrl.set_mode_led_color(c1_mode_to_tile_mode_led_code(c1_mode)); + i_c1_led_ctrl.set_mic_voice_fx(c1_mic_voice_fx); + i_c1_led_ctrl.set_mic_dnr_state(init_dnr_for_led); + last_mute_switch_for_led = init_mute_for_led; + } while(1) { @@ -889,6 +914,8 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli mic_volume(effective_adc_vol, i2c); } SET_SHARED_GLOBAL(g_mute_switch, current_mute_switch); + // 改动原因:静音状态变化后立即保存到Flash,保证断电后恢复正确的静音灯状态。 + save_value(C1_MIC_MUTE_INFO_PATH, (unsigned char)current_mute_switch); i_c1_led_ctrl.set_mic_mute_state(current_mute_switch); last_mute_switch_for_led = current_mute_switch; debug_printf("C1 key mic mute toggle (deferred single): %d\n", current_mute_switch); @@ -937,6 +964,9 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli GET_SHARED_GLOBAL(dnr_enable, g_dnr_enable); dnr_enable = (dnr_enable != 0) ? 0 : 1; SET_SHARED_GLOBAL(g_dnr_enable, dnr_enable); + // 改动原因:DNR状态变化后立即下发LED(开亮蓝灯/关灯),并保存到Flash供断电恢复。 + i_c1_led_ctrl.set_mic_dnr_state(dnr_enable); + save_value(C1_DNR_EN_INFO_PATH, (unsigned char)dnr_enable); mic_dnr_long_fired = 1; debug_printf("C1 mic DNR toggle (hold 1.5s): %d\n", dnr_enable); } @@ -1008,6 +1038,8 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli { c1_mic_voice_fx = (c1_mic_voice_fx ? 0 : 1); i_c1_led_ctrl.set_mic_voice_fx(c1_mic_voice_fx); + // 改动原因:变声状态变化后立即保存到Flash,保证断电后恢复正确的变声灯状态。 + save_value(C1_VOICE_FX_INFO_PATH, (unsigned char)c1_mic_voice_fx); mic_dbl_stage = 0; mic_defer_left = 0; debug_printf("C1 mic voice/beautifier toggle: %d\n", c1_mic_voice_fx); @@ -1951,23 +1983,29 @@ static inline void c1_panel_leds_force_all_off_hw(void) p_mic_mute_led_blue <: 1; } -// 改动原因:c1_mode 与灯索引一致:1=灭 2=蓝 3=绿 4=橙(R+G) 5=紫(R+B);仅驱动 mode 区(p_mode_led_red + p_leds bit0/1),不受 mic 变声影响。 -// mic_voice_fx_on:规格变声/美声橙灯在 mic 区——p_leds bit2 红 + bit3 绿同时点亮;关变声时 mic 区仅由静音决定 bit2,bit3 熄灭。 -static inline void apply_c1_panel_leds(unsigned mode_led_color_idx, unsigned mic_mute_switch, unsigned mic_voice_fx_on, unsigned &led_shadow) +// 改动原因:c1_mode 与灯索引一致:1=灯 2=蓝 3=绿 4=橙(R+G) 5=紫(R+B);仅驱动 mode 区(p_mode_led_red + p_leds bit0/1),不受 mic 变声影响。 +// 改动原因:mic 区灯优先级:静音=只亮红灯(覆盖变声/DNR);非静音时变声=橙(R+G),DNR=蓝(p_mic_mute_led_blue), +// 两者同开=橙+蓝混合,两者均关=全灯。 +static inline void apply_c1_panel_leds(unsigned mode_led_color_idx, unsigned mic_mute_switch, unsigned mic_voice_fx_on, unsigned mic_dnr_on, unsigned &led_shadow) { unsigned mode_red = 0; unsigned mode_green = 0; unsigned mode_blue = 0; - // 改动原因:与 user_main.h 约定一致——mic_mute_switch 存的是“非静音=1、静音=0”,静音时 mic 红灯(bit2)亮。 unsigned mic_red = 0; unsigned mic_green = 0; - if (mic_voice_fx_on) { - // 改动原因:变声开为橙=R+G,映射到 XS1_PORT_4D 的 mic 专用 bit2/bit3,不占用 mode 的 bit0/bit1。 - mic_red = 1; - mic_green = 1; - } else { - mic_red = (mic_mute_switch == 0) ? 1 : 0; + unsigned mic_blue = 0; + + // 改动原因:静音优先——静音(mic_mute_switch==0)时只亮红灯,屏蔽变声橙灯和DNR蓝灯; + // 关闭静音后恢复为变声/DNR/混合/全灯的组合状态,满足“关闭静音时回到其他模式的灯颜色”需求。 + if (mic_mute_switch == 0) { + mic_red = 1; mic_green = 0; + mic_blue = 0; + } else { + // 改动原因:变声=橙(R+G),DNR=蓝,两者同时开=橙+蓝混合,两者均关=全灯。 + mic_red = mic_voice_fx_on ? 1 : 0; + mic_green = mic_voice_fx_on ? 1 : 0; + mic_blue = mic_dnr_on ? 1 : 0; } if (mode_led_color_idx == 1) { @@ -1990,7 +2028,8 @@ static inline void apply_c1_panel_leds(unsigned mode_led_color_idx, unsigned mic mode_blue = 0; } - // 改动原因:硬件LED为低电平点亮(1灭/0亮);低四位 bit0~3 分别为 mode绿、mode蓝、mic红、mic绿,统一刷新避免旧代码固定 |=0x8 导致 bit3 永灭。 + // 改动原因:硬件LED为低电平点亮(1灯/0亮);低四位 bit0~3 分别为 mode绿、mode蓝、mic红、mic绿,统一刷新。 + // 改动原因:p_mic_mute_led_blue 由 mic_blue 驱动,DNR开且非静音时亮蓝灯(输出0=亮)。 p_mode_led_red <: (mode_red ? 0 : 1); led_shadow &= ~0xF; led_shadow |= (mode_green ? 0x0 : 0x1); @@ -1998,18 +2037,19 @@ static inline void apply_c1_panel_leds(unsigned mode_led_color_idx, unsigned mic led_shadow |= (mic_red ? 0x0 : 0x4); led_shadow |= (mic_green ? 0x0 : 0x8); p_leds <: led_shadow; - // 改动原因:该蓝灯当前不参与功能,保持熄灭(低电平有效下输出1表示灭)。 - p_mic_mute_led_blue <: 1; + p_mic_mute_led_blue <: (mic_blue ? 0 : 1); } void app_control_slave(server interface c1_led_ctrl_if i_c1_led_ctrl, chanend c_eq_data) { - // 改动原因:tile1 先于 tile0 运行,上电先把硬件灯全灭且不调用 apply,避免用占位 mic/mode 组合误亮;shadow 置为全灭电平便于首包 set_* 时 apply 与端口一致。 + // 改动原因:tile1 先于 tile0 运行,上电先把硬件灯全灯且不调用 apply,避免用占位 mic/mode 组合误亮;shadow 置为全灯灯电平便于首包 set_* 时 apply 与端口一致。 unsigned led_shadow = 0xF; unsigned mode_led_color_idx = 1; unsigned mic_mute_switch = 1; // 改动原因:变声/美声开时仅 p_leds bit2/bit3 显橙,与 set_mode_led_color 下发的 mode 灯独立;此处状态与 tile0 set_mic_voice_fx 同步。 unsigned mic_voice_fx_on = 0; + // 改动原因:AI通话降噪DNR开时点亮p_mic_mute_led_blue蓝灯;与变声同时开时橙+蓝混合;静音优先在 apply 内部处理。 + unsigned mic_dnr_on = 0; c1_panel_leds_force_all_off_hw(); unsigned eq_mode_time = 0; @@ -2028,19 +2068,24 @@ void app_control_slave(server interface c1_led_ctrl_if i_c1_led_ctrl, chanend c_ unsafe { select{ case i_c1_led_ctrl.set_mode_led_color(unsigned color_idx): - // 改动原因:color_idx 与 c1_mode 同值 1~5;越界时钳位为默认灯码,避免未定义索引。 + // 改动原因:color_idx 与 c1_mode 同値 1~5;越界时酆位为默认灯码,避免未定义索引。 mode_led_color_idx = color_idx; if (mode_led_color_idx > 5 || mode_led_color_idx < 1) mode_led_color_idx = C1_MODE_VALUE_DEFAULT; - apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, mic_voice_fx_on, led_shadow); + apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, mic_voice_fx_on, mic_dnr_on, led_shadow); break; case i_c1_led_ctrl.set_mic_mute_state(unsigned mute_state): mic_mute_switch = (mute_state != 0) ? 1 : 0; - apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, mic_voice_fx_on, led_shadow); + apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, mic_voice_fx_on, mic_dnr_on, led_shadow); break; case i_c1_led_ctrl.set_mic_voice_fx(unsigned voice_fx_enabled): mic_voice_fx_on = (voice_fx_enabled != 0) ? 1 : 0; - apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, mic_voice_fx_on, led_shadow); + apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, mic_voice_fx_on, mic_dnr_on, led_shadow); + break; + case i_c1_led_ctrl.set_mic_dnr_state(unsigned dnr_enabled): + // 改动原因:接收 tile0 按键逻辑下发的 DNR 状态,刷新 mic 区蓝灯;静音优先在 apply 内部处理。 + mic_dnr_on = (dnr_enabled != 0) ? 1 : 0; + apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, mic_voice_fx_on, mic_dnr_on, led_shadow); break; } } diff --git a/sw_usb_audio/app_usb_aud_fosi_c1_lp/src/extensions/user_main.h b/sw_usb_audio/app_usb_aud_fosi_c1_lp/src/extensions/user_main.h index 8eebeb1..65160cd 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1_lp/src/extensions/user_main.h +++ b/sw_usb_audio/app_usb_aud_fosi_c1_lp/src/extensions/user_main.h @@ -13,6 +13,9 @@ interface c1_led_ctrl_if { // 改动原因:麦克风键双击“变声/美声”仅改灯效时,在 tile1 点亮 p_leds 的 mic 区:非0=bit2 红 + bit3 绿(橙),0=仅按静音规则驱动 bit2、bit3 熄灭。 // 改动原因:参数名不能用 xC 保留字 on(on tile[:]: 语法),否则编译器在解析 interface 时报 parse error before "on"。 void set_mic_voice_fx(unsigned voice_fx_enabled); + // 改动原因:麦克风键长按1.5s切换AI通话降噪(DNR),开时点亮p_mic_mute_led_blue蓝灯; + // 与变声同时开时橙+蓝混合;静音优先(静音时所有mic灯被红灯取代)。断电需保存。 + void set_mic_dnr_state(unsigned dnr_enabled); }; void switch_handler(void); void flag_handler();