Featured image of post PulseAudio по TCP

PulseAudio по TCP

Передаём звук с динамиков используя PulseAudio по сети

Введение

PulseAudio – звуковой сервер, в моём понимании. Выполняется на любом Linux ПК. Микрофоны, динамики, виртуальные устройства - всё идёт через PulseAudio и им контролируется.

Задача

Есть сервачок, который подключён к настенному телевизору. Работаю я на ПК с Manjaro и наушники, прямо скажем, не очень. Для работы - сгодится. Хочется слушать музыку, но чтобы телевизор проигрывал это у себя.

Источники

  1. Arch Wiki PulseAudio Examples
  2. Статья Joao Paulo Silva de Souza на Medium
  3. Хороший ответ на Unix Overflow
  4. И ещё один

Решение

Трафик будет передаваться по TCP с ПК на сервер (для простоты буду просто называть его в тексте ТВ, но по факту это сервер на Manjaro).

И там, и там ставим модуль Zeroconf, чтобы компы друг друга находили без проблем.

1
yay -S pulseaudio-zeroconf

Теперь, возьмём cookie файл с одного и скопируем на второй, чтобы были одинаковые. Я нашёл у себя на ПК в домашнем каталоге у пользователя.

1
2
scp ~/.config/pulse/cookie server:/etc/pulse/cookie
sudo cp -f ~/.config/pulse/cookie /etc/pulse/cookie

А теперь настраиваем:

  1. ТВ будет PulseAudio сервером, потому что он принимает аудио поток
  2. ПК будет PulseAudio клиентом, потому что он отдаёт поток

На ТВ - выполняем от имени обычного пользователя, потому что pulseaudio --kill/--start от рута не нужно запускать.

1
2
3
4
5
6
7
8
9
SUBNET='192.168.0.0/24'
sudo mkdir -p /etc/pulse/default.pa.d/
cat <<EOF | sudo tee /etc/pulse/default.pa.d/zeroconf.pa
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;${SUBNET}
load-module module-zeroconf-publish
EOF
sudo systemctl enable --now avahi-daemon.service
pulseaudio --kill
pulseaudio --start

На ПК то же самое почти.

1
2
3
4
5
6
7
8
9
SUBNET='192.168.0.0/24'
sudo mkdir -p /etc/pulse/default.pa.d/
cat <<EOF | sudo tee /etc/pulse/default.pa.d/zeroconf.pa
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;${SUBNET}
load-module module-zeroconf-discover
EOF
sudo systemctl enable --now avahi-daemon.service
pulseaudio --kill
pulseaudio --start

Вот и всё. Теперь в pavucontrol можно какое-то приложение направить по туннелю до ПК!

Pavucontrol в котором Chrome вещает прямо на ТВ через HDMI сервера

Бонус, который не работает

Что хочется дальше? Правильно, то что совсем не пригодиться, но интересно. Хочется чтобы и ПК, и ТВ проигрывали один и тот же поток.

На ПК посмотрим какие у нас есть outputы и получим их имена.

1
2
3
4
5
# pacmd list-sinks | grep name:
name: <alsa_output.pci-0000_00_1b.0.analog-stereo>
name: <tunnel.aurelius.local.auto_null>
name: <tunnel.aurelius.local.auto_null.2>
name: <tunnel.aurelius.local.alsa_output.pci-0000_00_0e.0.hdmi-stereo>

Вот и видно, что первый, похоже, наушники, а остальное прилетело по сети. 2-й и 3-й скорее всего задний и фронтальный выходы на корпусе, а последний явно HDMI компьютера - то что нужно. Объединить, значится, нужно 1-й и 4-й.

Всё там же на ПК

1
2
3
4
5
6
7
8
9
SLAVE_1='alsa_output.pci-0000_00_1b.0.analog-stereo'
SLAVE_2='tunnel.aurelius.local.alsa_output.pci-0000_00_0e.0.hdmi-stereo'
DEFAULT_SLAVE="$SLAVE_1"
cat <<EOF | sudo tee -a /etc/pulse/default.pa.d/zeroconf.pa
load-module module-combine-sink sink_name=combined sink_properties="device.description='Combined TV and PC' slaves=${SLAVE_1},${SLAVE_2}"
set-default-sink ${DEFAULT_SLAVE}
EOF
pulseaudio --kill
pulseaudio --start

Вот и всё 😄 … Вот только не работает. Не знаю почему. Устройство-то добавилось, выбрать можно, ошибок в журнале нет, но звук идёт только в наушники и не идёт на ТВ. В то же время, просто выбираю ТВ - работает. Значит просто этот модуль не может совместить туннельное и простое устройство. Решил всё равно написать, может кому пригодиться.

Licensed under Apache License, Version 2.0
Обновлено Dec 01, 2023 14:46 +0200
All rights reserved
Создано при помощи Hugo
Тема Stack, дизайн Jimmy