From 6dc21313dc5bb43c23b2a445eb48d15d038b515e Mon Sep 17 00:00:00 2001 From: Steven Dan Date: Sun, 26 Apr 2026 19:20:35 +0800 Subject: [PATCH] dnr strength update --- .../src/extensions/audiohw.xc | 90 ++++++++++++++----- .../src/extensions/eq.c | 18 +++- 2 files changed, 83 insertions(+), 25 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 f45d4f3..cdb5ec5 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 @@ -86,7 +86,9 @@ unsigned g_last_volume_level = 0xFF; // 上次已上报的音量级别,0xFF unsigned g_mic_volume_level = 37; // 麦克风PGA增益级别(0=mute, 1-37=0dB~36dB,HID可见范围) unsigned g_request_mic_volume_set = 0; unsigned g_last_mic_volume_level = 0xFF; // 上次已上报的麦克风增益级别,0xFF表示初始化未完成 -unsigned g_dnr_strength = 100; // AI降噪强度HID值(0=关,2-100=开,步进2;100→-200dB最强) +unsigned g_dnr_strength = 100; // AI降噪强度HID值(1-100=档位,步进1;100→-200dB最强;关断由g_dnr_on控制,此处不再用0表示强度) +// 改动原因:用户要求与强度分离的开关量;关时仍保留g_dnr_strength供0x86读取与再次开启时恢复 +unsigned g_dnr_on = 1; // AI降噪总开关(0=关仅停算法,1=开且用g_dnr_strength档位) unsigned g_last_dnr_strength = 0xFF; // 上次已上报的降噪强度,0xFF表示首次未上报(触发开机上报) unsigned g_last_game_mode = 0xFF; // 上次已上报的音效模式,0xFF表示首次未上报(触发开机上报) unsigned g_request_dnr_strength_set = 0; // HID 0x85 SET_AI_NOISE_STRENGTH待处理标志 @@ -508,6 +510,8 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol, unsigned char hp_mute_path[] = "hp_mute"; unsigned char monitor_sw_path[] = "monitor_sw"; unsigned char dnr_strength_path[] = "dnr_strength"; + // 改动原因:断电记忆AI降噪开关与强度分离存储(旧固件仅用dnr_strength=0表示关,启动时迁移) + unsigned char dnr_on_path[] = "dnr_on"; unsigned host_os = OS_OTHERS; #if DNR_ENABLE unsigned dnr_init_flag = 0; @@ -711,28 +715,45 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol, { unsigned char saved_dnr = load_value(dnr_strength_path); + unsigned char saved_on = load_value(dnr_on_path); + // 改动原因:强度文件只存2–100偶数档位;开关存dnr_on;兼容旧数据saved_dnr==0表示关且未单独存开关 if (saved_dnr == 255) { g_dnr_strength = 100; dnr_strength_saved = 100; + g_dnr_on = 1; flag_aidenoise_onoff = 1; save_value(dnr_strength_path, (unsigned char)100); - } else if (saved_dnr == 0 || (saved_dnr <= 100 && (saved_dnr % 2) == 0)) { + if (saved_on == 255) + save_value(dnr_on_path, (unsigned char)1); + } else if (saved_dnr == 0) { + g_dnr_strength = 100; + dnr_strength_saved = 100; + g_dnr_on = 0; + flag_aidenoise_onoff = 0; + save_value(dnr_strength_path, (unsigned char)100); + save_value(dnr_on_path, (unsigned char)0); + } else if (saved_dnr <= 100) { g_dnr_strength = saved_dnr; - if (saved_dnr == 0) { - dnr_strength_saved = 100; + dnr_strength_saved = saved_dnr; + if (saved_on == 0) { + g_dnr_on = 0; flag_aidenoise_onoff = 0; } else { - dnr_strength_saved = saved_dnr; + g_dnr_on = 1; flag_aidenoise_onoff = 1; + if (saved_on == 255) + save_value(dnr_on_path, (unsigned char)1); } } else { g_dnr_strength = 100; dnr_strength_saved = 100; + g_dnr_on = 1; flag_aidenoise_onoff = 1; save_value(dnr_strength_path, (unsigned char)100); + save_value(dnr_on_path, (unsigned char)1); } - debug_printf("Loaded dnr_strength from flash: current=%d saved=%d onoff=%d\n", - g_dnr_strength, dnr_strength_saved, flag_aidenoise_onoff); + debug_printf("Loaded dnr from flash: strength=%d saved=%d on=%d key_onoff=%d\n", + g_dnr_strength, dnr_strength_saved, g_dnr_on, flag_aidenoise_onoff); } // 从Flash恢复mic_mute状态(默认关闭=未静音) @@ -886,9 +907,9 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol, cc_mic_level <: (unsigned)g_monitor_switch; debug_printf("Init monitor sync: sw=%d\n", g_monitor_switch); - // 出厂默认:AI降噪开启,初始化LED和算法 + // 出厂默认:AI降噪由g_dnr_on决定,关时强度变量仍保留供再次开启 #if DNR_ENABLE == 1 - if (flag_aidenoise_onoff) { + if (g_dnr_on) { led_on(&led_ctx, LED_ANC); led_update_all(&led_ctx); dnr_set_mode(1); @@ -1652,21 +1673,33 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol, } push_button_aidenoise_onoff_state_old = button_aidenoise_onoff; #if DNR_ENABLE == 1 - if(mode_change) + if(mode_change) { if(flag_aidenoise_onoff) { + // 改动原因:开时应用当前保存的档位g_dnr_strength,不把强度全局量写成0 + unsigned gs_on; + GET_SHARED_GLOBAL(gs_on, g_dnr_strength); led_on(&led_ctx, LED_ANC); - dnr_set_strength_level((unsigned char)dnr_strength_saved); - SET_SHARED_GLOBAL(g_dnr_strength, dnr_strength_saved); + dnr_set_strength_level((unsigned char)gs_on); + SET_SHARED_GLOBAL(g_dnr_on, 1); + dnr_strength_saved = gs_on; } else { + // 改动原因:关时只清开关与算法档位,保留g_dnr_strength供HID 0x86与再次开启 led_off(&led_ctx, LED_ANC); dnr_set_strength_level(0); - SET_SHARED_GLOBAL(g_dnr_strength, 0); + SET_SHARED_GLOBAL(g_dnr_on, 0); } - - //led_update_all(&led_ctx); + save_value(dnr_on_path, (unsigned char)flag_aidenoise_onoff); + { + unsigned gs_sv; + GET_SHARED_GLOBAL(gs_sv, g_dnr_strength); + save_value(dnr_strength_path, (unsigned char)gs_sv); + } + g_dnr_on = flag_aidenoise_onoff; + led_update_all(&led_ctx); + } #endif // 检查HID 0x84 FACTORY_RESET请求 @@ -2084,27 +2117,34 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol, } // 处理HID SET_AI_NOISE_STRENGTH (0x85) 请求 + // 改动原因:0x85的0仅关开关与灯并停算法,g_dnr_strength由eq.c保持原档位;非0更新强度并打开 { unsigned dnr_req; GET_SHARED_GLOBAL(dnr_req, g_request_dnr_strength_set); if (dnr_req) { SET_SHARED_GLOBAL(g_request_dnr_strength_set, 0); unsigned new_strength; + unsigned dnr_on_sw; GET_SHARED_GLOBAL(new_strength, g_dnr_strength); + GET_SHARED_GLOBAL(dnr_on_sw, g_dnr_on); #if DNR_ENABLE == 1 - dnr_set_strength_level((unsigned char)new_strength); -#endif - if (new_strength == 0) { - flag_aidenoise_onoff = 0; - led_off(&led_ctx, LED_ANC); - } else { + if (dnr_on_sw) { + dnr_set_strength_level((unsigned char)new_strength); flag_aidenoise_onoff = 1; dnr_strength_saved = new_strength; led_on(&led_ctx, LED_ANC); + } else { + dnr_set_strength_level(0); + flag_aidenoise_onoff = 0; + led_off(&led_ctx, LED_ANC); } +#endif + save_value(dnr_on_path, (unsigned char)dnr_on_sw); save_value(dnr_strength_path, (unsigned char)new_strength); + g_dnr_on = dnr_on_sw; led_update_all(&led_ctx); - debug_printf("HID SET_AI_NOISE_STRENGTH: strength=%d, saved to flash\n", new_strength); + debug_printf("HID SET_AI_NOISE_STRENGTH: strength=%d on=%d flash saved\n", + new_strength, dnr_on_sw); } } @@ -2156,10 +2196,16 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol, } // HID AI降噪强度变化主动上报(含首次开机上报:g_last_dnr_strength初始为0xFF) + // 改动原因:按键关闭AI降噪时,协议要求上报0;开启时上报当前g_dnr_strength #if DNR_ENABLE == 1 { unsigned current_dnr_strength; + unsigned current_dnr_on; + GET_SHARED_GLOBAL(current_dnr_on, g_dnr_on); GET_SHARED_GLOBAL(current_dnr_strength, g_dnr_strength); + if (!current_dnr_on) { + current_dnr_strength = 0; + } #if HID_DFU_EN if (!g_in_fw_upgrade) #endif diff --git a/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/eq.c b/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/eq.c index e02ff8f..b54eb2e 100644 --- a/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/eq.c +++ b/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/eq.c @@ -656,15 +656,22 @@ unsigned char process_send_params(uint8_t data[], uint16_t len) { } // 处理设置AI降噪强度命令 (0x85) - SET_AI_NOISE_STRENGTH - // 有效值: 0(关闭), 2,4,...,100(步进2); 强度映射: strength*2 → dB (100→-200dB) + // 有效值: 0(仅关开关与算法,不修改强度档位), 2,4,...,100(步进2并打开); 强度映射: strength*2 → dB (100→-200dB) if (data[1] == 0x85) { uint8_t strength = data[2]; if (strength > 100 || (strength != 0 && strength % 2 != 0)) { return false; } extern unsigned g_dnr_strength; + extern unsigned g_dnr_on; extern unsigned g_request_dnr_strength_set; - g_dnr_strength = strength; + // 改动原因:用户要求0x85为0时只关g_dnr_on与灯、停算法,g_dnr_strength保留原值供断电记忆与0x86读取 + if (strength == 0) { + g_dnr_on = 0; + } else { + g_dnr_strength = strength; + g_dnr_on = 1; + } g_request_dnr_strength_set = 1; read_request.pending_cmd = 0x86; // 设置后用0x86格式回报当前强度 return true; @@ -1133,7 +1140,12 @@ unsigned char process_read_params(uint8_t response[]) { RSP_HDR(response, 0x86); extern unsigned g_dnr_strength; - response[2] = (uint8_t)g_dnr_strength; + extern unsigned g_dnr_on; + if (g_dnr_on) { + response[2] = (uint8_t)g_dnr_strength; + } else { + response[2] = 0; + } read_request.pending_cmd = 0; return true;