From 7f0eb6b691ef0176704a7875d0ac482abf9225f7 Mon Sep 17 00:00:00 2001 From: Steven Dan Date: Wed, 29 Apr 2026 16:19:14 +0800 Subject: [PATCH] update mic detection logic --- .../src/extensions/audiohw.xc | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/audiohw.xc b/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/audiohw.xc index 15143c8..39e3e42 100644 --- a/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/audiohw.xc +++ b/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/audiohw.xc @@ -2428,20 +2428,26 @@ void mute_handler(chanend c_mic_det) p_ctl_mute <: 0xf; // mic detect: bit1=mic1 (插入=高, 拔出=低), bit2=mic2 (插入=低, 拔出=高) + c_mic_det <: (unsigned)MIC_DET_MUTE; unsigned det_val; p_ctl_det :> det_val; unsigned mic1_in = (det_val >> 1) & 1; // bit1: 1=inserted unsigned mic2_in = ((det_val >> 2) & 1) ^ 1; // bit2: 0=inserted, invert + unsigned phone_in = ((det_val >> 3) & 1) ^ 1; // bit3: 0=inserted, invert unsigned any_mic_in = mic1_in || mic2_in; unsigned prev_mic1_in = mic1_in; unsigned prev_mic2_in = mic2_in; unsigned prev_any_mic_in = any_mic_in; + unsigned prev_phone_in = phone_in; // 如果开机时全拔出,发送mute - if (!any_mic_in) { - c_mic_det <: (unsigned)MIC_DET_MUTE; - } + if (((det_val & 0b1110) == 0b1110) || ((det_val & 0b1110) == 0b1010) || ((det_val & 0b1110) == 0b0010)) { + // 有mic插入,恢复mic音量状态 + c_mic_det <: (unsigned)MIC_DET_UNMUTE; + debug_printf("mic stable -> unmute\n"); + } + timer tmr; unsigned time; tmr :> time; @@ -2457,14 +2463,16 @@ void mute_handler(chanend c_mic_det) p_ctl_det :> det_val; mic1_in = (det_val >> 1) & 1; mic2_in = ((det_val >> 2) & 1) ^ 1; + phone_in = ((det_val >> 3) & 1) ^ 1; any_mic_in = mic1_in || mic2_in; // 检测单个mic插拔事件 unsigned mic1_changed = (mic1_in != prev_mic1_in); unsigned mic2_changed = (mic2_in != prev_mic2_in); unsigned any_changed = mic1_changed || mic2_changed; + unsigned phone_changed = (phone_in != prev_phone_in); - if (any_changed) { + if (any_changed || phone_changed) { // 状态变化:立即mute mic和DAC防止pop音 p_ctl_mute <: 0; c_mic_det <: (unsigned)MIC_DET_MUTE; @@ -2486,12 +2494,25 @@ void mute_handler(chanend c_mic_det) p_ctl_det :> det_val; mic1_in = (det_val >> 1) & 1; mic2_in = ((det_val >> 2) & 1) ^ 1; + phone_in = ((det_val >> 3) & 1) ^ 1; any_mic_in = mic1_in || mic2_in; // 恢复DAC状态 c_mic_det <: (unsigned)MIC_DET_DAC_UNMUTE; - if (any_mic_in) { +#if 0 + if ((any_mic_in && !phone_in) || (phone_in && mic2_in)) { + // 有mic插入,恢复mic音量状态 + c_mic_det <: (unsigned)MIC_DET_UNMUTE; + debug_printf("mic stable -> unmute\n"); + } + // 全拔出则保持mic mute + + delay_milliseconds(200); + +#endif + + if (((det_val & 0b1110) == 0b1110) || ((det_val & 0b1110) == 0b1010) || ((det_val & 0b1110) == 0b0010)) { // 有mic插入,恢复mic音量状态 c_mic_det <: (unsigned)MIC_DET_UNMUTE; debug_printf("mic stable -> unmute\n"); @@ -2501,7 +2522,7 @@ void mute_handler(chanend c_mic_det) prev_mic1_in = mic1_in; prev_mic2_in = mic2_in; prev_any_mic_in = any_mic_in; - + prev_phone_in = phone_in; // 重新同步timer tmr :> time; time += MIC_DET_POLL_MS * 100000;