Настройка 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.
Создайте файл
nano /etc/pulse/default.pa.d/pulse-socket.pa
load-module module-native-protocol-unix auth-anonymous=1 socket=/tmp/pulse-socket
На другом пользователе в файле
nano /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 сервер готов
Материалы: