这篇写什么?
FlexConnect Soundbar 在做 Level Matching(Acoustic_tests_09 / 535) 时,会临时推一套只含部分喇叭角色的 dconf / sconf(例如 MS12_canonical_C_Ls_Rs),再播中置(C)片源,检查本机与无线音箱的声级是否按预期。
正常听感逻辑:
播 C 片源时,能量会 spread 到左右;中置 C 的声级应高于 L / R。
某次构建里出现了相反现象:L 反而大于 C。对比旧构建正常;把旧 audio 库换回新软件也能恢复。最终定位到:MS12 在这类 conf 下只出了 7 声道,HAL 仍按「声道数选 CTA 表 + 下游按原声道数读」处理,导致中置槽错位。
相关背景见 MS12 声道与物理 I2S 匹配。
0. 一句话流程
1. 期望:FlexConnect 按 8 路布局走 CTA remap,FC 落在正确物理槽;
2. 现象:Level Matching 535 播 C 片源时,L 声级大于 C;
3. 根因:错误/临时 dconf 只出 7ch → 误用无 FC 的 CTA;下游仍按 7 读已是 8 的缓冲;
4. 修复:不足 alsa_ch 时先补 0 成 8 → 走原 8ch CTA;把处理后的真实声道数传给 TVSDX。
1. 测试在测什么?
典型步骤(示意):
adb push MS12_canonical_C_Ls_Rs.dconf /data/vendor/dolby/flext.dconf
adb push MS12_canonical_C_Ls_Rs.sconf /data/vendor/dolby/flext.sconf
adb shell
su
param_set 0 "ms12_runtime=-sconf /data/vendor/dolby/flext.sconf -dconf /data/vendor/dolby/flext.dconf"
然后播 Level Matching 指定的中置片源,用声学设备比 C 与 L/R 的相对电平。
这和日常完整 Atmos 播放不同:它故意用 只强调 C / Ls / Rs 角色 的 conf,去验证声道与电平跟踪是否正确。conf 名字里的「canonical」不代表一定输出满 8 路 PCM。
2. 正常时 8ch 应该怎么排?
FlexConnect 正常期望 MS12 按逻辑序输出 8 路,再由 HAL 做 CTA remap 写到物理 ALSA 槽。典型对应关系如下:
| 逻辑下标 | 逻辑 CTA | 物理槽 | 物理 CTA | 角色 |
|---|---|---|---|---|
| 0 | FL | 2 | FL | 本机 L |
| 1 | FC | 1 | FC | 本机 C |
| 2 | FR | 3 | FR | 本机 R |
| 3 | LS | 4 | LS | 本机 LS |
| 4 | RS | 5 | RS | 本机 RS |
| 5 | TpFR | 7 | TpFR | 无线音箱 R |
| 6 | TpFL | 6 | TpFL | 无线音箱 L |
| 7 | LFE | 0 | LFE | 无线低音炮 |
关键点:FC 必须落到物理槽 1。一旦 remap 表按「没有中置」的布局选错,中置能量会落到 L 等其它槽,Level Matching 就会判失败。
3. 为什么 7ch dconf 会踩坑?
问题 A:按 7ch 选 CTA 表
CTA remap 常按 当前声道数 选源布局。
8ch 走带 FC 的 5.1.2 表;7ch 会落到另一张没有中置(FC)的表。
于是:
- MS12 实际内容里本该是「中置」的那一路,被当成别的角色搬走;
- 物理槽上的 C 不再是真正的中置能量;
- 听感 / 声学上就变成 L 大于 C。
问题 B:下游仍按「原始 7」去读
即便前面有人把缓冲补成了 8 路,如果仍把 MS12 上报的原始 output_ch(7) 传给 TVSDX / SEI 喇叭链:
buffer 已是 8ch 交织
TVSDX / 下游仍按 7ch 步进读
→ 样本边界错开 → 中置等声道再次错位
两条问题叠在一起,现象会非常像「声道表坏了」,但根因是 声道数前后不一致。
对比验证也支持这一点:旧构建(声道处理路径正确)正常;新构建异常;在新软件上换回旧 audio 库即可恢复——问题落在 HAL 对「不足 8ch」的处理,而不是片源或麦克风。
4. 修复:只做两件事
4.1 不足 alsa_ch 时先补 0,再走原 8ch CTA
在写喇叭前的多声道处理里:
若 nchannels < alsa_ch(例如 7 < 8):
前 N 路原样拷贝
缺的路填静音 0
nchannels = alsa_ch(8)
再 check_update_remap_info + channel_remap_process
效果:
| 情况 | 行为 |
|---|---|
| 错误/临时 7ch dconf | 先凑成 8,再走 和正常 8ch 同一套 CTA |
| 本来就是 8ch | 跳过补 0,行为不变 |
不再「发现是 7 就选 7ch 无 FC 表」。
4.2 告诉下游「现在缓冲是几路」
把传给 sei_audio_speaker_output 的声道数,从「MS12 原始 output_ch」改成 处理后 buffer 的真实声道数(补齐后为 8):
route_ch = 处理后 channel_mask 对应的声道数
若无效 → 再回退到 ms12_info->output_ch
sei_audio_speaker_output(..., route_ch)
这样 TVSDX / SEI 链按 8 路读 8 路数据,不会把中置拆到邻道。
5. 和系列其它文章的关系
| 文章 | 侧重 |
|---|---|
| MS12 声道 remap | 正常 8ch 逻辑序 ↔ 物理槽 |
| MS12 解码后 HAL 分流 | DAP / SEI / Master 谁写喇叭 |
| Speaker Sync 与本机补偿 | 时间对齐,不是声道表 |
| FlexConnect 全流程 | 打包到校准 / Tuning 总览 |
| 本篇 | 不足 8ch 的 dconf / Level Matching 声道错位 |
remap 篇讲「8 路怎么排」;本篇讲「突然只来 7 路时,为什么不能另选一张表」。
6. 排查清单
| 现象 | 优先想 |
|---|---|
| 播 C 片源但 L 更大 | 当前 dconf 实际输出几路?是否误用无 FC 的 CTA |
| 只有临时 conf 失败、完整 Atmos 正常 | 是否踩了「按声道数选表」的分支 |
| remap 看起来对、下游仍乱 | 传给 TVSDX / SEI 的声道数是否仍是 MS12 原始值 |
| 换旧 audio 库即好 | 优先 diff 多声道 remap 与 speaker 路由声道参数 |
日志 / 参数可关注:ms12_runtime 的 -sconf / -dconf、实际 output_ch、以及 remap 前后的声道数是否一致。
基于 Amlogic Soundbar HAL + Dolby MS12 FlexConnect Level Matching 535 排查实践整理。
评论
还没有评论,来做第一个吧
赞同、吐槽、提问都行,评论区开放