[alsa-devel] Play multiple sounds concurrently
Hey,
I want to play multiple sounds concurrently with ALSA. The audio data is mono and G.711 a-law encoded. I can successfully play a single source of audio data but the sound is distorted when I try to play two sources.
Basically, this is what I'm doing:
-----8<----------------- char buf1[1024]; // filled with audio data from source 1 char buf2[1024]; // filled with audio data from source 2 char wr_buf[1024];
for (int count = 0; count < 1024; count++) wr_buf[count] = (char) (0.5 * buf1[count]) + (char) (0.5 * buf2[count]);
snd_pcm_writei(dev_handle, wr_buf, 1024); -----8<-----------------
I think I have to use a scale value to correct the values or else clipping occures. However, this is the problem. How do I have to modify the audio bytes in order to add them together and write them into one buffer?
greetings.. ..Markus
Markus Luttenberger wrote:
I want to play multiple sounds concurrently with ALSA. The audio data is mono and G.711 a-law encoded. I can successfully play a single source of audio data but the sound is distorted when I try to play two sources.
wr_buf[count] = (char) (0.5 * buf1[count]) + (char) (0.5 * buf2[count]);
A-law is a somewhat logarithmic encoding; simply adding two values with linear scale factors will not work.
If both your source data and the output device use A-law, you have to decode the samples to linear PCM, add them, and encode them back. See http://git.alsa-project.org/?p=alsa-lib.git;a=blob;f=src/pcm/pcm_alaw.c;hb=HEAD for the algorithm that alsa-lib uses; you would use something like buf[] = s16_to_alaw((alaw_to_s16(buf1[]) + alaw_to_s16(buf2[])) / 2);
If it is possible for your output device to use a linear PCM format, you might want to use that to avoid the additional encoding step.
HTH Clemens
participants (2)
-
Clemens Ladisch
-
Markus Luttenberger