update mic detection logic
This commit is contained in:
@@ -2428,18 +2428,24 @@ void mute_handler(chanend c_mic_det)
|
|||||||
p_ctl_mute <: 0xf;
|
p_ctl_mute <: 0xf;
|
||||||
|
|
||||||
// mic detect: bit1=mic1 (插入=高, 拔出=低), bit2=mic2 (插入=低, 拔出=高)
|
// mic detect: bit1=mic1 (插入=高, 拔出=低), bit2=mic2 (插入=低, 拔出=高)
|
||||||
|
c_mic_det <: (unsigned)MIC_DET_MUTE;
|
||||||
unsigned det_val;
|
unsigned det_val;
|
||||||
p_ctl_det :> det_val;
|
p_ctl_det :> det_val;
|
||||||
unsigned mic1_in = (det_val >> 1) & 1; // bit1: 1=inserted
|
unsigned mic1_in = (det_val >> 1) & 1; // bit1: 1=inserted
|
||||||
unsigned mic2_in = ((det_val >> 2) & 1) ^ 1; // bit2: 0=inserted, invert
|
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 any_mic_in = mic1_in || mic2_in;
|
||||||
unsigned prev_mic1_in = mic1_in;
|
unsigned prev_mic1_in = mic1_in;
|
||||||
unsigned prev_mic2_in = mic2_in;
|
unsigned prev_mic2_in = mic2_in;
|
||||||
unsigned prev_any_mic_in = any_mic_in;
|
unsigned prev_any_mic_in = any_mic_in;
|
||||||
|
unsigned prev_phone_in = phone_in;
|
||||||
|
|
||||||
// 如果开机时全拔出,发送mute
|
// 如果开机时全拔出,发送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;
|
timer tmr;
|
||||||
@@ -2457,14 +2463,16 @@ void mute_handler(chanend c_mic_det)
|
|||||||
p_ctl_det :> det_val;
|
p_ctl_det :> det_val;
|
||||||
mic1_in = (det_val >> 1) & 1;
|
mic1_in = (det_val >> 1) & 1;
|
||||||
mic2_in = ((det_val >> 2) & 1) ^ 1;
|
mic2_in = ((det_val >> 2) & 1) ^ 1;
|
||||||
|
phone_in = ((det_val >> 3) & 1) ^ 1;
|
||||||
any_mic_in = mic1_in || mic2_in;
|
any_mic_in = mic1_in || mic2_in;
|
||||||
|
|
||||||
// 检测单个mic插拔事件
|
// 检测单个mic插拔事件
|
||||||
unsigned mic1_changed = (mic1_in != prev_mic1_in);
|
unsigned mic1_changed = (mic1_in != prev_mic1_in);
|
||||||
unsigned mic2_changed = (mic2_in != prev_mic2_in);
|
unsigned mic2_changed = (mic2_in != prev_mic2_in);
|
||||||
unsigned any_changed = mic1_changed || mic2_changed;
|
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音
|
// 状态变化:立即mute mic和DAC防止pop音
|
||||||
p_ctl_mute <: 0;
|
p_ctl_mute <: 0;
|
||||||
c_mic_det <: (unsigned)MIC_DET_MUTE;
|
c_mic_det <: (unsigned)MIC_DET_MUTE;
|
||||||
@@ -2486,12 +2494,25 @@ void mute_handler(chanend c_mic_det)
|
|||||||
p_ctl_det :> det_val;
|
p_ctl_det :> det_val;
|
||||||
mic1_in = (det_val >> 1) & 1;
|
mic1_in = (det_val >> 1) & 1;
|
||||||
mic2_in = ((det_val >> 2) & 1) ^ 1;
|
mic2_in = ((det_val >> 2) & 1) ^ 1;
|
||||||
|
phone_in = ((det_val >> 3) & 1) ^ 1;
|
||||||
any_mic_in = mic1_in || mic2_in;
|
any_mic_in = mic1_in || mic2_in;
|
||||||
|
|
||||||
// 恢复DAC状态
|
// 恢复DAC状态
|
||||||
c_mic_det <: (unsigned)MIC_DET_DAC_UNMUTE;
|
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音量状态
|
// 有mic插入,恢复mic音量状态
|
||||||
c_mic_det <: (unsigned)MIC_DET_UNMUTE;
|
c_mic_det <: (unsigned)MIC_DET_UNMUTE;
|
||||||
debug_printf("mic stable -> unmute\n");
|
debug_printf("mic stable -> unmute\n");
|
||||||
@@ -2501,7 +2522,7 @@ void mute_handler(chanend c_mic_det)
|
|||||||
prev_mic1_in = mic1_in;
|
prev_mic1_in = mic1_in;
|
||||||
prev_mic2_in = mic2_in;
|
prev_mic2_in = mic2_in;
|
||||||
prev_any_mic_in = any_mic_in;
|
prev_any_mic_in = any_mic_in;
|
||||||
|
prev_phone_in = phone_in;
|
||||||
// 重新同步timer
|
// 重新同步timer
|
||||||
tmr :> time;
|
tmr :> time;
|
||||||
time += MIC_DET_POLL_MS * 100000;
|
time += MIC_DET_POLL_MS * 100000;
|
||||||
|
|||||||
Reference in New Issue
Block a user