如何配置 PulseAudio 以仅使用单个 ALSA 设备进行输入和输出?
默认的 PulseAudio 配置会导致 PulseAudio 在启动时打开所有 ALSA 设备。这使得无法将 PulseAudio 与其他 ALSA 客户端一起使用。许多人更喜欢 PulseAudio 而不是 ALSA,但其他用户却觉得它令人沮丧。无论好坏,PulseAudio 已成为一种标准,并且一些流行的 Linux 应用程序(例如 Skype 和 Firefox)仅支持通过 PulseAudio 输出音频。
有些用户喜欢使用直接输出到 ALSA 的音频客户端,而有些用户则输出到其他音频框架(如 JACK),但希望 JACK 直接访问 ALSA。对于这些用户,卸载 PulseAudio 可以轻松释放所有 ALSA 设备。但是,删除 PulseAudio 会导致无法在 Skype 和 Firefox 中使用音频。
更好的解决方案是想出一个配置,让 PulseAudio 与其他 ALSA 客户端“很好地配合”,只输出到单个设备(该设备将在其配置中指定),甚至只输出到 ALSA 设备default
。我们该怎么做?
答案1
这个答案建立在@dirkt 的答案之上,所以我们应该感谢他。
您可以编辑
~/.config/pulse/default.pa
。它列在“pulseaudio(1)”手册页的 FILES 下。如果存在,default.pa
则不使用全局变量。对我来说,我可以使用以下最小配置获得一个工作设置:load-module module-alsa-sink device=default load-module module-alsa-source device=default load-module module-native-protocol-unix
但是,您可能希望查看
/etc/pulse/default.pa
我的系统上的全局版本,以了解此文件中还可以包含哪些内容。这里配置了各种各样的花哨功能:用于恢复音量设置、发现蓝牙设备、与 JACK 交互、用户注销时自动退出守护进程等的模块。如果您决定将全局文件复制到主目录并对其进行编辑,甚至直接编辑全局文件,则需要执行以下操作:- 注释掉
load-module module-udev-detect
,它会搜索 ALSA 硬件设备并覆盖您传递给上面的 ALSA 模块的设备参数。 - 然后添加
module-alsa-sink
和module-alsa-source
行。该module-native-protocol-unix
行应该已经存在。 - 您可能需要注释掉该行
load-module module-suspend-on-idle
;这给我的测试带来了问题某些输出设备。症状是mplayer -ao pulse ...
报告“音频设备卡住了!”并mpv -ao pulse ...
报告“[ao/pulse] 流已暂停。正在退出。”注释掉该模块即可解决问题。
- 注释掉
如果您选择与
device=default
上述不同的设备,例如两个分离ALSA 设备用于录制和播放,那么根据我的经验,它将无法工作 -parecord
尝试从接收设备而不是源设备录制。如果您已通过 ALSA 配置了单独的输入和输出设备,并且您希望它们由同一个 PCM 设备命名,你需要输入如下内容~/.asoundrc
:pcm.!default { # "!" means "override" the previous definition type asym playback.pcm "hw4mix" capture.pcm "hw:5" }
这里
hw4mix
命名一个dmix 设备文件中先前定义的;而hw:5
指定我的 USB 麦克风的硬件设备。这让 PulseAudio 很开心。如果您想为 PulseAudio 客户端使用特殊设备,您可以将其命名为“special_pulseaudio_device”而不是“default”(当然,更新default.pa
以引用它)。测试。使用
pulseaudio -k
或killall pulseaudio
终止当前的 PulseAudio 守护进程。然后使用 重新启动它pulseaudio -vv
。当然,每次编辑 时都需要这样做~/.asoundrc
。一旦您有了有效的设置,您可以尝试 之类的操作pactl exit; pulseaudio --start
。该--start
选项使其在后台运行,您将无法看到错误消息。使用
parecord -v t.wav
和paplay -v t.wav
录制并播放 WAV 文件。您应该能够同时运行这些命令。由于我使用
dmix
设备进行播放,因此我可以一起使用paplay
和aplay
,并且会自动进行混音。但是,我的设置中无法共享麦克风;arecord
当 PulseAudio 正在运行时(“设备或资源繁忙”),我无法使用它进行录制。为此,我需要创建一个dsnoop
设备并将其名称置于hw:5
上述位置。如果您尝试让 Skype 工作,请使用 Skype“回声/声音测试服务”来测试您的设置。请记住,Skype 可能已经在后台运行 -
killall skype
在启动它之前尝试强制它建立新的 PulseAudio 连接。根据我的经验,当 Skype 无法连接到 PulseAudio 守护程序时,它不会报告任何类型的错误情况。
拥有良好的 ALSA 配置是可取的,即使只是因为某些应用程序(Ecasound?遗留代码?)无法与 PulseAudio 配合使用。我希望这些说明对那些已经根据自己的喜好配置了 ALSA,现在想要使用依赖于 PulseAudio 的程序(如 Skype)的人有所帮助。
答案2
你不配置 PulseAudio 以使用 ALSA 默认设备。相反,您可以将 ALSA 配置为使用pulse
默认设备:
pcm.!default pulse
ctl.!default pulse
这样,不知道 PulseAudio 的 ALSA 应用程序将通过该间接层使用 PulseAudio。
你需要这样做的原因是 PulseAudio总是使用 ALSA 作为后端,并在启动时打开全部ALSA 设备,并且由于大多数 ALSA 设备不能多次打开,这将导致所有在 PulseAudio 运行时尝试直接使用 ALSA 设备的 ALSA 应用程序失败。
如果您有一个由于某种原因无法运行的旧版应用程序,您可以pasuspender
暂时暂停 PulseAudio 来运行该特定应用程序。
我当时的情况和你现在的情况很相似,我使用 ALSA 很长时间,感觉很好,后来被迫改用 PulseAudio。PulseAudio 原则上比 ALSA 具有更好、更通用的结构(流和源/接收器),虽然有时它有缺陷,但人们可以忍受。
您可以通过手动启动 pulseaudio 并添加-v
标志(如pulseaudio -vv start
等)来调试问题。日志消息将发送到 syslog。如果您想切换设备,pavucontrol
这是一个易于使用的 GUI,如果您想要更直接的控制,您可以使用pacmd
或pactl
(我从来没有弄清楚为什么有两个程序)作为命令行 CLI。使用参数help
获取更多详细信息。如果您更喜欢文件,那么一切都很容易编写脚本。
我还建议看看可用的模块。