如何配置 PulseAudio 通过 ALSA 输入/输出?

如何配置 PulseAudio 通过 ALSA 输入/输出?

如何配置 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 的答案之上,所以我们应该感谢他。

  1. 您可以编辑~/.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-sinkmodule-alsa-source行。该module-native-protocol-unix行应该已经存在。
    • 您可能需要注释掉该行load-module module-suspend-on-idle;这给我的测试带来了问题某些输出设备。症状是mplayer -ao pulse ...报告“音频设备卡住了!”并mpv -ao pulse ...报告“[ao/pulse] 流已暂停。正在退出。”注释掉该模块即可解决问题。
  2. 如果您选择与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以引用它)。

  3. 测试。使用pulseaudio -kkillall pulseaudio终止当前的 PulseAudio 守护进程。然后使用 重新启动它pulseaudio -vv。当然,每次编辑 时都需要这样做~/.asoundrc。一旦您有了有效的设置,您可以尝试 之类的操作pactl exit; pulseaudio --start。该--start选项使其在后台运行,您将无法看到错误消息。

    使用parecord -v t.wavpaplay -v t.wav录制并播放 WAV 文件。您应该能够同时运行这些命令。

    • 由于我使用dmix设备进行播放,因此我可以一起使用paplayaplay,并且会自动进行混音。但是,我的设置中无法共享麦克风;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,如果您想要更直接的控制,您可以使用pacmdpactl(我从来没有弄清楚为什么有两个程序)作为命令行 CLI。使用参数help获取更多详细信息。如果您更喜欢文件,那么一切都很容易编写脚本。

我还建议看看可用的模块

相关内容