sound server

Mike Hearn mike at navi.cx
Fri Oct 29 14:42:52 UTC 2004


> Do we have any comments on the sound server topic from a broader
> perspective than only GNOME?
> 
> A competing proposal I've heard is to just use ALSA directly.

I've got some notes on how to get hardware accelerated/network 
transparent mixing sorted out with minimal effort, which unfortunately I 
don't have here. I could post them in a few days, hopefully.

Basically:

- Write an alsa-lib plugin that by default just forwards the audio to
   the slave device (ie, is a no-op) but when a magic environment
   variable is set or whatever takes the audio and writes it to a
   socket created somewhere with the name == pid of process, ie

      /tmp/audio-mike/12345

   The alsa-lib configuration format allows passing environment vars
   as plugin parameters, ie it's all quite flexible with minimal policy
   hardcoded.

   Typically therefore you'd have the following alsalib plugin pipeline:

      default -> as-yet-unnamed-plugin -> [dmix] -> plughw:0,0

- Have a simple GStreamer app that monitors $MAGIC_DIRECTORY and
   when a new socket appears that is readable, connect to it and
   start downloading the audio direct from the app. You can then
   feed it via any GST pipeline you like; ie:

      fdsrc ! vorbisenc ! oggmux ! tcpsink

   (dunno the exact plugin names). Net result is sound-server policy
   is very flexible: you can have a dedicated "connect to me" style
   server or you can stream it via SSH or via X, or you can forward
   audio on a case-by-case basis.

- The key point is that in the common case of no network transparency
   you can take advantage of dmix mixing (so instant interop with all
   other ALSA supporting apps and OSS apps via the alsa LD_PRELOAD
   wrapper), and in the case of having a sound card that doesn't suck
   you can use hardware accelerated mixing/resampling as ALSA supports
   this natively.

- One issue I haven't considered is syncing with X, because I don't
   know anything about that. How often do people play movies over a
   remote X connection anyway?


The main catch is that it doesn't exist, I just made it up. Somebody 
would have to learn ALSA plugin programming then write 
as-yet-unnamed-plugin.  I don't have time, sorry :(

The other major catch is that obviously it's not portable. To be frank I 
don't care about this whatsoever - IMHO audio 
mixing/resampling/network-transparency is *not* a desktop level problem, 
it's an operating system level problem. If the sound system of other 
operating systems don't support automatic software mixing or network 
transparency then too bad. However I suspect a proposal based on 
leveraging ALSA would go down like a ton of bricks in most portable 
desktop projects. There's nothing inherantly unportable about the ALSA 
API, but people would still object.

Final catch: in Fedora Core 2 at least ALSA support still seems a bit 
buggy. I found running XMMS for long periods with the ALSA plugin caused 
a huge memory leak, and also after playing music for a while noise and 
corruption started leaking into the audio.

Here is the ALSA dmix bug:

http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=130593

thanks -mike




More information about the devel mailing list