In short here it is:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
docker run --rm -ti \ | |
--device=/dev/snd/controlC0 --device=/dev/snd/pcmC0D0p --device=/dev/sndpcmC0D1p --device=/dev/snd/timer \ | |
-p 4713:4713 \ | |
rpi-deb-pulse \ | |
/bin/bash -c "groupadd --gid $(ls -l /dev/snd/controlC0 | cut -d' ' -f4 | xargs getent group | cut -d: -f3) alsadev \ | |
&& gpasswd -a pulse alsadev \ | |
&& pulseaudio --system --high-priority --no-cpu-limit -v \ | |
-L 'module-alsa-sink device=hw:0,0' \ | |
-L 'module-native-protocol-tcp auth-ip-acl=10.2.0.0/24'" |
Now everything one by one:
- docker run --rm -ti - run non-persistent docker and prepare it as interactive (shell) run
- --device=.... make local sound devices available in container. This feature is quite new in docker, so make sure you have recent version (mine is 1.8)
- -p 4713:4713 set up port forwarding between host and container to make pulse server available to clients
- rpi-deb-pulse is my docker image built from armbuild/debian by running system upgrade and install pulseaudio
- /bin/bash -c "..." is command to run inside container, more on this below
- groupadd --gid $(...) alsadev create a group inside container named alsadev and having same id as group of /dev/snd/controlC0 device. We need this to allow pulse to access native alsa devices.
- $(ls -l /dev/snd/controlC0 | cut -d' ' -f4 | xargs getent group | cut -d: -f3) this subshell is executed on host, not in container and prints group id of /dev/snd/controlC0
- gpasswd -a pulse alsadev adds user pulse to our new group alsadev
- pulseaudio ... run pulseaudio
- -L 'module-alsa-sink device=hw:0,0' explicitly load alsa sink and specify which output to use
- -L 'module-native-protocol-tcp auth-ip-acl=10.2.0.0/24' load tcp protocol listener and (optionally) configure ip-acl to only accept connections from given subnet
How to then use it to play sound remotely (client):
- pactl load-module module-tunnel-sink server=10.2.0.1
- in pavucontrol on Playback tab select desired sink for a stream
Things to improve:
- list of devices may be replaced with another subshell to not specify each dev manually
- add systemd unit to start container automatically
- tune pulseaudio since sound over tcp tunnel is worse then playing locally
Why was this done :)
I have a Raspberry Pi 2 acting as a wireless router and i didn't wont to install pulse into host system. And i was just curious about whether this will work :)
No comments:
Post a Comment