Problem :
As in the title.
Is it possible without setting up a system-wide pulse server to mix audio output from multiple processes owned by different users on Linux? I have no trouble mixing audio when all the processes are owned by the same user, but as soon as I attempt using sound in processes owned by different users (specifically, mpd and the currently logged-in user’s programs), it goes to first-come, first-served. Whichever user grabs the soundcard first gets access, and any other user’s processes wait until it is released.
Solution :
I managed to share an user-mode pulse server among local users via TCP.
Edit /etc/pulse/default.pa
to enable the TCP module. I basically disabled auth to simplify configuration. Note there may be security implications if you aren’t the only one using the computer.
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1 auth-anonymous=1
Restart PulseAudio, if you are using systemd, this can be done with systemctl --user restart pulseaudio
.
Note that if there are already multiple PulseAudio servers running, you may need to stop them. Otherwise only the one that started first works.
Now PulseAudio should be listening on a TCP port, this can be verified with the command ss -ltp
. You’ll probably see something like this:
LISTEN 0 0 *:4713 *:*
users:(("pulseaudio",pid=3130,fd=31))
which indicates that PulseAudio is listening on the port 4713.
To configure clients, edit /etc/pulse/client.conf
and enable auto connection:
auto-connect-localhost = yes
This is disabled by default on newer versions of PulseAudio for security reasons.
Next try playing some audio, cheers!
For me on Debian 9 it was like this:
# add all your users to the audio group
usermod -aG audio user1
usermod -aG audio user2
usermod -aG audio user3
# pulseaudio config:
# remove old per-user configs
rm -rf /home/*/.config/pulse/
# common client config
echo '
auto-connect-localhost = yes
' >> /etc/pulse/client.conf
# common server config - only the first one get started on login
echo '
load-module module-native-protocol-tcp listen=127.0.0.1 auth-ip-acl=127.0.0.1 auth-anonymous=1
' >> /etc/pulse/default.pa
Then restart, login, check:
ps aux | grep pulseaudio
# should be sth
netstat -ltunp | grep pulseaudio
# should be sth
# play sample file
cvlc 'https://file-examples.com/wp-content/uploads/2017/11/file_example_OOG_1MG.ogg'
put this on your ~/.pulse/default.pa
of the current user running X
.include /etc/pulse/default.pa
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1
Then restart pulseaudio with pulseaudio -k;pulseaudio -D
And then put this on all other users ~/.pulse/client.conf
default-server = 127.0.0.1
I initially learned about it at http://billauer.co.il/blog/2014/01/pa-multiple-users/, and tweaked it a bit (the include line)
working on ubuntu 20.04
mixed 2 musics from different users