[alsa-devel] XRUN happens too often.

stan ghjeold_i_mwee at cox.net
Tue Apr 8 17:20:55 CEST 2008


Rong-Jhe wrote:
>  
>   
>> 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 ?
>
>   
I don't have a direct answer for you, but I have an application that seems
to be able to write data using writei with no problems at rates up to
192 KHz.  You can download it from sourceforge and look at the source.

http://sourceforge.net/projects/discord/ 

I copied and adapted from other examples on the web.  Do a search for 
alsa in
the source code and it should take you to the initialization function 
and the
playing function.


More information about the Alsa-devel mailing list