volume savings

This commit is contained in:
Steven Dan
2026-05-12 11:46:09 +08:00
parent bf6d7e635e
commit 88454f11ce

View File

@@ -111,6 +111,21 @@ timer tm;
#define C1_MODE_VALUE_MIN 0
#define C1_MODE_VALUE_MAX 1
// 改动原因DAC 音量单独持久化路径,与 mode 的 c1_mode 文件分离,避免互相覆盖且便于维护。
#define C1_DAC_VOL_INFO_PATH "c1_dac_vol"
// 改动原因:与 FORMAT_DELAY(30000000) 相同时间基准get_reference_time 滴答),用户停止调节 300ms 后再写 Flash减少磨损并满足需求。
#define C1_DAC_VOL_SAVE_DELAY (30000000)
// 改动原因:判断 Flash 读出字节是否为合法 NAU88C22 DAC 音量码0x00 表示按键规则下的 mute0x4B~0xCF 为正常衰减范围。
static unsigned c1_saved_dac_vol_is_valid(unsigned char v)
{
if (v == C1_DAC_MUTE)
return 1;
if (v >= C1_DAC_VOL_MIN && v <= C1_DAC_VOL_MAX)
return 1;
return 0;
}
// 改动原因mode值与面板LED颜色索引不是同一编码封装转换避免业务代码散落魔数映射关系。
static inline unsigned c1_mode_to_led_color_idx(unsigned mode_value)
{
@@ -373,6 +388,9 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
unsigned old_dac_vol = 0;
unsigned old_adc_vol = 0;
unsigned old_dac_mode = 0;
// 改动原因:记录上次用于防抖持久化的 g_dac_voldeadline=0 表示当前无待写入 Flash 的定时保存任务。
unsigned dac_vol_persist_snapshot = 0;
unsigned dac_vol_persist_deadline = 0;
// 改动原因按DS1按键状态机思路保存每个按键按下时长mode/mic 仍用短/长按窗口区分,音量键仅用于释放时短按去抖(不支持长按连调)。
unsigned mode_press_ticks = 0;
unsigned vol_down_press_ticks = 0;
@@ -400,6 +418,21 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
save_value(C1_MODE_INFO_PATH, c1_mode);
}
// 改动原因:开机从 LittleFS 恢复 DAC 音量寄存器码;无效或未写过时用最大音量 C1_DAC_VOL_MAX避免误用默认值或垃圾数据。
{
unsigned char loaded_dac_vol = load_value(C1_DAC_VOL_INFO_PATH);
unsigned init_dac_vol;
if (c1_saved_dac_vol_is_valid(loaded_dac_vol) == 0)
init_dac_vol = C1_DAC_VOL_MAX;
else
init_dac_vol = loaded_dac_vol;
SET_SHARED_GLOBAL(g_dac_vol, init_dac_vol);
// 改动原因:强制首轮定时器路径执行 NAU88C22 写音量(含 mute=0 时 old_dac_vol 初值也为 0 的情况)。
old_dac_vol = ~init_dac_vol;
dac_vol_persist_snapshot = init_dac_vol;
dac_vol_persist_deadline = 0;
}
// 改动原因开机后立即按Flash恢复的mode值设置面板灯色避免首次按键前灯态与保存状态不一致。
i_c1_led_ctrl.set_mode_led_color(c1_mode_to_led_color_idx(c1_mode));
@@ -511,6 +544,20 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
debug_printf("set old_dac_vol %d audio_type %d \n", old_dac_vol, audio_type);
}
// 改动原因:音量键/HID/UART 任一修改 g_dac_vol 后不立即写 Flash仅当读回值相对 persist_snapshot 稳定满 300ms 再 save_value满足防抖与关机保存。
{
if (dac_vol != dac_vol_persist_snapshot)
{
dac_vol_persist_snapshot = dac_vol;
dac_vol_persist_deadline = now + C1_DAC_VOL_SAVE_DELAY;
}
else if (dac_vol_persist_deadline != 0 && timeafter(now, dac_vol_persist_deadline))
{
save_value(C1_DAC_VOL_INFO_PATH, (unsigned char)(dac_vol & 0xff));
dac_vol_persist_deadline = 0;
}
}
if (old_adc_vol != effective_adc_vol)
{
if ((effective_adc_vol <= 0xff) && (effective_adc_vol >= 0))