update mic detection logic
This commit is contained in:
@@ -2428,18 +2428,24 @@ 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;
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user