KunSpace
返回博客

HDMI / Tuner Pop 音:格式误判与淡入淡出两招

2026年7月3日
尚无阅读

读完了?别空手走啊 😏

这行字出现时,你的大拇指应该已经 itch 了

写评论

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

这篇写什么?

双屏电视上两类很常见的 pop / click(爆破音)

  1. HDMI1 接 Apple TV,在 UI 里 移动焦点 时「啪」一下
  2. 打开 / 关闭 Tuner(或 Live / DVB 进出台)瞬间再「啪」一下

本质都是:某一瞬间,送到后续处理链或硬件的数据 电平突变,或把 不该当 PCM 播的数据当 PCM 播了
本文把两轮修复串起来讲:先治「错格式误播」,再治「通路切换硬切」。

一句话:

Pop ≈ 无效/错格式数据进喇叭  或  电平从有→无 / 无→有硬切
  → 修法 A:PCM ↔ Non-PCM 检测 + 必要时清缓冲 / 关 HW resample
  → 修法 B:进出台 TV 通道做 fade-in / fade-out(ease)

Pop 音两类成因与对应修法

相关:TV HDMI-IN Patch 流程MS12 DRC 电平


一、什么是 Pop 音?(听感背后)

常见诱因 听感 典型场景
BitstreamPCM 噪声、爆裂 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 时可以自问:

  1. 是不是 格式 / Non-PCM 标志 在跳?→ 先看第一轮逻辑是否覆盖
  2. 是不是 通路开关、mute、切 Live?→ 看有没有 ease、时长是否太短
  3. 用标准片 + 固定音量反复切,区分「必现」还是「概率」——概率型优先加长 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,不是单一补丁能「永远杀光」的,而是两类机制叠在一起:

  1. 别把 Non-PCM / 脏块当 PCM 播——检测、关错误重采样、不一致就清零
  2. 别在进出台时硬切电平——ease-in / ease-out + 必要时 MS12 系统静音

先堵错数据,再抹平真切换,UI 焦点和 Tuner 开关都会干净很多。


相关阅读

评论

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

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