[alsa-devel] Playing multiple sounds at the same time

Andreas Falkenhahn andreas at airsoftsoftwair.de
Fri Apr 30 14:36:39 CEST 2010


> On Fri, Apr 30, 2010 at 12:38:49PM +0200, Andreas Falkenhahn wrote:
>
>> Now I want to play sounds 1 to 3 at the same time. My question is now:
>> Can
>> ALSA do automatic mixing for me here or do I have to do the mixing on my
>> own? In other words, can I simply feed all these three sound streams to
>> ALSA or do I have to mix them into a fourth audio stream first and
>> feeding
>> this new fourth stream to ALSA then?
>
> The easiest thing for your application is to just open and play multiple
> audio streams and allow a system mixing daemon such as PulseAudio to
> take care of the mixing.

Thanks, that sounds easy enough.

I have some more questions... I hope I don't annoy anyone but the API
documentation of ALSA is extremely brief and the tutorials I was able to
find via Google only deal with the most simple case, i.e. just playing a
stream and exiting.

So before I start implementing my sound backend in a totally wrong way,
I'd be thankful if one of the experts here could tell me if it could be
done like I'm planning it or not.

So here's my proposed implementation for playing multiple sounds at the
same time with ALSA:

1) Launch a new thread that will now act as my sound manager

2) For each new sound to be played, call snd_pcm_open() with mode set to
SND_PCM_NONBLOCK. Then set the parameters on this stream to match the
format of the sound to be played.

3) Now loop over all sounds currently playing and consecutively feed data
to their respective PCM streams using calls to snd_pcm_writei(). Check the
return value of snd_pcm_writei() to see how many frames could be written
to the stream, then feed the rest until there is no more data left or feed
again from the beginning in case the sound should be looped.

Well, this would be the outline of my planned implementation. Could it be
done this way or is there a better way?

Thanks,

Andreas


More information about the Alsa-devel mailing list