这篇写什么?
双屏电视上两类很常见的 pop / click(爆破音):
- HDMI1 接 Apple TV,在 UI 里 移动焦点 时「啪」一下
- 打开 / 关闭 Tuner(或 Live / DVB 进出台)瞬间再「啪」一下
本质都是:某一瞬间,送到后续处理链或硬件的数据 电平突变,或把 不该当 PCM 播的数据当 PCM 播了。
本文把两轮修复串起来讲:先治「错格式误播」,再治「通路切换硬切」。
一句话:
Pop ≈ 无效/错格式数据进喇叭 或 电平从有→无 / 无→有硬切
→ 修法 A:PCM ↔ Non-PCM 检测 + 必要时清缓冲 / 关 HW resample
→ 修法 B:进出台 TV 通道做 fade-in / fade-out(ease)

相关:TV HDMI-IN Patch 流程、MS12 DRC 电平。
一、什么是 Pop 音?(听感背后)
| 常见诱因 | 听感 | 典型场景 |
|---|---|---|
| 把 Bitstream 当 PCM 播 | 噪声、爆裂 | HDMI 源格式瞬时变化、UI 音效与主节目交错 |
| 缓冲里残留 上一帧脏数据 | 短促「啪」 | 切源、mute/unmute、关流 |
| 电平从满幅突然到 0(或反过来) | click | 开/关 Tuner、进出台 TV patch |
Apple TV 移焦点时,盒子侧经常会 短时改变音频形态(UI 音效、格式提示、Non-PCM 标志跳动),电视若跟不上,就容易踩中上表第一、二行。
二、第一轮:PCM / Non-PCM 误判(Apple TV 移焦点)
问题
HDMI1 接 Apple TV,移动焦点 时出现 pop。平台侧合入针对 HDMI-IN 数据类型检测与 patch 读环的修复后,复现概率明显下降。
思路
HDMI 上常见两类数据:
| 类型 | 含义 |
|---|---|
| PCM(线性 PCM) | 未压缩采样,可直接当 PCM 做重采样 / 混音 |
| Non-PCM(Bitstream) | AC-3 / DTS / TrueHD 等压缩流,需解码后再出声 |
危险组合:
盒子实际在推 Non-PCM(或正在切换)
→ 电视仍按 PCM 路径吃数据
→ 压缩码字被当成采样点
→ 喇叭里就是噪声 / pop
改动要点(示意)
1)识别数据类型,并在 PCM → Non-PCM 切换时关掉 HW resample
int cur_data_type = aml_mixer_ctrl_get_int(
&adev->alsa_mixer, AML_MIXER_ID_HDMIIN_NONAUDIO);
if (cur_data_type == DATA_NON_PCM && pre_data_type == DATA_PCM) {
enable_HW_resample(&adev->alsa_mixer, HW_RESAMPLE_DISABLE);
is_data_changed = true;
}
- 用 mixer 控件(如
HDMIIN NONAUDIO)读当前是否 Non-PCM - 格式跳变时先停硬件重采样,避免错误路径继续「当真 PCM」处理
2)统一宏
#define DATA_PCM (0)
#define DATA_NON_PCM (1)
3)在 audio_patch_input_threadloop 里:Non-PCM 状态下若解析结果却是线性 PCM,则清输入缓冲
if (IS_DIGITAL_IN_HW(patch->input_src)) {
cur_aformat = audio_parse_get_audio_type(patch->audio_parse_para);
if (in->data_type == DATA_NON_PCM) {
if (audio_is_linear_pcm(cur_aformat))
memset(patch->in_buf, 0, bytes_avail);
}
}
含义:
- 声明 / 检测侧认为当前是 Non-PCM
- 解析侧却给出 linear PCM(状态不一致、瞬态脏数据)
- 不要把这块缓冲送进后续链,先
memset成静音,堵住 pop
4)mixer 增加 AML_MIXER_ID_HDMIIN_NONAUDIO
给 HAL 一条可读的「HDMI-IN 是否 Non-Audio / Non-PCM」通道。
第一轮小结
| 手段 | 作用 |
|---|---|
| PCM↔Non-PCM 检测 | 知道现在能不能当 PCM 播 |
| 切换时关 HW resample | 避免错误重采样放大噪声 |
不一致时清 in_buf |
不把无效块送进解码 / 混音 |
这轮针对的是:错格式 / 脏块进处理链。Apple TV 移焦点场景验证通过后,pop 概率明显降低。
三、第二轮:进出台做淡入淡出(Home UI + 关 Tuner)
问题
第一轮之后,仍可能在:
- Apple TV Home UI 相关操作
- 打开 / 关闭 Tuner 瞬间
听到 pop。根因更多是 通路电平硬切,而不只是 Non-PCM 误判。
思路
进 TV 通道、退 TV 通道时,写给硬件的数据做 渐入(fade-in / ease-in) 和 渐出(fade-out / ease-out),让能量变化变「斜坡」,而不是方波。
硬切: ████████|........ → 易 click
淡出: █████▇▅▃▂▁........ → 缓下来
淡入: ........▁▂▃▅▇█████ → 缓上去
改动要点(示意)
1)封装 tv_do_ease_in / tv_do_ease_out
在写 ALSA / 停流前后,按需做淡入淡出,而不是裸写满幅或突然停。
2)条件更准:信号不稳时才 ease
例如结合:
patch/adev->patch_src(是否 TV / Live 通路)!patch->input_signal_stable(输入尚未稳定)- 是否走 MS12(
eDolbyMS12Lib等)——不同库兼容不同处理
避免「已经稳定的正常播放」也被无意义 fade 拖泥带水。
3)时长与模式可配
通过属性读取,例如:
duration_ms:淡入 / 淡出多久fade_mode:在哪一层做
常见两类:
| 模式 | 含义 |
|---|---|
DO_FADE_AT_HAL |
在 HAL 写缓冲前做增益斜坡 |
DO_FADE_AT_ALSA |
更靠近 ALSA / 硬件侧做 |
按芯片与通路选择,避免和 MS12 内部音量再叠成「双重奇怪斜坡」。
4)配合 set_ms12_sys_audio_mute 一类系统静音
在切换窗口用 MS12 系统静音 / 解静音,与 ease 配合,进一步压突变。
第二轮小结
| 手段 | 作用 |
|---|---|
| ease-in / ease-out | 进出台、开关 Tuner 时电平平滑 |
input_signal_stable |
只在不稳瞬态动手 |
| 可配时长 / 模式 | 现场可调,不必改代码硬编码 |
| MS12 sys mute | 与淡入淡出互补 |
验证侧:Apple TV Home UI pop 可解;关 Tuner 的 pop 概率下降(瞬态类问题往往只能「压概率」,很难宣称绝对为零)。
四、两轮怎么配合?一张表
| 维度 | 第一轮(格式) | 第二轮(切换) |
|---|---|---|
| 主战场 | HDMI-IN patch 读环、数据类型 | 进 / 出 TV 通道写硬件 |
| 典型复现 | Apple TV 移焦点 | Home UI、开关 Tuner |
| 核心动作 | 检测 Non-PCM、关 HW resample、清缓冲 | fade-in / fade-out + 可选 sys mute |
| 防的是 | 错数据被当真 PCM 播 | 真数据电平硬切 |
排查新 pop 时可以自问:
- 是不是 格式 / Non-PCM 标志 在跳?→ 先看第一轮逻辑是否覆盖
- 是不是 通路开关、mute、切 Live?→ 看有没有 ease、时长是否太短
- 用标准片 + 固定音量反复切,区分「必现」还是「概率」——概率型优先加长 fade、收紧稳定判断
五、实战检查清单
- HDMI 源(如 Apple TV)移焦点 / Home UI 是否仍 pop
- 开 / 关 Tuner、Live ↔ 其它应用是否仍 pop
- log 里 PCM↔Non-PCM 切换是否伴随
HW_RESAMPLE_DISABLE/ 清缓冲 - 进出台是否走进
tv_do_ease_in/tv_do_ease_out - fade 时长过短(几 ms)时,听感上仍可能像硬切——可适当加长再比
- 勿与「音量键突变」「ARC 拔插音量」混淆(见相关文)
六、小结
Apple TV / Tuner 的 pop,不是单一补丁能「永远杀光」的,而是两类机制叠在一起:
- 别把 Non-PCM / 脏块当 PCM 播——检测、关错误重采样、不一致就清零
- 别在进出台时硬切电平——ease-in / ease-out + 必要时 MS12 系统静音
先堵错数据,再抹平真切换,UI 焦点和 Tuner 开关都会干净很多。
相关阅读
评论
还没有评论,来做第一个吧
读完了不评论,作者会以为你在沉思