Настройка Pulseaudio через systemd в Ubuntu 18.04

Порой иногда нужно запускать Pulseaudio через systemd как сервис в Ubuntu. Это может быть необходимо по разным причинам.

Например, вы хотите сделать музыкальный сервер. Или как в моем случае, у меня многопользовательская система, и я запускаю иногда игры, под разными пользователям. Steam у меня работает под отдельным пользователем. И хотелось бы, чтобы звук из игры со steam и audacious работали одновременно и проигрывали музыку.

По умолчанию в Ubuntu pulseaudio запускается, от лица пользователя, когда ему потребуется звук, и чтобы одновременно играть в игры со steam и слушать музыку в audacious, нужно запустить Pulseaudio в качестве сервиса, либо прокинуть сокет для второго пользователя.

На официальном сайте, говорят что запускать pulseaudio в качестве сервиса, не очень удачная идея. Пишут, что все пользователи системы получат доступ к звуковой карте и микрофону (мне как раз это и нужно), и то что все смогут зафлудить папку /var.

Также говорят, что будет высокая нагрузка на CPU, из-за того что не доступен shared memory. Я если честно не увидел этой высокой нагрузки в system mode. Имхо, больше грузит хром, когда проигрывает музыку, или видео на ютубе. Загрузка Pulseaudio CPU действительно есть, у меня она порядка 4%, а хрома 25%. Причем она одинаковая что в system wide mode, что в обычном.

Flatpak не работает с pulseaudio в system wide mode. Тикет на Github.

Способ первый.

Если вы хотите просто передать звук второму пользователю, например, запустить программу через kdesudo, то отлично подойдет данный способ, и не нужно будет включать system wide mode у pulseaudio.

В файле /etc/pulse/default.pa добавьте в конце строку:

load-module module-native-protocol-unix auth-anonymous=1 socket=/tmp/pulse-socket

На другом пользователе в файле /home/otheruser/.config/pulse/client.conf:

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

Способ второй.

Если первый способ вам не подходит, или вы решили запускать pulseaudio в качестве сервиса, то вот что нужно сделать.

1) Сделайте бэкап папке /etc/pulse

2) Немного о конфигах

Я очень долго не мог понять, почему, когда я правлю конфиги, ничего не работает. Оказалось, что за работу в качестве клиента и сервиса у Pulseaudio, отвечают разные конфиги, и я правил не тот конфиг. Я правил конфиги от клиента, а запускал как сервис, и удивлялся почему ничего не работает.

Конфиги, которые отвечают за сервис — daemon.conf, system.pa
Конфиги, которые отвечают за работу клиента — client.conf, default.pa

3) Исправьте конфиги в /etc/pulse

В client.conf указать:

autospawn = no

Это запретит автозапуск от имени пользователя.

В daemon.conf указать:

daemonize = yes
allow-module-loading = no
allow-exit = no
local-server-type = system
enable-shm = no
log-target = journal
flat-volumes = no

default-sample-format = s16le
default-sample-rate = 48000
default-sample-channels = 2

deferred-volume-safety-margin-usec = 1

Параметры default-sample-format, default-sample-rate, default-sample-channels выставить индивидуально в зависимости от звуковой карты.

Отредактировать файл system.pa. Я привожу весь свой конфиг, т.к. стандартный конфиг отличается.

#!/usr/bin/pulseaudio -nF
#
# This file is part of PulseAudio.
#
# PulseAudio is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# PulseAudio is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.

# This startup script is used only if PulseAudio is started in system
# mode.


### Should be after module-*-restore but before module-*-detect
load-module module-switch-on-port-available

### Use hot-plugged devices like Bluetooth or USB automatically (LP: #1702794)
.ifexists module-switch-on-connect.so
load-module module-switch-on-connect
.endif


### Automatically load driver modules depending on the hardware available
.ifexists module-udev-detect.so
load-module module-udev-detect
.else
### Use the static hardware detection module (for systems that lack udev/hal support)
load-module module-detect
.endif

### Load several protocols
.ifexists module-esound-protocol-unix.so
load-module module-esound-protocol-unix
.endif
load-module module-native-protocol-unix


### Automatically restore the volume of streams and devices
load-module module-stream-restore
load-module module-device-restore
#load-module module-card-restore


### Automatically load driver modules for Bluetooth hardware
.ifexists module-bluetooth-policy.so
load-module module-bluetooth-policy
.endif

.ifexists module-bluetooth-discover.so
load-module module-bluetooth-discover
.endif


### Automatically restore the default sink/source when changed by the user
### during runtime
### NOTE: This should be loaded as early as possible so that subsequent modules
### that look up the default sink/source get the right value
load-module module-default-device-restore

### Automatically move streams to the default sink if the sink they are
### connected to dies, similar for sources
load-module module-rescue-streams

### Make sure we always have a sink around, even if it is a null sink.
load-module module-always-sink

### Automatically suspend sinks/sources that become idle for too long
load-module module-suspend-on-idle

### Enable positioned event sounds
load-module module-position-event-sounds


### Modules to allow autoloading of filters (such as echo cancellation)
### on demand. module-filter-heuristics tries to determine what filters
### make sense, and module-filter-apply does the heavy-lifting of
### loading modules and rerouting streams.
load-module module-filter-heuristics
load-module module-filter-apply


# Remove microphone noise
load-module module-echo-cancel aec_method=webrtc format=s16le rate=48000 channels=2


### Make some devices default
set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
set-default-source alsa_input.pci-0000_00_1b.0.analog-stereo.echo-cancel

Очень важным является set-default-sink и set-default-source. У вас они могут отличатся в зависимости от звуковой карты. Чтобы узнать конкретный sink(выход) и source(вход) нужно выполнить команды

pacmd list-sinks
pacmd list-sources

Параметр load-module module-echo-cancel aec_method=webrtc format=s16le rate=48000 channels=2 Отключает шум микрофона, при записи.

Параметр load-module module-switch-on-connect позволяет, при подключении наушников переводить звук на них автоматически.

4) Создайте systemd конфиг

nano /lib/systemd/system/pulseaudio.service

[Unit]
Description=PulseAudio system server
After=syslog.target local-fs.target network.target

[Service]
Type=simple
ExecStart=/usr/bin/pulseaudio --daemonize=no --system --disallow-exit --disable-shm --disallow-module-loading --log-target=journal
ExecReload=/bin/kill -HUP $MAINPID


[Install]
WantedBy=multi-user.target

Включите автозапуск pulseaudio при старте системы:

systemctl enable pulseaudio.service
systemctm start pulseaudio.service

Все! Ваш Pulseaudio сервер готов

Материалы:

  1. System Wide Mode