dnr strength update

This commit is contained in:
Steven Dan
2026-04-26 19:20:35 +08:00
parent 6ebf8c5fee
commit 6dc21313dc
2 changed files with 83 additions and 25 deletions

View File

@@ -86,7 +86,9 @@ unsigned g_last_volume_level = 0xFF; // 上次已上报的音量级别0xFF
unsigned g_mic_volume_level = 37; // 麦克风PGA增益级别0=mute, 1-37=0dB~36dBHID可见范围
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=,步进2100→-200dB最强
unsigned g_dnr_strength = 100; // AI降噪强度HID值1-100=档位,步进1100→-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);
// 改动原因强度文件只存2100偶数档位开关存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

View File

@@ -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;