From c3b4857ac968500cef475c5c86b50536c36501e3 Mon Sep 17 00:00:00 2001 From: Steven Dan Date: Tue, 19 May 2026 13:45:29 +0800 Subject: [PATCH] dnr button support --- .../src/extensions/audiohw.xc | 29 ++++++++++++------- .../src/extensions/audiohw.xc | 29 ++++++++++++------- .../src/extensions/audiohw.xc | 29 ++++++++++++------- 3 files changed, 57 insertions(+), 30 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 df05a82..9aa802f 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 @@ -112,8 +112,8 @@ timer tm; // 改动原因:C1的TIMER_PERIOD为20ms,按DS1同类短按/长按模型换算阈值;mode/mic 仍用 LONG 区分短按窗口;音量键已取消长按连调故不再使用 REPEAT 间隔宏。 #define C1_KEY_SHORT_TICKS 1 #define C1_KEY_LONG_TICKS 50 -// 改动原因:规格要求 mic 键长按 1.5s 触发 AI 通话降噪开关;20ms*75=1.5s,与 mode 键的 C1_KEY_LONG_TICKS(1s) 解耦,避免误触。 -#define C1_KEY_MIC_AI_NR_TICKS 75 +// 改动原因:规格要求 mic 键长按 1.5s 切换 g_dnr_enable(AI 通话降噪/DNR);20ms*75=1.5s,与 mode 键 LONG 解耦,避免误触。 +#define C1_KEY_MIC_DNR_LONG_TICKS 75 // 改动原因:双击第二下需在首击释放后约 500ms 内按下,否则判为单击静音;20ms*25=500ms。 #define C1_MIC_DOUBLE_DEFER_TICKS 25 // 改动原因:新增C1模式持久化文件路径,使用LittleFS保存mode按键状态,保证断电重启后可恢复。 @@ -514,13 +514,12 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli unsigned vol_down_press_ticks = 0; unsigned mic_mute_press_ticks = 0; unsigned vol_up_press_ticks = 0; - // 改动原因:mic 键双击需延迟首轮短按的静音动作,用 stage1=等超时单击 / stage2=已收到第二下按下等释放;与长按 AI 互斥靠 mic_ai_long_fired。 + // 改动原因:mic 键双击需延迟首轮短按的静音动作,用 stage1=等超时单击 / stage2=已收到第二下按下等释放;与长按 DNR 互斥靠 mic_dnr_long_fired。 unsigned mic_dbl_stage = 0; unsigned mic_defer_left = 0; - unsigned mic_ai_long_fired = 0; - // 改动原因:变声/美声仅按键+灯,tile0 保存状态供下发橙色 mode 区;AI 降噪无灯仅本地翻转供后续扩展。 + unsigned mic_dnr_long_fired = 0; + // 改动原因:变声/美声仅按键+灯,tile0 保存状态供 set_mic_voice_fx 下发 mic 橙灯。 unsigned c1_mic_voice_fx = 0; - unsigned c1_mic_ai_nr = 0; // 改动原因:mic mute红灯通过interface下发到tile1,仅在状态变化时发送,减少无意义跨tile调用。 unsigned last_mute_switch_for_led = 0xFFFFFFFF; unsigned host_os = 0; @@ -894,6 +893,16 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli mic_dbl_stage = 2; } mic_mute_press_ticks++; + // 改动原因:按住满 1.5s 翻转 g_dnr_enable,extra_i2s 中 GET_SHARED_GLOBAL 决定是否走 DNR;松手时靠 mic_dnr_long_fired 屏蔽短按/双击。 + if (mic_mute_press_ticks == C1_KEY_MIC_DNR_LONG_TICKS) + { + unsigned dnr_enable; + GET_SHARED_GLOBAL(dnr_enable, g_dnr_enable); + dnr_enable = (dnr_enable != 0) ? 0 : 1; + SET_SHARED_GLOBAL(g_dnr_enable, dnr_enable); + mic_dnr_long_fired = 1; + debug_printf("C1 mic DNR toggle (hold 1.5s): %d\n", dnr_enable); + } // 改动原因:同一时刻只允许mic mute键生效,清除其它键状态,避免释放时误执行音量或mode短按。 mode_press_ticks = 0; vol_down_press_ticks = 0; @@ -950,17 +959,17 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli } } - // 改动原因:mic:短按静音改为延迟单击(防双击);双击短按切变声灯(橙R+G);按住满1.5s仅切 AI 状态变量无灯;长按与短/双互斥。 + // 改动原因:mic:短按静音延迟单击(防双击);双击变声 mic 橙灯;长按1.5s 切 g_dnr_enable 无灯;长按与短/双互斥。 { unsigned mic_snap = mic_mute_press_ticks; if (mic_snap > 0) { - if ((mic_snap >= C1_KEY_MIC_AI_NR_TICKS) || mic_ai_long_fired) + if ((mic_snap >= C1_KEY_MIC_DNR_LONG_TICKS) || mic_dnr_long_fired) { if (mic_dbl_stage == 2) mic_dbl_stage = 0; } - else if ((mic_snap >= C1_KEY_SHORT_TICKS) && (mic_snap < C1_KEY_MIC_AI_NR_TICKS)) + else if ((mic_snap >= C1_KEY_SHORT_TICKS) && (mic_snap < C1_KEY_MIC_DNR_LONG_TICKS)) { if (mic_dbl_stage == 2) { @@ -976,7 +985,7 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli mic_defer_left = C1_MIC_DOUBLE_DEFER_TICKS; } } - mic_ai_long_fired = 0; + mic_dnr_long_fired = 0; } } 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 df05a82..9aa802f 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 @@ -112,8 +112,8 @@ timer tm; // 改动原因:C1的TIMER_PERIOD为20ms,按DS1同类短按/长按模型换算阈值;mode/mic 仍用 LONG 区分短按窗口;音量键已取消长按连调故不再使用 REPEAT 间隔宏。 #define C1_KEY_SHORT_TICKS 1 #define C1_KEY_LONG_TICKS 50 -// 改动原因:规格要求 mic 键长按 1.5s 触发 AI 通话降噪开关;20ms*75=1.5s,与 mode 键的 C1_KEY_LONG_TICKS(1s) 解耦,避免误触。 -#define C1_KEY_MIC_AI_NR_TICKS 75 +// 改动原因:规格要求 mic 键长按 1.5s 切换 g_dnr_enable(AI 通话降噪/DNR);20ms*75=1.5s,与 mode 键 LONG 解耦,避免误触。 +#define C1_KEY_MIC_DNR_LONG_TICKS 75 // 改动原因:双击第二下需在首击释放后约 500ms 内按下,否则判为单击静音;20ms*25=500ms。 #define C1_MIC_DOUBLE_DEFER_TICKS 25 // 改动原因:新增C1模式持久化文件路径,使用LittleFS保存mode按键状态,保证断电重启后可恢复。 @@ -514,13 +514,12 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli unsigned vol_down_press_ticks = 0; unsigned mic_mute_press_ticks = 0; unsigned vol_up_press_ticks = 0; - // 改动原因:mic 键双击需延迟首轮短按的静音动作,用 stage1=等超时单击 / stage2=已收到第二下按下等释放;与长按 AI 互斥靠 mic_ai_long_fired。 + // 改动原因:mic 键双击需延迟首轮短按的静音动作,用 stage1=等超时单击 / stage2=已收到第二下按下等释放;与长按 DNR 互斥靠 mic_dnr_long_fired。 unsigned mic_dbl_stage = 0; unsigned mic_defer_left = 0; - unsigned mic_ai_long_fired = 0; - // 改动原因:变声/美声仅按键+灯,tile0 保存状态供下发橙色 mode 区;AI 降噪无灯仅本地翻转供后续扩展。 + unsigned mic_dnr_long_fired = 0; + // 改动原因:变声/美声仅按键+灯,tile0 保存状态供 set_mic_voice_fx 下发 mic 橙灯。 unsigned c1_mic_voice_fx = 0; - unsigned c1_mic_ai_nr = 0; // 改动原因:mic mute红灯通过interface下发到tile1,仅在状态变化时发送,减少无意义跨tile调用。 unsigned last_mute_switch_for_led = 0xFFFFFFFF; unsigned host_os = 0; @@ -894,6 +893,16 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli mic_dbl_stage = 2; } mic_mute_press_ticks++; + // 改动原因:按住满 1.5s 翻转 g_dnr_enable,extra_i2s 中 GET_SHARED_GLOBAL 决定是否走 DNR;松手时靠 mic_dnr_long_fired 屏蔽短按/双击。 + if (mic_mute_press_ticks == C1_KEY_MIC_DNR_LONG_TICKS) + { + unsigned dnr_enable; + GET_SHARED_GLOBAL(dnr_enable, g_dnr_enable); + dnr_enable = (dnr_enable != 0) ? 0 : 1; + SET_SHARED_GLOBAL(g_dnr_enable, dnr_enable); + mic_dnr_long_fired = 1; + debug_printf("C1 mic DNR toggle (hold 1.5s): %d\n", dnr_enable); + } // 改动原因:同一时刻只允许mic mute键生效,清除其它键状态,避免释放时误执行音量或mode短按。 mode_press_ticks = 0; vol_down_press_ticks = 0; @@ -950,17 +959,17 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli } } - // 改动原因:mic:短按静音改为延迟单击(防双击);双击短按切变声灯(橙R+G);按住满1.5s仅切 AI 状态变量无灯;长按与短/双互斥。 + // 改动原因:mic:短按静音延迟单击(防双击);双击变声 mic 橙灯;长按1.5s 切 g_dnr_enable 无灯;长按与短/双互斥。 { unsigned mic_snap = mic_mute_press_ticks; if (mic_snap > 0) { - if ((mic_snap >= C1_KEY_MIC_AI_NR_TICKS) || mic_ai_long_fired) + if ((mic_snap >= C1_KEY_MIC_DNR_LONG_TICKS) || mic_dnr_long_fired) { if (mic_dbl_stage == 2) mic_dbl_stage = 0; } - else if ((mic_snap >= C1_KEY_SHORT_TICKS) && (mic_snap < C1_KEY_MIC_AI_NR_TICKS)) + else if ((mic_snap >= C1_KEY_SHORT_TICKS) && (mic_snap < C1_KEY_MIC_DNR_LONG_TICKS)) { if (mic_dbl_stage == 2) { @@ -976,7 +985,7 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli mic_defer_left = C1_MIC_DOUBLE_DEFER_TICKS; } } - mic_ai_long_fired = 0; + mic_dnr_long_fired = 0; } } 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 e0c6358..922325a 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 @@ -128,8 +128,8 @@ timer tm; // 改动原因:C1的TIMER_PERIOD为20ms,按DS1同类短按/长按模型换算阈值;mode/mic 仍用 LONG 区分短按窗口;音量键已取消长按连调故不再使用 REPEAT 间隔宏。 #define C1_KEY_SHORT_TICKS 1 #define C1_KEY_LONG_TICKS 50 -// 改动原因:规格要求 mic 键长按 1.5s 触发 AI 通话降噪开关;20ms*75=1.5s,与 mode 键的 C1_KEY_LONG_TICKS(1s) 解耦,避免误触。 -#define C1_KEY_MIC_AI_NR_TICKS 75 +// 改动原因:规格要求 mic 键长按 1.5s 切换 g_dnr_enable(AI 通话降噪/DNR);20ms*75=1.5s,与 mode 键 LONG 解耦,避免误触。 +#define C1_KEY_MIC_DNR_LONG_TICKS 75 // 改动原因:双击第二下需在首击释放后约 500ms 内按下,否则判为单击静音;20ms*25=500ms。 #define C1_MIC_DOUBLE_DEFER_TICKS 25 // 改动原因:新增C1模式持久化文件路径,使用LittleFS保存mode按键状态,保证断电重启后可恢复。 @@ -533,13 +533,12 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli unsigned vol_down_press_ticks = 0; unsigned mic_mute_press_ticks = 0; unsigned vol_up_press_ticks = 0; - // 改动原因:mic 键双击需延迟首轮短按的静音动作,用 stage1=等超时单击 / stage2=已收到第二下按下等释放;与长按 AI 互斥靠 mic_ai_long_fired。 + // 改动原因:mic 键双击需延迟首轮短按的静音动作,用 stage1=等超时单击 / stage2=已收到第二下按下等释放;与长按 DNR 互斥靠 mic_dnr_long_fired。 unsigned mic_dbl_stage = 0; unsigned mic_defer_left = 0; - unsigned mic_ai_long_fired = 0; - // 改动原因:变声/美声仅按键+灯,tile0 保存状态供下发橙色 mode 区;AI 降噪无灯仅本地翻转供后续扩展。 + unsigned mic_dnr_long_fired = 0; + // 改动原因:变声/美声仅按键+灯,tile0 保存状态供 set_mic_voice_fx 下发 mic 橙灯。 unsigned c1_mic_voice_fx = 0; - unsigned c1_mic_ai_nr = 0; // 改动原因:mic mute红灯通过interface下发到tile1,仅在状态变化时发送,减少无意义跨tile调用。 unsigned last_mute_switch_for_led = 0xFFFFFFFF; unsigned host_os = 0; @@ -913,6 +912,16 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli mic_dbl_stage = 2; } mic_mute_press_ticks++; + // 改动原因:按住满 1.5s 翻转 g_dnr_enable,extra_i2s 中 GET_SHARED_GLOBAL 决定是否走 DNR;松手时靠 mic_dnr_long_fired 屏蔽短按/双击。 + if (mic_mute_press_ticks == C1_KEY_MIC_DNR_LONG_TICKS) + { + unsigned dnr_enable; + GET_SHARED_GLOBAL(dnr_enable, g_dnr_enable); + dnr_enable = (dnr_enable != 0) ? 0 : 1; + SET_SHARED_GLOBAL(g_dnr_enable, dnr_enable); + mic_dnr_long_fired = 1; + debug_printf("C1 mic DNR toggle (hold 1.5s): %d\n", dnr_enable); + } // 改动原因:同一时刻只允许mic mute键生效,清除其它键状态,避免释放时误执行音量或mode短按。 mode_press_ticks = 0; vol_down_press_ticks = 0; @@ -969,17 +978,17 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli } } - // 改动原因:mic:短按静音改为延迟单击(防双击);双击短按切变声灯(橙R+G);按住满1.5s仅切 AI 状态变量无灯;长按与短/双互斥。 + // 改动原因:mic:短按静音延迟单击(防双击);双击变声 mic 橙灯;长按1.5s 切 g_dnr_enable 无灯;长按与短/双互斥。 { unsigned mic_snap = mic_mute_press_ticks; if (mic_snap > 0) { - if ((mic_snap >= C1_KEY_MIC_AI_NR_TICKS) || mic_ai_long_fired) + if ((mic_snap >= C1_KEY_MIC_DNR_LONG_TICKS) || mic_dnr_long_fired) { if (mic_dbl_stage == 2) mic_dbl_stage = 0; } - else if ((mic_snap >= C1_KEY_SHORT_TICKS) && (mic_snap < C1_KEY_MIC_AI_NR_TICKS)) + else if ((mic_snap >= C1_KEY_SHORT_TICKS) && (mic_snap < C1_KEY_MIC_DNR_LONG_TICKS)) { if (mic_dbl_stage == 2) { @@ -995,7 +1004,7 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli mic_defer_left = C1_MIC_DOUBLE_DEFER_TICKS; } } - mic_ai_long_fired = 0; + mic_dnr_long_fired = 0; } }