在 Arch Linux 中修改外置声卡的采样率 (Pipewire)

Posted on Sep 18, 2024

本人的系统 (Arch Linux + KDE6) 目前使用的音频系统是 PipeWire,并通过 WirePlumber 作为会话管理器。PipeWire 也兼容了 PulseAudio 的协议,所以部分应用程序则是通过PulseAudio 兼容层(基于 PipeWire) 处理音频。由于网上搜到的很多Blog都已经过时,导致我在配置时踩了不少坑,学习了大量Arch Linux 音频系统工作原理相关知识后才成功配置….附上一张小尾巴被修改采样率后的图片:

≤48k-黄色 64k~192k-蓝色 352.8k-橙色 如果不修改默认为48k

🚀 解决方案

修改 PipeWire 的配置文件来更改采样率。请注意,不要直接编辑 ~/.config/pipewire/pipewire.conf,而是要通过创建一个新的自定义配置文件来实现。否则会产生错误: : pw.context: "0x5808608651f0:" no modules loaded from context.modules

步骤如下:

  1. 创建自定义配置文件: 在 ~/.config/pipewire/pipewire.conf.d/ 目录下创建一个 custom.conf 文件:

    mkdir -p ~/.config/pipewire/pipewire.conf.d
    touch ~/.config/pipewire/pipewire.conf.d/custom.conf
    
  2. 编辑配置文件: 打开 custom.conf 文件并加入以下内容:

    context.properties = {
        default.clock.rate = 192000
        default.clock.allowed-rates = [ 48000 96000 192000 ]
    }
    

    这里将采样率设置为 192kHz,并允许系统支持其他常见的采样率如 48kHz 和 96kHz。

  3. 重启 PipeWire: 保存文件后,重启 PipeWire 服务:

    systemctl --user restart pipewire
    systemctl --user restart pipewire-pulse
    
  4. 检查配置是否生效: 你可以通过以下命令查看当前的音频服务器信息,确认采样率的更改是否成功:

    pactl info
    

    执行后的输出应该类似如下:

    Server String: /run/user/1000/pulse/native
    Library Protocol Version: 35
    Server Protocol Version: 35
    Is Local: yes
    Client Index: 264
    Tile Size: 65472
    User Name: zyf
    Host Name: zyf-arch-pc
    Server Name: PulseAudio (on PipeWire 1.2.3)
    Server Version: 15.0.0
    Default Sample Specification: float32le 2ch 192000Hz
    Default Channel Map: front-left,front-right
    Default Sink: alsa_output.usb-Sonata_Sonata_BHD_Pro_Sonata_BHD_Pro-00.pro-output-0
    Default Source: alsa_output.usb-Sonata_Sonata_BHD_Pro_Sonata_BHD_Pro-00.pro-output-0.monitor
    

    可以看到,默认采样率已经被修改为 192000Hz

🔧 Arch Linux 音频系统工作原理

Arch Linux 目前广泛使用 PipeWire 作为音频服务器,它替代了传统的 PulseAudio 和 JACK,成为一个更通用的音频处理框架。下面我们来简要介绍一下 Arch Linux 音频系统中的各个部分及其调用关系:

  1. PipeWire: PipeWire 是核心音频和视频处理框架,它负责管理不同应用程序的音频流,并且支持多种不同的音频后端,比如 ALSA、PulseAudio、JACK 等。

  2. PulseAudio 兼容层: PipeWire 提供了一个兼容层,使得依赖 PulseAudio 的应用程序仍然能够正常工作。这意味着你仍然可以通过 pactlpulseaudio 等命令进行管理。

  3. ALSA (Advanced Linux Sound Architecture): ALSA 是 Linux 内核的一部分,负责与实际的硬件设备(如声卡)进行通信。PipeWire 将 ALSA 作为低层接口,用来与声卡交互。

  4. JACK 支持: PipeWire 也能兼容 JACK,用于低延迟的音频处理,常见于专业音频应用场景。

这些组件的调用关系通常是:应用程序 -> PulseAudio 兼容层 -> PipeWire -> ALSA -> 硬件声卡。对于需要低延迟的应用程序,则是:应用程序 -> PipeWire (通过 JACK 接口) -> ALSA -> 硬件声卡。

🛠 常用音频调试命令

在使用 PipeWire 时,你可能会遇到一些音频问题。以下是一些常用的调试命令,帮助你快速定位问题:

  1. 查看当前的 PipeWire 状态

    systemctl --user status pipewire
    

    你可以通过这条命令查看 PipeWire 服务的运行状态,是否出现错误。

  2. 查看当前连接的音频设备

    pw-cli list-objects
    

    这个命令会列出所有当前连接的音频设备,帮助你确认设备是否被正确识别。

  3. 查看当前的 ALSA 设备

    aplay -l
    

    该命令会列出所有的 ALSA 播放设备,确保你的声卡被正确识别。

  4. PulseAudio 兼容层的调试: 如果你依赖 PulseAudio 层,可以使用以下命令检查 PulseAudio 的状态:

    pactl list short sinks
    pactl list short sources
    
  5. pw-top 类似top,是一个音频任务监视器:

    pw-top
    

以上内容仅为个人理解和测试得出,如有错误请帮忙指正!