I am playing a single channel audio in non-interleaved mode. I am getting underrun when I am writing aduio data into speaker : ALSA lib pcm.c:7339:(snd_pcm_recover) underrun occurred
Here is how I write:
printf("%d",snd_pcm_avail (spkhandle)); ret = snd_pcm_writen(spkhandle, pSpeakerBuf , framesIn18Millisec); if(ret < 0) { snd_pcm_recover(spkhandle, ret, 0); } What are the different ways/parameter configurations to prevent ALSA under run ?
(I am using Linux 3.0, ARM )
Edit: Here is a buffer measurement using snd_pcm_avail() API
snd_pcm_avail = 2304 << snd_pcm_writen call 1 success snd_pcm_avail = 2160 << snd_pcm_writen call 2 success snd_pcm_avail = 2016 << snd_pcm_writen call 3 success snd_pcm_writen error -32 Broken pipe << snd_pcm_writen call 4 failure ALSA lib pcm.c:7339:(snd_pcm_recover) underrun occurred << And displays this message Here is the output that Marko requested for:
snd_output_t* out; .... // Do alsa parameters init .... .... snd_output_stdio_attach(&out, stderr, 0); snd_pcm_dump_sw_setup(spkhandle, out); tstamp_mode : NONE period_step : 1 avail_min : 144 period_event : 0 start_threshold : 288 stop_threshold : 2304 silence_threshold: 0 silence_size : 0 boundary : 1207959552