My simple understanding is that in the Linux audio stack you have the following layers:
- kernel-driver for local sound devices (provides exclusive access, no mixing/multiplexing).
- application-level audio-frameworks/APIs which are device-agnostic (pulse, ALSA, jack), can support, mix and multiplex multiple concurrent streams/applications.
- these different application-level frameworks can have several different back ends (for real HW, BT, virtual devices, network targets, etc, other Linux application-level audio-frameworks. )
(Someone correct me if I’m wrong)
Applications target a framework, but not all target the same, so the frameworks needs to be able to “plug together” so the speak.
This leaves the possibility if the following scenario:
App written for ALSA -> ALSA -> ALSA’s Pulseaudio backend -> PulseAudio -> Real hardware
PulseAudio in particular is very featured, modular and pluggable which is why most desktops Linux distros uses this by default these days.
It supports things like transparent network streaming between various kinds of targets and lets you compose “audio graphs” if need to.
And that’s probably why it was chosen for the experiment in this blog post.