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