音频(mpd)直接传输到 ALSA,无需 pulseaudio(旧 Mac 笔记本电脑上的 Debian 8)

音频(mpd)直接传输到 ALSA,无需 pulseaudio(旧 Mac 笔记本电脑上的 Debian 8)

我在一台旧 Mac 笔记本电脑 (PowerBook G4) 上安装了 Debian 8.6,作为客厅音乐播放器。这台机器放在架子上,只做一件事:使用 mpd 播放音乐。所以我想让它做这件事出色地。 ;-)

(这台笔记本电脑是 2005 年的:它有 1.5 GHz G4 处理器和 768 MB RAM。播放音乐的马力十足,但其他功能就不多了!)

而且它大部分时间都运行正常……除了每小时几次,音乐会断断续续地播放大约半秒钟。我强烈怀疑提供音频数据的进程 (mpd) 无法保持其输出缓冲区满,因此某些东西(ALSA?硬件?)会在一个紧密的循环中播放那一小段音频,直到 mpd 重新开始提供音频。

我进一步怀疑问题在于 CPU 不足:有什么东西阻止了 mpd 在很短的时间内运行。我的证据来自在音频播放期间“在顶部”运行,以每秒捕获一次系统状态快照。当我查看这些快照时,我没有看到内存使用或 I/O 出现任何峰值,但我确实看到 CPU 使用率出现峰值:pulseaudio 的 CPU 使用率飙升至 40-60%。这与我的“很短的时间内”观察结果非常吻合:如果 pulseaudio 消耗了整个 CPU 400 毫秒,那么在 1 秒的间隔内可能会显示为 40% 的使用率,如果它使 mpd 的 CPU 不足 400 毫秒,那么这可以解释卡顿的原因。

所以这让我很疑惑:为什么我需要 pulseaudio 来在这个东西上播放音乐?我希望这台笔记本电脑只做一件事,播放音乐,并且我不希望除 mpd 之外的任何其他进程使用音频硬件。所以我希望 mpd 直接使用 ALSA,而不通过 pulseaudio。但我不知道该怎么做。

更令人恼火的是,我甚至无法让 ALSA 实用程序 (aplay) 在没有经过 pulseaudio 的情况下播放音频!似乎任何播放音频的进程最终都会导致 pulseaudio 运行。进一步看来 systemd 也参与了这一阴谋,因为每个用户最多只有一个 pulseaudio,并且其父 PID 始终为 1(/sbin/init,即 systemd)。

现在,我不太确定这是 ALSA 问题、pulseaudio 问题、Debian 问题还是 systemd 问题。我相当确定这不是 mpd 问题,因为如果不通过 pulseaudio,我甚至无法让 aplay 运行。

那么:如果这确实是导致我的音频卡顿问题的根源,我该如何在 Debian 8.6 上禁用 pulseaudio?

答案1

啊哈!我想我明白了。明确使用正确的 ALSA 设备名称是不够的,卸载 pulseaudio 也是不够的。我不得不这样做两个都这些事情。具体来说:

  1. sudo apt remove pulseaudio
  2. 重新启动以确保没有正在运行的 pulseaudio 进程
  3. 运行aplay -L并随机尝试看似有希望的设备名称,直到成功:事实证明“default:CARD=Audio”是正确的设备名称。它适用于 aplay 和 mpd。

/etc/mpd.conf 的相关代码片段:

audio_output {
  type      "alsa"
  name      "ALSA default"
  device    "default:CARD=Audio"
}

相关内容