在 Ubuntu 和其他发行版中,有一个图形化的东西可以切换音频输出设备。我尝试编写一个命令行工具来执行相同的操作,但它并不总是有效。
我正在做的切换到接收器 0 的操作如下:
pacmd set-default-sink 0
Run Code Online (Sandbox Code Playgroud)
我认为这应该使所有新输入都进入接收器 0。然后,对于每个现有输入,根据pacmd list-sink-inputs我正在做的:
pacmd move-sink-input <input_id> 0
Run Code Online (Sandbox Code Playgroud)
但它常常不起作用。我经常会切换接收器,然后在某些应用程序中播放一些音频,它仍然会连接到旧接收器。我在这里缺少什么?我怎样才能稳健地做到这一点?
来自这篇博文:
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
Run Code Online (Sandbox Code Playgroud)
执行此操作并重新启动 PulseAudio 后,切换默认接收器将导致所有新的声音应用程序默认使用它。
但你的情况可能会有所不同,具体取决于你使用的桌面环境:在我的 Debian 9 上,禁用持久性会导致 KDE 出现其他恼人的行为,我最终返回到默认行为。如果我没记错的话,它会导致 KDE 系统设置 -> 多媒体 -> 音频和视频 -> 设备首选项列表在每次登录时获取我的音频设备的新副本。