test(audiod): r1 P2-1/P2-2 — 补 rapid-toggle 回归用例 + BT 音量语义文档(实现零改动)

评审 r1 的 `p2-2items`,两项都是「缺用例 / 缺一句文档」,不改任何已交付行为。

P2-1(连续拖滑块/ramp 中途反向缺回归):
- test_vol_gain 新增 G4b:块长 100(< 512 斜坡)× 60 次 100↔10 反向,实测 59 次落在
  斜坡中段;断言增益全程 ∈ [q15(10)=4, 32768] 且从不放大、块内逐样本只朝目标单调走、
  相邻样本跳变 ≤64 LSB(硬跳变 ~16380)、停手后 cur=4/left=0/bump_left=0。
- test_audiod_host 新增 T20(daemon 侧等价集成用例):经 IPC 连发 60 次 vol,
  每次只喂 100 帧(400B),断言 60 次全 ACK、underrun/dropped=0、
  落盘 PCM 无硬跳变(max_delta 1020 = 正弦自身斜率)、尾部 RMS 1.49 比头部
  6376.58 低 72dB(10% 真的生效)。

P2-2(文档):vol_gain.h 顶部新增「App/SDK 侧契约」段:BT 下 set_volume 同样生效
(走软件增益 + 持久化),AVRCP 钉 127 只为耳机功放满量程而非「音量交给耳机」,
pct 只在 [0,100] 有意义(<=0 真静音、>100 按满量程截断),16bit 写路径的
量化下限说明;vol_gain_dac_att_reg 注释补 pct>100 行为。build_audiod.sh
头部补 M55 说明(必须一起编 vol_gain.c、旧 SDK 说法已过期)。

验证:test_audiod_host 134/134 PASS、test_vol_gain 36/36 PASS、test_bt_dev PASS;
mipsel 交叉编译 0 warning,产物 md5 6cef4c54a1cb8e0c55f4ad5b6c4a323e(与 r1 完全一致,
证明二进制未变)。
This commit is contained in:
AskaEth committed 2026-11-12 08:07:37 +08:00
1 parent e37c622597
commit 2c0ec2ba15
4 files changed
+151 -3

No files matched your search

+14 -1
View File
@@ -13,6 +13,17 @@
*
* 全整数:增益表开机算一次(Q31 定点迭代乘法,不引 libm/软浮点),逐样本一次 32 位乘 +
* 移位 + 饱和;100% 走「单位增益直接返回」快路(逐字节不变、零开销),0% 走 memset。
*
* ---- App / SDK 侧契约(M55 定案;MEOW_APP_SDK.md 里「BT 输出目标时音量由 AVRCP 侧控」已过期)----
* - `meow_audio_set_volume(pct)` 在**两种输出目标下都生效**:DAC 目标写 CS43198 音量寄存器
* (numid=1/2 + DSD_VOLUME 双组),BT 目标写本模块的软件增益(写进 A2DP 的 PCM 样本)。
* 同一 pct 在两条路上是**同一条听感曲线**(vol_gain_dac_att_reg),不是「线性 vs 非线性」两套。
* - BT 下 AVRCP 被钉在 127(耳机功放满量程)——那是为了让耳机的模拟级不二次衰减,
* **不是**「音量交给耳机控」:用户的 vol 值由 audiod 的数字增益执行,`vol=0` 是真正的全 0 静音。
* - `pct` 只在 `[0,100]` 有意义:`<=0` 一律真静音,`>100` 一律按 100(满量程)处理。
* (`settings.conf` 里被手改成如 `audio.volume = 150` 时表现为满量程,不会超过 100% 的合法响度。)
* - 16bit 写路径的固有下限:约 <=-78dB 的档位(pct<=10)只剩 1 LSB 量级,听感上是静音;
* 实用区间约 60..100%(与 DAC 相同,因为曲线同源)。
*/
#ifndef MEOW_VOL_GAIN_H
#define MEOW_VOL_GAIN_H
@@ -26,7 +37,9 @@
/* 开机调用一次(幂等):生成 256 项增益表。之后查表全只读、无锁。 */
void vol_gain_init(void);
/* pct(0..100) → DAC 衰减寄存器 0..255。**dac_vol_set() 也调它**,保证两条路同一条锥度。 */
/* pct(0..100) → DAC 衰减寄存器 0..255。**dac_vol_set() 也调它**,保证两条路同一条锥度。
* pct<=0 → 255(真静音);pct>=100 → 0(0dB 满量程,**包括 pct>100**:越界按满量程截断,
* 不会给出 >100% 的响度)。 */
int vol_gain_dac_att_reg(int pct);
/* pct → 线性增益 Q15(32768=单位增益,0=真静音)。pct 越界自动 clamp。 */