[alsa-devel] XRUN happens too often.

Rong-Jhe r93922118 at ntu.edu.tw
Tue Apr 8 13:40:54 CEST 2008


 
> A sample in 16-bit, two channels is 4 bytes.
> I allocate a audio data of 9408x4=37632 bytes.
> 
> audio_data=malloc(buffer_size*4);
> 
> This audio_data buffer will receive audio data from the network.
> If this buffer is full, I use snd_pcm_writei( ) to put the buffer into the 
pcm.
> 
> snd_pcm_sframes_t frames;
> snd_pcm_t *handle;
> 
> while((frame=snd_pcm_writei(handle, audio_data, buffer_size))<0)
> {
>    if(frames==-EPIPE)
>       snd_pcm_prepare(handle);
>    else
>       printf("snd_pcm_writei error %d\n", frames);
> }
> 
> The codes states that I put the entire buffer into the pcm at each time. The 
> pcm use 10 periods to perform this buffer. The program can work normally.
> 
> If the sampling rate is changed, the program will encounter XRUN frequently.
> 
> The follows are the parameters that I read from the pcm after setting 
sampling 
> rate to 48000.
> sampling rate = 48000 bps
> period time = 21333 us
> period size = 1024 frames
> buffer time = 213330 us
> buffer size = 10240 frames
> audio_data=malloc(buffer_size*4); //10240x4=40960
> 
> I also put the entire buffer into the pcm at each time, but snd_pcm_writei( )
> will return -PIPE frequently.
> 
> What is the problem?
> 
----------------------------------------------------------
I use snd_pcm_avail_update( ) to show the number of frames that can write into 
the pcm before using snd_pcm_writei( ).
I found that sometimes snd_pcm_avail_update( ) will return more than buffer 
size.
EX. buffer size = 10240, sometimes snd_pcm_avail_update( ) 10274 > 10240.
Dose this cause XRUN?
How to improve it ?





More information about the Alsa-devel mailing list