这篇写什么?
做 FlexConnect Soundbar 时,有一个比「Dolby 怎么渲染」更落地的问题:
MS12 吐出来的 8 声道,怎么和 Soundbar + 无线音箱 + 低音炮的物理 I2S 槽对得上?
文中「卫星」就是 无线音箱(高度声道)。
这篇用流程图讲清原理:谁负责分内容、谁负责对物理接线、为什么要 bypass TVSDX。
建议阅读顺序:图 1 总览 → 图 4 初始化 → 图 2 播放调用 → 图 3 remap → 图 5 bypass → 图 6 设备角色。
0. 一句话结论
MS12 FLAP 按「逻辑设备序」输出最终喇叭声道;
HAL 用 ALSA_Speaker_layout 做 CTA remap 成物理 I2S 槽;
flap_mode=1 时 bypass TVSDX,避免 TpFL / TpFR 被折进 LFE。
排查「高度声道没了」「低音炮和无线音箱串了」时,先核对这三句。
1. 总体数据流
| 阶段 | 做什么 | 关键配置 / 模块 |
|---|---|---|
| ① JSON 配置 | 声明 8ch、物理 layout、Real_Speaker | flexconnect JSON、device_role_map |
| ② HAL 初始化 | 解析 JSON、建 remap 表、设 FLAP 模式 | adev_open 一带 |
| ③ MS12 FLAP | 按逻辑拓扑输出 8ch PCM | -o_flap_speaker、逻辑 layout |
| ④ CTA remap | 逻辑序 → 物理 ALSA 槽搬样本 | channel_remap_process() |
| ⑤ ALSA 输出 | 写 spk_ch_0…7 → I2S |
ALSA write |
核心分工: MS12 负责「内容已经分到各喇叭角色」;HAL 只负责「物理接线顺序对齐」,不再做高度声道二次混音(前提是 flap_mode=1)。
2. 播放路径:在干什么?
MS12 通过 FLAP 输出回调进入 HAL;Soundbar 路由里做 remap,再写 ALSA。
调用链:
MS12 FLAP 输出
→ dap_pcm_output(DAP / FLAP 出口)
→ Soundbar / SEI 喇叭路由
→ 多声道处理 + CTA remap(8ch)
→ (可选)TVSDX bypass
→ 写 ALSA → I2S
8ch FlexConnect 时,关键是:逻辑序和物理槽不一致时,用 remap 表逐样本搬家。
2ch DSP 配置会走另一条简化路径;典型 FlexConnect 8ch 项目走「全通路 + remap」。
触发 remap 的条件示意:
if (flexconnect_tvsdx_bypass && nchannels == 8 && alsa_ch == 8) {
// 按 remap_table 把逻辑声道搬到物理 ALSA 槽
channel_remap_process(...);
}
3. 开机时一次建好 remap
FlexConnect 参数与 remap 表在 首次打开 HAL 时就绪;之后播放只走上面的热路径。
初始化要做的事:
- 装入 / 解析 flexconnect JSON(通道数、物理 layout、Real_Speaker)
- 解析
device_role_map(Controller / Sub / 无线音箱占哪些槽) - 建默认 remap,再按 JSON sink 布局覆盖
- 若 flexr 配置齐全且 Config W 生效 → FLAP 模式,并打开
-flap_mode 1
JSON 里大致会看到:
"ALSA_Speaker_Channels": 8,
"ALSA_Speaker_layout": "spk_ch_0=CTA_LFE1 ... spk_ch_7=CTA_TpFR",
"Real_Speaker_Layout": "510"
FLAP 打开的条件:
flexr stream + device 配置都在 + MS12 Config W
→ dap_init_mode = FLAP
→ MS12 按 FlexConnect 拓扑输出多声道
4. 声道 remap:逻辑序 → 物理 ALSA 槽
这是整篇的「心脏」。MS12 输出的 8 声道顺序和 PCB 上 I2S 槽顺序 往往不一致,靠 remap_table 对齐。
4.1 两套布局
| 类型 | 含义 |
|---|---|
| 源布局(逻辑) | MS12 / FLAP 吐出的 CTA 顺序 |
| sink 布局(物理) | JSON ALSA_Speaker_layout 声明的 I2S 槽顺序 |
典型逻辑序里 TpFR 在 TpFL 前面;物理槽 6/7 又常常是 TpFL / TpFR——这正是 remap 要解决的「序不对」。
4.2 典型 FlexConnect 5.1.2 映射
| 逻辑下标 | 逻辑 CTA | 物理 ALSA 槽 | 物理 CTA | 设备角色 |
|---|---|---|---|---|
| 0 | FL | 2 | FL | Controller L |
| 1 | FC | 1 | FC | Controller C |
| 2 | FR | 3 | FR | Controller R |
| 3 | LS | 4 | LS | Controller LS |
| 4 | RS | 5 | RS | Controller RS |
| 5 | TpFR | 7 | TpFR | 无线音箱 R |
| 6 | TpFL | 6 | TpFL | 无线音箱 L |
| 7 | LFE | 0 | LFE1 | 低音炮 |
channel_remap_process() 按表把源声道样本写到目标槽;表错一张就会「喇叭对调」。
5. flap_mode 与 TVSDX bypass
传统 Soundbar 没有独立高度无线音箱时,HAL 里的 TVSDX 会把高度信息虚拟化或折进 LFE。
FlexConnect 下 MS12 已经输出独立的 TpFL / TpFR,若再走 TVSDX,高度声道会被错误处理。
设计意图很直接:
MS12 flexible renderer 已经输出最终喇叭声道;
TVSDX 不能再处理一遍,否则 TpFL/TpFR 会被折进 LFE。
因此:flap_mode == 1 → 置 flexconnect_tvsdx_bypass → 跳过 TVSDX,直接走向物理输出(以及后续的本机延迟补偿,见 Speaker Sync / 20ms 补偿篇)。
无线高度「没声」或「进低音炮了」时:先查 flap_mode 是否为 1、bypass 是否打开,再查 remap 表。
6. device_role_map 与物理喇叭
JSON 把 FlexConnect 设备角色(Controller / Sub / 无线音箱)绑定到 ALSA 槽,供 remap、校准 App 和 dump 共用。
| 角色 | 含义 | 典型槽 |
|---|---|---|
| Controller | 本机 Soundbar | FL/FR/FC/LS/RS |
| Subwoofer | 无线低音炮 | LFE |
| Satellite_L / R | 无线音箱 左右高度 | TpFL / TpFR |
device_role_map 描述「哪个角色占哪些槽」;ALSA_Speaker_layout 描述「每个槽的 CTA 标签」。两者一起决定 remap,并与 MS12 FLAP 逻辑序对齐。
7. 怎么核对实现
-
按图 1 → 图 4 → 图 2 → 图 3 → 图 5 → 图 6 对照真机行为
-
dump:
dumpsys media.audio_flinger --hal | grep -A20 FlexConnect -
日志关键字:
set_speakers_each_channel_layout remap config changed FlexConnect: flap_mode dap_init_mode = 3 flexr stream config path
8. 和系列其它文章的关系
| 文章 | 侧重 |
|---|---|
| Dolby FlexConnect 概览 | 产品模块、渲染与无线 |
| 从硬件 RF 到校准 | Bridge、校准 App |
| FlexConnect SDK v1.1 | SDK API |
| MS12 解码后 HAL 分流 | DAP / SEI / Master / tv_tuning |
| Speaker Sync 与本机 20ms 补偿 | 测出偏差后再补偿 |
| 不足 8ch dconf 与 Level Matching | 7ch 误用无 FC 表 → 补 0 再 CTA |
| FlexConnect 全流程 | 打包→开机→播放→校准→Tuning |
| 本篇 | MS12 8ch ↔ HAL remap ↔ 物理 I2S |
校准层解决「音箱在哪」;本篇解决「PCM 写到哪一路 I2S」。
9. 常见问题速查
| 现象 | 优先查 |
|---|---|
| 无线高度无声 | flap_mode=1、TVSDX bypass、Tp 槽 remap |
| 高度进低音炮 | TVSDX 未 bypass |
| 左右无线音箱对调 | device_role_map 与 ALSA_Speaker_layout |
| 只有 Soundbar 有声 | Real_Speaker / flexr 配置是否加载 |
| dump 里 remap 全 0 | sink 布局是否真正应用到 remap 表 |
| 播 C 片源但 L 更大 | 是否不足 8ch dconf;见 Level Matching 篇 |
基于 Amlogic Soundbar HAL + Dolby MS12 FlexConnect 实践整理。
评论
还没有评论,来做第一个吧
读完了不评论,作者会以为你在沉思