Настройка pipewire в Ubuntu

Установка

apt-get install pipewire pipewire-pulse pipewire-audio-client-libraries wireplumber pulseaudio-utils

Удалить pulse

apt-get purge pulseaudio
apt autoremove

Создайте папку для конфигов

mkdir -p /etc/pipewire/pipewire.conf.d
mkdir -p /etc/pipewire/pipewire-pulse.conf.d

Анонимный сокет

Создайте файл /etc/pipewire/pipewire-pulse.conf.d/60-pulse-socket.conf

context.modules = [
    {
        name = libpipewire-module-protocol-pulse
        args = {
            server.address = [
                "unix:/tmp/pulse-socket"
            ]
        }
    }
]
context.exec = [
    { path = "/bin/chmod" args = "777 /tmp/pulse-socket" }
]

На другом пользователе в файле

nano /home/otheruser/.config/pulse/client.conf

default-server = unix:/tmp/pulse-socket

В /etc/environment нужно добавить

PULSE_SERVER=/tmp/pulse-socket

Убрать шум микрофона

Создайте файл /etc/pipewire/pipewire-pulse.conf.d/60-usb-audio-echo-cancel.conf

context.modules = [
    {
        name = libpipewire-module-echo-cancel
        args = {
            library.name = aec/libspa-aec-webrtc
            aec.args = {
                webrtc.gain_control = false
                webrtc.extended_filter = false
                webrtc.analog_gain_control = false
                webrtc.digital_gain_control = false
                #webrtc.experimental_agc = true
                #webrtc.noise_suppression = true
            }
        }
    }
]

Модуль echo cancel будет работать для микрофона выбранного по умолчанию.

Проверка звукового сервера

Проверить какой сервер сейчас работает можно командой

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

Статус сервера:

wpctl status

Перезапустить можно командой:

systemctl --user restart pipewire

Скрипт переключения аудио сервера

Данный скрипт позволяет переключиться с pipewire на pulseaudio и наоборот без перезагрузки компьютера

#!/bin/bash

RETVAL=0

case "$1" in

    pulse)
        systemctl --user disable pipewire
        systemctl --user disable pipewire-pulse
        systemctl --user disable pipewire.socket
        systemctl --user disable pipewire-pulse.socket
        systemctl --user stop pipewire
        systemctl --user stop pipewire-pulse
        systemctl --user stop pipewire.socket
        systemctl --user stop pipewire-pulse.socket
        
        systemctl --user enable pulseaudio.service
        systemctl --user enable pulseaudio.socket
        systemctl --user start pulseaudio.service
        systemctl --user start pulseaudio.socket
        
        LANG=C pactl info | grep '^Server Name'
    ;;
    
    pipewire)
        pulseaudio -k
        
        systemctl --user disable pulseaudio.service
        systemctl --user disable pulseaudio.socket
        systemctl --user stop pulseaudio.service
        systemctl --user stop pulseaudio.socket
        
        systemctl --user enable pipewire
        systemctl --user enable pipewire-pulse
        systemctl --user enable pipewire.socket
        systemctl --user enable pipewire-pulse.socket
        systemctl --user start pipewire
        systemctl --user start pipewire-pulse
        LANG=C pactl info | grep '^Server Name'
    ;;
    
    *)
        echo "Usage: $0 {pulse|pipewire}"
        RETVAL=1

esac

exit $RETVAL