目录
Please enable Javascript to view the contents

Ubuntu22.04: 声卡驱动相关

 ·  ☕ 5 分钟

    前言

    PipeWire开发工作最早可以追溯到2015年,最初被认为是 “视频领域的 PulseAudio",但后来也扩展到了音频领域。2021年4月发布的 Fedora34 成为了第一个默认采用了这项技术的发行版,其他桌面 Linux 发行版之后也很快跟进。相比之下,Ubuntu 进度远远落后于其竞争对手。
    
    PipeWire 的优点:
    - 首先 PipeWire 的实现方式更新,开发也更加积极,bug 相对也就更少;
    - 其次 PipeWire 有更好的硬件兼容性(PulseAudio 不支持很多新的蓝牙耳机),还减少了 CPU 的使用,代码基础更现代化;
    - 与PulseAudio相比,对现代蓝牙音频设备(例如,Apple Air Pods)的支持更好;
    
    WirePlumber, 一个流行的PipeWire会话和策略管理器。
    
    Ubuntu 22.04 LTS 的默认镜像会同时安装 PipeWire 和 PulseAudio。 PipeWire 只用于视频,PulseAudio 处理音频。需要手动将 PipeWire 设为默认的音频服务器。
    Ubuntu 22.10(代号 "Kinetic Kudu")开发版本的日常构建中,Pipewire已经取代了 PulseAudio,成为了 Ubuntu 的默认音频服务器,不再需要任何设置。
    

    配置PipeWire为默认音频服务器

    Ubuntu 22.04部分安装并启用了PipeWire。启用剩余的部分,并使用PipeWire进行音频和蓝牙,而不是PulseAudio。

    安装

    1. 检查环境

      Pipewire预先安装,并自动作为后台服务运行。在终端运行下面的命令来进行确认

      1
      
      systemctl --user status pipewire pipewire-session-manager
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      
      ● pipewire.service - PipeWire Multimedia Service
           Loaded: loaded (/usr/lib/systemd/user/pipewire.service; enabled; vendor preset: enabled)
           Active: active (running) since Thu 2022-09-29 14:21:51 CST; 8min ago
      TriggeredBy: ● pipewire.socket
         Main PID: 2657 (pipewire)
            Tasks: 2 (limit: 75541)
           Memory: 6.6M
              CPU: 142ms
           CGroup: /user.slice/user-1000.slice/user@1000.service/session.slice/pipewire.service
                   └─2657 /usr/bin/pipewire
      
      Sep 29 14:21:51 hex-Pad systemd[2650]: Started PipeWire Multimedia Service.
      Sep 29 14:21:51 hex-Pad pipewire[2657]: Cannot connect to server socket err = 没有那个文件或目录
      Sep 29 14:21:51 hex-Pad pipewire[2657]: Cannot connect to server request channel
      Sep 29 14:21:51 hex-Pad pipewire[2657]: jack server is not running or cannot be started
      Sep 29 14:21:51 hex-Pad pipewire[2657]: JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
      Sep 29 14:21:51 hex-Pad pipewire[2657]: JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
      Sep 29 14:21:51 hex-Pad pipewire[2657]: jack-device 0x5595b2c0bd58: can't open client: 拒绝连接
      
      ● pipewire-media-session.service - PipeWire Media Session Manager
           Loaded: loaded (/usr/lib/systemd/user/pipewire-media-session.service; enabled; vendor preset: enabled)
           Active: active (running) since Thu 2022-09-29 14:21:51 CST; 8min ago
         Main PID: 2658 (pipewire-media-)
            Tasks: 2 (limit: 75541)
           Memory: 4.9M
              CPU: 108ms
           CGroup: /user.slice/user-1000.slice/user@1000.service/session.slice/pipewire-media-session.service
                   └─2658 /usr/bin/pipewire-media-session
      
      Sep 29 14:21:51 hex-Pad systemd[2650]: Started PipeWire Media Session Manager.
    2. 安装客户端包

      默认情况下,音频输出并。运行命令安装客户端库:

      1
      
      sudo apt install pipewire-audio-client-libraries libspa-0.2-bluetooth libspa-0.2-jack
    3. 安装WirePlumber作为会话管理器:

      1
      
      sudo apt install pipewire-media-session- wireplumber

      注意’pipe - wire-media-session’后面的’-’。这是为了在同一个命令中删除它,因为将使用’wireplumber’代替。

      1
      
      systemctl --user --now enable wireplumber.service
    4. 安装蓝牙编码器 AAC/LDAC/AptX:

      1
      2
      3
      4
      
      sudo apt install \
        libfdk-aac2 \
        libldacbt-{abr,enc}2 \
        libopenaptx0

    配置

    Wireplumber使事情变得非常容易!如果只想用PipeWire替换Pulseaudio,则启用媒体会话服务和重新启动,仅此而已!

    1. ALSA客户端配置PipeWire输出

      将PipeWire示例中的配置文件复制到ALSA配置目录中:

      1
      
      sudo cp /usr/share/doc/pipewire/examples/alsa.conf.d/99-pipewire-default.conf /etc/alsa/conf.d/
    2. JACK客户端配置PipeWire输出:

      1
      
      sudo cp /usr/share/doc/pipewire/examples/ld.so.conf.d/pipewire-jack-*.conf /etc/ld.so.conf.d/

      sudo ldconfig

    3. Bluetooth客户端

      只需删除此包装,蓝牙将由PipeWire处理:

      1
      
      sudo apt remove pulseaudio-module-bluetooth

    检查

    通过客户端工具pactl检查:

    1
    
    LANG=C pactl info | grep '^Server Name'

    返回值

    1
    
    Server Name: PulseAudio (on PipeWire 0.3.32)

    通过systemctl检查pipewire服务状态

    1
    
    systemctl --user status pipewire pipewire-session-manager

    配置返回值

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    
    ● pipewire.service - PipeWire Multimedia Service
         Loaded: loaded (/usr/lib/systemd/user/pipewire.service; enabled; vendor preset: enabled)
         Active: active (running) since Thu 2022-09-29 14:21:51 CST; 13min ago
    TriggeredBy: ● pipewire.socket
       Main PID: 2657 (pipewire)
          Tasks: 2 (limit: 75541)
         Memory: 7.7M
            CPU: 245ms
         CGroup: /user.slice/user-1000.slice/user@1000.service/session.slice/pipewire.service
                 └─2657 /usr/bin/pipewire
    
    Sep 29 14:21:51 hex-Pad systemd[2650]: Started PipeWire Multimedia Service.
    Sep 29 14:21:51 hex-Pad pipewire[2657]: Cannot connect to server socket err = 没有那个文件或目录
    Sep 29 14:21:51 hex-Pad pipewire[2657]: Cannot connect to server request channel
    Sep 29 14:21:51 hex-Pad pipewire[2657]: jack server is not running or cannot be started
    Sep 29 14:21:51 hex-Pad pipewire[2657]: JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
    Sep 29 14:21:51 hex-Pad pipewire[2657]: JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
    Sep 29 14:21:51 hex-Pad pipewire[2657]: jack-device 0x5595b2c0bd58: can't open client: 拒绝连接
    
    ● wireplumber.service - Multimedia Service Session Manager
         Loaded: loaded (/usr/lib/systemd/user/wireplumber.service; enabled; vendor preset: enabled)
         Active: active (running) since Thu 2022-09-29 14:33:58 CST; 1min 26s ago
       Main PID: 10292 (wireplumber)
          Tasks: 4 (limit: 75541)
         Memory: 7.2M
            CPU: 170ms
         CGroup: /user.slice/user-1000.slice/user@1000.service/session.slice/wireplumber.service
                 └─10292 /usr/bin/wireplumber
    
    Sep 29 14:33:58 hex-Pad systemd[2650]: Started Multimedia Service Session Manager.
    Sep 29 14:33:58 hex-Pad wireplumber[10292]: Failed to set scheduler settings: Operation not permitted
    Sep 29 14:33:59 hex-Pad wireplumber[10292]: <WpSiAudioAdapter:0x55ae534170e0> Object activation aborted: proxy destroyed
    Sep 29 14:33:59 hex-Pad wireplumber[10292]: <WpSiAudioAdapter:0x55ae534170e0> failed to activate item: Object activation aborted: proxy destroyed

    检查已安装deb包

    1
    2
    3
    4
    5
    
    apt list --installed | grep libldac
    
    apt list --installed | grep pipewire
    
    apt show pipewire-pulse

    其他问题

    1. systemctl –user status 执行失败

    ubuntu22.04 登录会出现问题,导致出现报错

    1
    
    process org.freedesktop.systemd1 exited with status 1

    原因是:缺少环境变量XDG_RUNTIME_DIR, 怀疑之前将18.04$HOME目录下内容覆盖了22.04下的内容,导致~/.profile或~/.bashrc的内容出现问题。目前通过下面命令进行屏蔽

    1
    
    echo "export XDG_RUNTIME_DIR=/run/user/$(id -u)" >> /$HOME/.profile

    2. wireplumber在pipewire-media-session未卸载之前,为masked状态无法enable

    mask 是个比disable更彻底的状态。

    使用disable会删除服务相关的unit-file;

    使用mask则会将其link至/dev/null,其对比disable的优势是防止任何形式的激活,包括手动

    systemctl list-unit-files命令来显示unit-files的状态,(static, enabled, disabled, masked, indirect)

    systemctl list-units命令来显示服务的状态

    3. 恢复pulseaudio为音频处理

    要撤消更改,首先删除客户端库:

    1
    
    sudo apt remove pipewire-audio-client-libraries libspa-0.2-bluetooth libspa-0.2-jack

    删除WirePlumber并安装以前的pipewire-media-session

    1
    
    sudo apt install pipewire-media-session wireplumber-

    最后,重新启用PipeWire-Media-Session服务:

    1
    2
    
    rm -f ~/.config/systemd/user/pipewire-session-manager.service
    systemctl --user --now enable pipewire-media-session

    如果声音仍无法正常工作,尝试通过命令禁用PipeWire-Pulse服务:

    1
    2
    3
    4
    
    # 当前用户
    systemctl --user --now disable pipewire-pulse.service pipewire-pulse.socket
    # 全局
    sudo systemctl --global --now disable pipewire-pulse.service pipewire-pulse.socket

    重新启用re-enable pulseaudio服务:

    1
    2
    3
    4
    
    # 当前用户
    systemctl --user --now reenable pulseaudio.service pulseaudio.socket
    # 全局
    sudo systemctl --global --now reenable pulseaudio.service pulseaudio.socket

    重启

    1
    2
    3
    
    systemctl --user restart pulseaudio
    
    reboot

    Reference

    上下文:

    PipeWire is the default audio server in Ubuntu 22.10.

    PipeWire

    wireplumber

    配置:

    Enable PipeWire on Ubuntu 22.04

    How to Use PipeWire to replace PulseAudio in Ubuntu 22.04

    其他

    Why are some systemd services in the “masked” state?

    Unmask a Masked Service in Systemd

    分享

    Hex
    作者
    Hex
    CloudNative Developer