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.