KunSpace
返回博客

FlexConnect:MS12 输出声道与喇叭声道匹配原理

2026年7月24日
9 次阅读

读完了?别空手走啊 😏

读都读完了,不点个赞说不过去吧

写评论

读完了不评论,作者会以为你在沉思

这篇写什么?

做 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. 总体数据流

图1 MS12 FlexConnect 总体数据流:配置 → 初始化 → FLAP → remap → ALSA图1 MS12 FlexConnect 总体数据流:配置 → 初始化 → FLAP → remap → ALSA
阶段 做什么 关键配置 / 模块
① 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。

图2 播放路径函数调用链:MS12 回调 → SEI 路由 → remap → ALSA write图2 播放路径函数调用链:MS12 回调 → SEI 路由 → remap → ALSA write

调用链:

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 时就绪;之后播放只走上面的热路径。

图4 开机 adev_open 初始化时序图4 开机 adev_open 初始化时序

初始化要做的事:

  1. 装入 / 解析 flexconnect JSON(通道数、物理 layout、Real_Speaker)
  2. 解析 device_role_map(Controller / Sub / 无线音箱占哪些槽)
  3. 建默认 remap,再按 JSON sink 布局覆盖
  4. 若 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 对齐。

图3 逻辑声道序到物理 ALSA 槽的 remap 映射图3 逻辑声道序到物理 ALSA 槽的 remap 映射

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,高度声道会被错误处理。

图5 flap_mode 与 TVSDX bypass 决策图5 flap_mode 与 TVSDX bypass 决策

设计意图很直接:

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 共用。

图6 device_role_map 与物理喇叭角色图6 device_role_map 与物理喇叭角色
角色 含义 典型槽
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. 按图 1 → 图 4 → 图 2 → 图 3 → 图 5 → 图 6 对照真机行为

  2. dump:

    dumpsys media.audio_flinger --hal | grep -A20 FlexConnect
    
  3. 日志关键字:

    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_mapALSA_Speaker_layout
只有 Soundbar 有声 Real_Speaker / flexr 配置是否加载
dump 里 remap 全 0 sink 布局是否真正应用到 remap 表
播 C 片源但 L 更大 是否不足 8ch dconf;见 Level Matching 篇

基于 Amlogic Soundbar HAL + Dolby MS12 FlexConnect 实践整理。

评论

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

读完了不评论,作者会以为你在沉思