问题描述
我正在尝试让音频在我的 Linux 安装中正常工作。然而,每次音频信号变为零时,即使只有大约半秒,当它恢复时,我都会听到扬声器发出咔哒/爆裂声。当在没有持续背景噪音的情况下收听音源时,这一点最为明显,其中每次角色开始或停止说话以及任何时候暂停或重新开始音乐播放时都会发生喀哒声。虽然典型的现代电影从来都不是完全无声的,但某些类型的内容,例如脱口秀或一键通语音通信软件,却完全被毁了。
系统硬件和软件设置
我构建了一台配备 Intel i5 处理器的媒体 PC。主板是华硕 Prime B560M-A,显示屏是 LG CX 系列 OLED。我正在使用 Debian 测试 (Bullseye) 和 Pulseaudio,它是 Debian 的默认设置。
声音通过 HDMI1 向外发送,电视通过其音频回传通道 (ARC) 将其转发到 Harman Kadron AVR (171S)。 Pulseaudio 输出模式为“HDMI1 数字立体声”,启用了多种直通音频格式。
问题隔离和推测原因
Debian 中的音频系统省电(或其他)功能似乎在检测到完全静音时立即关闭音频信号。这会导致 AVR 关闭其音频输出,从而产生喀哒声。当声音恢复时,同样的情况也会发生。
我可以通过观察 AVR 中的音频格式指示器来确认这一点。当我从放大器切换到信号源时,它会显示正在接收的格式。如果有信号,AVR 将显示“2/0/0 48kHz ARC”(对于常规 PCM)或类似 3/2/1 48kHz ARC(对于 DTS)的信息。在Debian中,当我在音量为零时随时切换到ARC输入时,接收器会显示“--- ARC”,这表明根本没有信号。看起来信号确实在达到零时立即被终止。
我怎么知道这是 Linux/Debian 问题
此时仍然有多种选择。如果仅接收到零,则可能是 AVR 本身正在关闭;如果仅接收到零,则也可能是电视停止发送任何信号。然而,电视处于最简单的直通模式,我可以通过 Playstation 4 控制台测试相同的设置,将问题隔离到 Debian。
在完全相同的情况下,当 PS4 完全没有声音时,AVR 仍然报告“2/0/0 ARC”。当音频播放停止或继续时,没有任何裂纹和爆音。也就是说,对于 PS4,音频信号永远不会完全中断。
我尝试了什么?
我在这个网站和整个互联网上搜索了有类似问题的人,并找到了以下建议。
该值已设置为 0:
/sys/module/snd_hda_intel/parameters/power_save
这已设置为 N:
/sys/module/snd_hda_intel/parameters/power_save_controller
这些更改已永久生效:
root@mycomputername|/etc/modprobe.d:cat audio_disable_powersave.conf
options snd-hda-intel power_save=0 power_save_controller=N
我已在某些位置关闭了pulseaudio中的静音空闲接收器
/etc/pulse/default.pa
/etc/pulse/system.pa
通过注释掉该行:
### Automatically suspend sinks/sources that become idle for too long
#load-module module-suspend-on-idle
此更改后 Pulseaudio 已重新启动。
我还通过将其设置为 Y 在 hdmi 输出模块中启用静默流:
/sys/module/snd_hda_codec_hdmi/parameters/enable_silent_stream
它以与上述模块设置相同的方式永久化。
此外,我已经禁用了 Alsamixer 的“自动静音模式”,但这应该不会产生任何影响,因为我认为它与耳机插孔有关。
一些消息来源还建议通过 aplay 发送一串零来保持信号有效。我通过使用以下方法完成了此操作:
aplay /dev/zero -f S16_LE
上述这些都没有产生任何效果。按暂停始终会产生立即点击声,输出中的任何静音始终会产生立即点击声。此后检查 AVR 信号模式总是显示它根本没有接收到任何信号。
我完全束手无策,想不出还有什么可以尝试的,并且非常感谢任何真正解决了这个问题的人的帮助。
答案1
最后,我没有找到满意的答案,而且对于我的情况似乎没有好的解决方案,可能是因为AVR中的自动化。目前尚不清楚为什么 PS4 能够保持信号有效,但至少以下功能具有相同的效果:
/usr/bin/play -qn synth sin 10 gain -191
它低于我的扬声器的灵敏度及其较低的截止频率。如果此功能处于活动状态,我可以暂停音乐而不会听到流行声。
(编辑):没有人提供更好的解决方案,因此,我接受这个答案。此外,为了使答案更普遍有用,值得注意的是,如果您的信号输出数据格式是 16 位而不是 32 位,请使用:
/usr/bin/play -qn synth sin 10 gain -95