LINUX.ORG.RU

Федя 22, mpd и пульса

 , ,


0

2

Жил-был безголовый медиасервер на Fedora 20. Играл музыку через mpd и воспроизводил звук с ноутов (по RTP, пульсой).

Для того, чтобы ящик после загрузки начал воспроизводить звук, нужно было залогиниться (по ssh) и выполнить pulseaudio --start --daemonize, поскольку при system-wide запуске пульса не хотела слушать udp-порт, а для запуска из-под юзера нужно было подружить dbus с отсутствием X, что мне не удалось. Но, плохо ли, хорошо ли, всё работало. По доброй традиции, после обновления (fedup'ом) 20 -> 21 -> 22 всё сломалось.

Начиная с 6-й версии (если не ошибаюсь) пульса активируется через сокет, спавнясь при обращении клиента. Казалось бы, вот оно, счастье! Но фиг там. При запуске сервера mpd (запускается дистрибутивным юнитом, работает из-под своего пользователя) спавнящийся процесс пульсы не видит звуковую карту.

0:[srv-fe04]nbw@fe04:~% sudo -i -u mpd
-bash-4.3$ pacmd list-cards                                                                                                                    
0 card(s) available.
Приходится делать -bash-4.3$ pulseaudio --kill && pulseaudio --start, и только тогда пульса находит звуковуху. Кроме того, перестал воспроизводиться звук, приходящий по RTP (трафик на udp-порт приходит, а звука нет).

Что делать, куда смотреть?

★★★

Последнее исправление: nbw (всего исправлений: 1)

Ответ на: комментарий от i_gnatenko_brain
-bash-4.3$ aplay -L
null
    Discard all samples (playback) or generate zero samples (capture)
default:CARD=DX
    Xonar DX, Multichannel
    Default Audio Device
sysdefault:CARD=DX
    Xonar DX, Multichannel
    Default Audio Device
front:CARD=DX,DEV=0
    Xonar DX, Multichannel
    Front speakers
...

Проблема именно в том, что звуковуху не видит только пульса, которую спавнит mpd. Пульса, запущенная руками (из-под любого пользователя) или заспавненная, к примеру, mplayer'ом, всё нормально определяет и воспроизводит (кроме RTP).

nbw ★★★
() автор топика
Последнее исправление: nbw (всего исправлений: 2)

Во-первых, добавь юзера в группу audio. Да, вообще так делать строго не рекомендуется, но конкретно в данном случае (принципиально «однопользовательский» хедлесс-сервер) всё нормально.

Во-вторых, loginctl enable-linger $USER и systemctl --user reenable pulseaudio от юзера.

В-третьих, autospawn = no в /etc/pulse/client.conf.

В-четвёртых, запускай mpd от того же юзера (пользовательским systemd-юнитом).

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от intelfx

добавь юзера в группу audio

Давно ужо

~% grep mpd /etc/group
audio:x:63:mpd
pulse-access:x:994:mpd
pulse:x:171:mpd
mpd:x:992:

loginctl enable-linger $USER и systemctl --user reenable pulseaudio от юзера.

Первое давно сделал, второе:

-bash-4.3$ systemctl --user reenable pulseaudio
Failed to get D-Bus connection: В соединении отказано
- привет от d-bus'а.

autospawn = no в /etc/pulse/client.conf.

Я, скорее всего, чего-то не понимаю, но как в таком случае будет запускаться pulseaudio?

запускай mpd от того же юзера (пользовательским systemd-юнитом).

Говорю же, «при запуске mpd (запускается дистрибутивным юнитом, работает из-под своего пользователя) ...» - всё так и есть

nbw ★★★
() автор топика
Последнее исправление: nbw (всего исправлений: 2)
Ответ на: комментарий от nbw

autospawn в /etc/pulse/client.conf — это автоматический запуск пульсодемона первым пульсоклиентом (никакой сокет-активации), в то время как я предлагаю запускать пульсу systemd-юнитом (пользовательским).

Так mpd запускается пользовательским юнитом или системным? Нужно пользовательским, потому что иначе не определён взаимный порядок открытия пульсосокета и запуска mpd.

intelfx ★★★★★
()
Ответ на: комментарий от nbw

-bash-4.3$ systemctl --user reenable pulseaudio
Failed to get D-Bus connection: В соединении отказано

Прелесть. Это ты залогинился в юзера по ssh?

systemctl status user@$UID
echo $DBUS_SESSION_BUS_ADDRESS
echo $XDG_RUNTIME_DIR
ls -l $XDG_RUNTIME_DIR/systemd
intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Так mpd запускается пользовательским юнитом или системным? Нужно пользовательским

Юнитом из состава дистрибутива

~# cat /usr/lib/systemd/system/mpd.service
[Unit]
Description=Music Player Daemon
After=network.target sound.target

[Service]
ExecStart=/usr/bin/mpd --no-daemon

# allow MPD to use real-time priority 50
LimitRTPRIO=50
LimitRTTIME=-1

[Install]
WantedBy=multi-user.target
, при этом процесс mpd выполняется от пользователя mpd.

Вчера ещё пробовал отключать автоспавн и делать юнит для пульсы - всё упёрлось в D-Bus, который пишет про отсутствующий X-сервер и всё портит (если точнее, пульса запускается, возвращает [судя по всему] ненулевой код [но работает], и по истечении 30 секунд после загрузки systemd рапортует, что запуск пользовательской сессии не удался и грохает её). Пробовал запускаться в graphical.target (судя по Xorg.0.log иксы нормально стартовали), d-bus начал писать про «No protocol specified» с вышеописанным исходом. Жопа какая-то, короче.

nbw ★★★
() автор топика
Последнее исправление: nbw (всего исправлений: 1)
Ответ на: комментарий от intelfx

Это ты залогинился в юзера по ssh?

Нет, это sudo -i -u mpd. При «чистом» логине:

~% ssh mpd@fe04
mpd@fe04's password: 
Last login: Wed Aug 19 00:03:43 2015 from 172.16.2.11
-bash-4.3$ systemctl --user reenable pulseaudio
Failed to get D-Bus connection: Нет такого файла или каталога
-bash-4.3$ systemctl status mpd@$UID
● mpd@998.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)
-bash-4.3$ echo $DBUS_SESSION_BUS_ADDRESS

-bash-4.3$ echo $XDG_RUNTIME_DIR
/run/user/998
-bash-4.3$ ls -l $XDG_RUNTIME_DIR/systemd
итого 0
srwxr-xr-x. 1 mpd mpd 0 авг 18 23:37 notify
srwxr-xr-x. 1 mpd mpd 0 авг 18 23:37 private
-bash-4.3$ 

nbw ★★★
() автор топика
Ответ на: комментарий от nbw

Failed to get D-Bus connection: В соединении отказано

Извиняюсь, что встреваю, но как по мне, отсутствие dbus в systemd это явно перебор. Там же на нем завязано дофига и больше. Может не настроен этот самый pam_systemd ?

Atlant ★★★★★
()
Ответ на: комментарий от Atlant

Извиняюсь, что встреваю

Ничего-ничего, присоединяйся, третьим будешь.

отсутствие dbus в systemd это явно перебор

А кто говорил про отсутствие? Тут речь идёт о том, что

Проблема именно в том, что звуковуху не видит только пульса, которую спавнит mpd. Пульса, запущенная руками (из-под любого пользователя) или заспавненная, к примеру, mplayer'ом, всё нормально определяет и воспроизводит.

Может не настроен этот самый pam_systemd?

Его что, ещё и настраивать надо после установки? О.о

nbw ★★★
() автор топика
Ответ на: комментарий от darkenshvein

на багтрекер писать?

Я пока не уверен, что всё делаю правильно. Пришёл за мыслями)

nbw ★★★
() автор топика
Ответ на: комментарий от nbw

по поводу pam_systemd у меня сложилось впечатление, то именно через него и запускается пользовательская сессия dbus. А судя по

systemctl --user reenable pulseaudio
Failed to get D-Bus connection: В соединении отказано

Дело именно в этом.

Atlant ★★★★★
()

Я уже почти посоветовал сделать не рекомендуемым, но рабочим способом — запускать PA на системном, а не на пользовательском уровне, добавив mpd в audio и pulse-access, но заметил, что «пульса не хотела слушать udp-порт». Чем PA мотивировала свое нежелание?

dexpl ★★★★★
()
Ответ на: комментарий от dexpl

Чем PA мотивировала свое нежелание?

Оно сказало: «Пускать меня в системном режиме настоятельнейше не рекомендуется из соображений бязопасности, и вообще, так делать ай-яй-яй. Но раз уж запустил, то я напрочь отказываюсь слушать сетевой сокет, поскольку через него может залезть злобная кака и сломать тебе, маленький глупый пользователь, всю систему».

nbw ★★★
() автор топика
Последнее исправление: nbw (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.