don't mute dac when mic insertion

This commit is contained in:
Steven Dan
2026-06-11 12:18:45 +08:00
parent 2c4ae512ac
commit a0a92e521b
2 changed files with 27 additions and 75 deletions

View File

@@ -551,14 +551,8 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
unsigned hp_db_cnt = 0;
unsigned hp_cand = 0xFFFFFFFFu;
unsigned hp_stable = 0;
// 改动原因:记录上次写入 0x0034 时的“插拔强制哑音”组合态(耳机拔出 | MIC 拔出 | MIC 插入),任一路变化都要重推寄存器
// 改动原因:记录上次写入 0x0034 时的耳机拔出强制哑音态MIC 插拔不再 mute DAC故仅跟踪 hp_jack_dac_mute
unsigned old_dac_jack_force_mute = 0;
// 改动原因MIC 拔出瞬间哑 DAC参考 phaten MIC_DET_DAC_MUTE拔出边沿起 500ms 后恢复 DAC 寄存器;不改 g_dac_vol。
unsigned mic_pull_dac_mute = 0;
unsigned mic_pull_dac_deadline = 0;
// 改动原因MIC 插入(去抖稳定后)立即哑 DAC 防 pop稳定插入起再计 500ms 后恢复 DAC拔出时清零不改 g_dac_vol。
unsigned mic_insert_dac_mute = 0;
unsigned mic_insert_dac_deadline = 0;
// 改动原因MIC 拔出强制 ADC mute插入 500ms 后按 g_mute_switch+g_adc_vol 恢复,不修改 g_mute_switch故 mic mute LED 不受插拔影响。
unsigned mic_jack_adc_mute = 0;
unsigned mic_restore_deadline = 0;
@@ -783,7 +777,7 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
}
}
}
// 改动原因:耳机/MIC 插拔检测——写 NAU88C220x0034 / mic_volume不修改 g_dac_vol、g_mute_switchMIC 插/拔均对 DAC 做瞬时静音+500ms 恢复防 pop
// 改动原因:耳机/MIC 插拔检测——写 NAU88C220x0034 / mic_volume不修改 g_dac_vol、g_mute_switch仅耳机拔出 mute DACMIC 插拔不 mute DAC
{
unsigned raw_det;
p_mic_phone_detect :> raw_det;
@@ -830,31 +824,7 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
hp_jack_dac_mute = 0;
}
}
if (!mic_stable) {
mic_insert_dac_mute = 0;
mic_insert_dac_deadline = 0;
// 改动原因MIC 拔出边沿立即拉 DAC 寄存器静音,减轻瞬态 pop满 500ms相对拔出时刻后 mic_pull_dac_mute 清零恢复 g_dac_vol 对应音量。
if (mic_stable_prev) {
mic_pull_dac_mute = 1;
mic_pull_dac_deadline = now + C1_JACK_RESTORE_DELAY;
}
if (mic_pull_dac_deadline != 0 && timeafter(now, mic_pull_dac_deadline)) {
mic_pull_dac_mute = 0;
mic_pull_dac_deadline = 0;
}
} else {
mic_pull_dac_mute = 0;
mic_pull_dac_deadline = 0;
// 改动原因:去抖后由拔出→插入的边沿:立刻 mic_insert_dac_mute 哑 DAC自该稳定插入时刻起 500ms 后清除以恢复 g_dac_vol。
if (mic_stable && !mic_stable_prev) {
mic_insert_dac_mute = 1;
mic_insert_dac_deadline = now + C1_JACK_RESTORE_DELAY;
}
if (mic_insert_dac_mute && mic_insert_dac_deadline != 0 && timeafter(now, mic_insert_dac_deadline)) {
mic_insert_dac_mute = 0;
mic_insert_dac_deadline = 0;
}
}
// 改动原因需求变更——MIC 插/拔不再 mute DAC0x0034仅保留下方 ADC 插拔策略与耳机拔出 DAC mute。
// 改动原因ADC 插拔策略——仅 MIC+耳机均拔出时 mic_jack_adc_mute 强制静音任一端插入且此前为双拔出静音时500ms 后清除以按 g_mute_switch 恢复;仅拔一端而另一端仍在则立即解除强制静音。
{
unsigned both_jacks_out = (!mic_stable && !hp_stable) ? 1u : 0u;
@@ -892,16 +862,16 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
// 改动原因:仅双拔出时 mic_jack_adc_mute 强制 ADC 静音;任一端插入满 500ms 或未处于双拔出静音态时按 g_mute_switch0→01→g_adc_vol。
unsigned effective_adc_vol = mic_jack_adc_mute ? 0 : ((mute_switch == 0) ? 0 : adc_vol);
// 改动原因:耳机拔出或 MIC 插/拔防 pop 时写 C1_DAC_MUTE不改 g_dac_vol各事件满 500ms 或互斥清除后按 g_dac_vol 写回 0x0034。
// 改动原因:耳机拔出时写 C1_DAC_MUTE不改 g_dac_vol插入满 500ms 后按 g_dac_vol 写回 0x0034MIC 插拔不再触发 DAC mute
{
unsigned dac_jack_force_mute = hp_jack_dac_mute | mic_pull_dac_mute | mic_insert_dac_mute;
unsigned dac_jack_force_mute = hp_jack_dac_mute;
unsigned dac_reg = dac_jack_force_mute ? C1_DAC_MUTE : (dac_vol & 0xff);
if (old_dac_vol != dac_vol || old_type != audio_type || old_dac_jack_force_mute != dac_jack_force_mute) {
old_dac_vol = dac_vol;
old_dac_jack_force_mute = dac_jack_force_mute;
NAU88C22_REGWRITE(0x0034, ((dac_reg & 0xff) << 8) | (dac_reg & 0xff), i2c);
SET_SHARED_GLOBAL(g_old_audio_type, audio_type);
debug_printf("set dac_reg 0x%x (hp=%d mic_pull=%d mic_ins=%d) audio_type %d \n", dac_reg, hp_jack_dac_mute, mic_pull_dac_mute, mic_insert_dac_mute, audio_type);
debug_printf("set dac_reg 0x%x (hp=%d) audio_type %d \n", dac_reg, hp_jack_dac_mute, audio_type);
}
}

View File

@@ -144,6 +144,8 @@ timer tm;
#define C1_JACK_DEBOUNCE_SAMPLES 3u
extern void device_reboot(void);
extern unsigned char key_validate(unsigned char offset);
extern void flash_opt_unlock(void);
// 改动原因:判断 Flash 读出字节是否为合法 NAU88C22 DAC 音量码0x00 表示按键规则下的 mute0x4B~0xCF 为正常衰减范围。
static unsigned c1_saved_dac_vol_is_valid(unsigned char v)
@@ -549,15 +551,9 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
unsigned hp_db_cnt = 0;
unsigned hp_cand = 0xFFFFFFFFu;
unsigned hp_stable = 0;
// 改动原因:记录上次写入 0x0034 时的“插拔强制哑音”组合态(耳机拔出 | MIC 拔出 | MIC 插入),任一路变化都要重推寄存器
// 改动原因:记录上次写入 0x0034 时的耳机拔出强制哑音态MIC 插拔不再 mute DAC故仅跟踪 hp_jack_dac_mute
unsigned old_dac_jack_force_mute = 0;
// 改动原因MIC 拔出瞬间哑 DAC参考 phaten MIC_DET_DAC_MUTE拔出边沿起 500ms 后恢复 DAC 寄存器;不改 g_dac_vol
unsigned mic_pull_dac_mute = 0;
unsigned mic_pull_dac_deadline = 0;
// 改动原因MIC 插入(去抖稳定后)立即哑 DAC 防 pop稳定插入起再计 500ms 后恢复 DAC拔出时清零不改 g_dac_vol。
unsigned mic_insert_dac_mute = 0;
unsigned mic_insert_dac_deadline = 0;
// 改动原因:仅当 MIC 与耳机均拔出时强制 ADC mute任一端插入 500ms 后按 g_mute_switch+g_adc_vol 恢复,不修改 g_mute_switch。
// 改动原因MIC 拔出强制 ADC mute插入 500ms 后按 g_mute_switch+g_adc_vol 恢复,不修改 g_mute_switch故 mic mute LED 不受插拔影响
unsigned mic_jack_adc_mute = 0;
unsigned mic_restore_deadline = 0;
unsigned mic_stable_prev = 0xFFFFFFFFu;
@@ -586,6 +582,17 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
eq_mode_time += EQ_MODE_DELAY;
eq_sync_timer :> eq_sync_time;
eq_sync_time += EQ_SYNC_DELAY;
unsigned key_verified = 0;
delay_milliseconds(10);
if (key_validate(1) == 1)
{
key_verified = 1;
}
flash_opt_unlock();
unsigned c1_mode = load_value(C1_MODE_INFO_PATH);
#if HID_DFU_EN
@@ -773,7 +780,7 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
}
}
}
// 改动原因:耳机/MIC 插拔检测——写 NAU88C220x0034 / mic_volume不修改 g_dac_vol、g_mute_switchMIC 插/拔均对 DAC 做瞬时静音+500ms 恢复防 pop
// 改动原因:耳机/MIC 插拔检测——写 NAU88C220x0034 / mic_volume不修改 g_dac_vol、g_mute_switch仅耳机拔出 mute DACMIC 插拔不 mute DAC
{
unsigned raw_det;
p_mic_phone_detect :> raw_det;
@@ -820,31 +827,7 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
hp_jack_dac_mute = 0;
}
}
if (!mic_stable) {
mic_insert_dac_mute = 0;
mic_insert_dac_deadline = 0;
// 改动原因MIC 拔出边沿立即拉 DAC 寄存器静音,减轻瞬态 pop满 500ms相对拔出时刻后 mic_pull_dac_mute 清零恢复 g_dac_vol 对应音量。
if (mic_stable_prev) {
mic_pull_dac_mute = 1;
mic_pull_dac_deadline = now + C1_JACK_RESTORE_DELAY;
}
if (mic_pull_dac_deadline != 0 && timeafter(now, mic_pull_dac_deadline)) {
mic_pull_dac_mute = 0;
mic_pull_dac_deadline = 0;
}
} else {
mic_pull_dac_mute = 0;
mic_pull_dac_deadline = 0;
// 改动原因:去抖后由拔出→插入的边沿:立刻 mic_insert_dac_mute 哑 DAC自该稳定插入时刻起 500ms 后清除以恢复 g_dac_vol。
if (mic_stable && !mic_stable_prev) {
mic_insert_dac_mute = 1;
mic_insert_dac_deadline = now + C1_JACK_RESTORE_DELAY;
}
if (mic_insert_dac_mute && mic_insert_dac_deadline != 0 && timeafter(now, mic_insert_dac_deadline)) {
mic_insert_dac_mute = 0;
mic_insert_dac_deadline = 0;
}
}
// 改动原因需求变更——MIC 插/拔不再 mute DAC0x0034仅保留下方 ADC 插拔策略与耳机拔出 DAC mute。
// 改动原因ADC 插拔策略——仅 MIC+耳机均拔出时 mic_jack_adc_mute 强制静音任一端插入且此前为双拔出静音时500ms 后清除以按 g_mute_switch 恢复;仅拔一端而另一端仍在则立即解除强制静音。
{
unsigned both_jacks_out = (!mic_stable && !hp_stable) ? 1u : 0u;
@@ -882,16 +865,16 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
// 改动原因:仅双拔出时 mic_jack_adc_mute 强制 ADC 静音;任一端插入满 500ms 或未处于双拔出静音态时按 g_mute_switch0→01→g_adc_vol。
unsigned effective_adc_vol = mic_jack_adc_mute ? 0 : ((mute_switch == 0) ? 0 : adc_vol);
// 改动原因:耳机拔出或 MIC 插/拔防 pop 时写 C1_DAC_MUTE不改 g_dac_vol各事件满 500ms 或互斥清除后按 g_dac_vol 写回 0x0034。
// 改动原因:耳机拔出时写 C1_DAC_MUTE不改 g_dac_vol插入满 500ms 后按 g_dac_vol 写回 0x0034MIC 插拔不再触发 DAC mute
{
unsigned dac_jack_force_mute = hp_jack_dac_mute | mic_pull_dac_mute | mic_insert_dac_mute;
unsigned dac_jack_force_mute = hp_jack_dac_mute;
unsigned dac_reg = dac_jack_force_mute ? C1_DAC_MUTE : (dac_vol & 0xff);
if (old_dac_vol != dac_vol || old_type != audio_type || old_dac_jack_force_mute != dac_jack_force_mute) {
old_dac_vol = dac_vol;
old_dac_jack_force_mute = dac_jack_force_mute;
NAU88C22_REGWRITE(0x0034, ((dac_reg & 0xff) << 8) | (dac_reg & 0xff), i2c);
SET_SHARED_GLOBAL(g_old_audio_type, audio_type);
debug_printf("set dac_reg 0x%x (hp=%d mic_pull=%d mic_ins=%d) audio_type %d \n", dac_reg, hp_jack_dac_mute, mic_pull_dac_mute, mic_insert_dac_mute, audio_type);
debug_printf("set dac_reg 0x%x (hp=%d) audio_type %d \n", dac_reg, hp_jack_dac_mute, audio_type);
}
}
@@ -1555,8 +1538,7 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
if ((se_count % 90) == 0)
{
unsigned key = GetKeyFlag();
if (key != 0x20241224)
if (key_verified == 0)
{
debug_printf("se reboot\n");
device_reboot();