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

目录