如何从命令行稳健地切换脉冲音频输出设备?

如何从命令行稳健地切换脉冲音频输出设备?

在 Ubuntu 和其他发行版中,有一个图形化的东西可以切换音频输出设备。我尝试编写一个命令行工具来执行相同的操作,但它并不总是有效。

我正在做的切换到接收器 0 的操作如下:

pacmd set-default-sink 0

我认为这应该使所有新的输入转到接收器 0。然后,对于每个现有输入,根据pacmd list-sink-inputs我正在做的:

pacmd move-sink-input <input_id> 0

但它常常不起作用。我经常会切换接收器,然后在某些应用程序中播放一些音频,它仍然会连接到旧接收器。我在这里缺少什么?我怎样才能稳健地做到这一点?

答案1

这篇博文:

PulseAudio 本身附带两个基本的命令行工具,称为 pacmd 和 pactl。前者提供了 set-default-sink 命令,但这并没有达到您的预期。事实证明,至少在我的系统上,PulseAudio 守护进程会为曾经连接到它的每个应用程序保留持久设置。这意味着默认接收器仅用于守护进程尚未见过的应用程序。

换句话说,这位博主遇到了与您完全相同的问题:

  • 切换默认接收器仅影响之前未使用过的程序
  • 移动现有输入仅影响声卡实际活动的程序
  • 您需要一个工具来遍历持久设置并将它们重新指向新卡。

因此,这位博主编写了paswitch一个命令行工具来完成此任务。 您可以在此处找到 Git 格式的源代码。

安装:

  • 确保您libpulse-dev安装了 Pulseaudio 开发库包(或类似的包)。您还需要gcc编译器和make实用程序。
  • 运行git clone https://www.tablix.org/~avian/git/paswitch.git下载源代码。
  • cd paswitch进入命令创建的目录git clone,然后运行make​​.
  • paswitch如果完成且没有错误,目录中现在应该有一个二进制文件。将其复制到您的/usr/local/bin/目录中。
  • 阅读README目录中的文件以获取有关如何使用它的示例。

另一种选择是告诉 PulseAudio 守护进程不要保留应用程序的接收器设置,方法是将选项添加restore_device=false到以下module-stream-restore行中/etc/pulse/default.pa

load-module module-stream-restore restore_device=false

执行此操作并重新启动 PulseAudio 后,切换默认接收器将导致所有新的声音应用程序默认使用它。

但你的情况可能会有所不同,具体取决于你使用的桌面环境:在我的 Debian 9 上,禁用持久性会导致 KDE 出现其他恼人的行为,我最终返回到默认行为。如果我没记错的话,它会导致 KDE 系统设置 -> 多媒体 -> 音频和视频 -> 设备首选项列表在每次登录时获取我的音频设备的新副本。

相关内容