понедельник, 19 декабря 2016 г.

Avahi pulseaudio dlna

Требуется подключить акустику к некоторому устройству в сети с linux на борту.
В данном случае Arch, а значит конфигурация стандартная, как и задумано разработчиками ПО.

Для начала ставим необходимые пакеты:
pacman -S nss-mdns avahi  pulseaudio pulseaudio-zeroconf alsa sox

sox для удобства запуска воспроизведения, так же это можно делать через pacmd
Что бы всё взлетело удалённо добавляем пользователя в группу:
usermod -a -G audio youruser

Запускаем и проверяем:
pulseaudio -D
play some_file.wav
Если всё хорошо, вы должны услышать воспроизводимый файл.

Теперь pulseaudio должен научиться работать по сети и публиковать информацию через zeroconf.
Для этого редактируем файл /etc/pulse/default.pa:
load-module module-native-protocol-tcp auth-ip-acl=192.168.0.0/24 auth-anonymous=1
load-module module-zeroconf-publish

Тем самым мы позволяем пользователям домашней сети стримить аудио на устройство.

На клиентах тоже следует разрешить zeroconf ­— в том же файле:
load-module module-zeroconf-discover

Далее всё это нужно повесить на автозагрузку.

В arch для pulse указан домашний каталог /var/run/pulse, что вполне верно. Только его там нет и это tmpfs (создавать руками бесполезно), поэтому воспользуемся tmpfile.d
Создаём файл /usr/lib/tmpfiles.d/pulse.confс содержимым:
D /var/run/pulse 0775 pulse pulse

Так же создадим демона на systemd (/etc/systemd/system/pulseaudio.service):
[Unit]
Description=Pulseaudio sound server
After=avahi-daemon.service network.target

[Service]
#Type=dbus
#BusName=org.pulseaudio.Server
User=pulse
ExecStart=/usr/bin/pulseaudio --log-target=journal
ExecReload=/usr/bin/pulseaudio --kill
Restart=always
RestartSeq=3sec

[Install]
WantedBy=multi-user.target

Теперь avahi - об этом ни кто не пишет, но без конфигурации сервиса чуда не происходит. А именно нужно создать файл  /etc/avahi/services/pulseaudio.service:

<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">

<service-group>

  <name replace-wildcards="yes">%h</name>

  <service>
    <type>_pulse-server._tcp</type>
    <port>695</port>
  </service>

</service-group>

Порт можно подсмотреть через
netstat -tulpn | grep pulse
 
В файле /etc/nsswitch.conf в конце строки hosts добавить mdns.

У меня используется исключительно ipv6 в связи с этим моя строка выглядит так:
hosts: files mymachines resolve [!UNAVAIL=return] dns myhostname mdns6

В /etc/avahi/avahi-daemon.conf ipv4 так же отключен.
При использовании 4 и 6 ревизий устройства будут дублироваться.

Всё это неплохо бы обвязать DLNA.
В данном необходим media render, его роль может выполнить mdp, но он не умеет искаробки и для этого ещё нужен upmpdcli

Для него тоже нужен домашний каталог Создаём /etc/tmpfiles.d/upmpdcli.conf
D /run/upmpdcli 0775 upmpdcli upmpdcli
(не забудьте прописать в /etc/passwd)

И в заключении как обычно включаем:

systemctl enable avahi
systemctl start avahi

systemctl enable pulseaudio
systemctl start pulseaudio