KunSpace
返回博客

FlexConnect:不足 8ch 的 dconf 如何搞乱 Level Matching(535)

2026年9月11日
1 次阅读

读完了?别空手走啊 😏

白嫖可以,但点个赞显得有教养

写评论

赞同、吐槽、提问都行,评论区开放

这篇写什么?

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 槽。典型对应关系如下:

图1 正常 8ch:MS12 逻辑序 → 物理 ALSA 槽图1 正常 8ch:MS12 逻辑序 → 物理 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 会踩坑?

图2 不足 8ch 时的两条错位路径图2 不足 8ch 时的两条错位路径

问题 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. 修复:只做两件事

图3 修复:补齐到 8ch + 按处理后声道数下传图3 修复:补齐到 8ch + 按处理后声道数下传

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 排查实践整理。

评论

还没有评论,来做第一个吧

赞同、吐槽、提问都行,评论区开放