为什么 PulseAudio 启动时会打开所有 ALSA 声音设备?

为什么 PulseAudio 启动时会打开所有 ALSA 声音设备?

也可以看看PulseAudio 如何启动?

当。。。的时候脉冲音频音频守护进程启动,它默认加载module-udev-detect,它检测并打开我的所有声卡。 PulseAudio 使用阿尔萨斯与硬件接口; ALSA 是内核模块和用户空间库的组合。

由于 PulseAudio 打开所有声卡,并且由于 ALSA 卡只能打开一次,当我在 PulseAudio 启动后尝试打开 ALSA 卡时,会收到“设备或资源繁忙”错误:

$ arecord -D hw:2 -f S16_LE -c 1 -r 48000 -d 3 t.wav
arecord: main:830: audio open error: Device or resource busy

我想知道这个设计决定。为什么PulseAudio启动时需要打开所有设备?

作为用户,我宁愿让 PulseAudio 仅在需要时打开它需要的内容。如果打开该设备时出现问题,那么我希望将错误报告回客户端应用程序 - 尝试读取或写入 PulseAudio 设备的应用程序。

按需设备开放的优点:

  • ALSA 和 PulseAudio 可以共存。我不必退出 PulseAudio 服务器即可启动 ALSA 应用程序。

  • 我可以知道是否有人在监视我。如果麦克风设备在我不使用时打开,那么这就很可疑;按照目前的设计,这是正常的。

  • 与 ALSA 一样,与设备相关的错误可以直接报告给用户,而不是报告给日志记录工具。

  • 我可以在同一系统上运行两个版本的 PulseAudio,并且可以在运行时决定哪个服务器应该控制哪些设备。

  • 我可以毫不费力地与另一个(更好的?)声音服务器并行运行 PulseAudio。

有什么缺点?是否存在一些我不知道的技术问题,导致 Linux 声音服务器在不使用它们时无法释放它所知道的设备?早期的声音服务器是否像静电放电也采用这种操作方式?抢先开放所有设备的决定是否具有反竞争性,即是否故意让其他声音服务器在Linux平台上竞争变得更加困难?

答案1

声音服务器的总体设计是从各种软件接受数据并将其路由到有用的音频设备,反之亦然(用于输入)。

由于这是目标,PulseAudio 需要了解它想要使用的每个设备的功能。因此,它必须打开它们以查询有关支持的样本大小和预期延迟以及设备名称等信息的功能(因为用户需要知道这些信息来选择设备)。一旦完成,它就可以向用户呈现这些选项。

如果用户想要在设备上播放某些内容,则 PulseAudio 可以直接播放该卡(如果该卡已打开)。如果卡未打开,则 PulseAudio 必须首先获取它,如果其他设备正在使用它,则可能无法工作。在这种情况下,用户会认为他们的声音在没有正当理由的情况下被破坏。同样,用户可能会质疑为什么他们的麦克风似乎没有发出声音。

因为普通用户不了解或不想查看日志,所以突然断音需要检查日志,尤其是在尝试启动视频会议之类的事情时,往好了说是令人恼火,往坏了说是一个无法克服的问题。我是一名技术精湛的用户,在 Linux 上拥有数十年的经验,我不想解决声音问题(或任何与此相关的问题)。

获取所有声卡,然后让 ALSA 使用 PulseAudio 作为默认 ALSA 设备,这意味着知道如何使用 ALSA 但不知道 PulseAudio 的程序将直接运行,而不会与其他程序竞争。否则,例如,您的音频播放器可能会抓住该卡,同时阻止终端铃声等声音效果发挥作用。事实上,这并不是一个罕见的问题。这就是为什么 PulseAudio 被支持作为 ALSA 输出设备。

当然,这种设计并不能满足所有人的需求,但它确实产生了最简单、最强大的行为,因为向用户显示的卡通常是可用的,而未显示的卡则不可用。通过某些配置,可能可以产生您想要的行为,或者您可能更喜欢使用其他解决方案,例如带有 dmix 的 JACK 或 ALSA。

相关内容