[alsa-devel] error in recovery from buffer under-run.

Ashlesha Shintre ashlesha.shintre at gmail.com
Wed May 2 17:54:03 CEST 2007


I should have also included the program output pasted below, in my previous
email:

frames returned is 1359
> 1359 frames written
> frames returned is -32
> ALSA lib pcm.c:7073:(snd_pcm_recover) underrun occured
> recover returned 0
> 0 frames written
> frames returned is 1359
> 1359 frames written
> frames returned is -32
> ALSA lib pcm.c:7073:(snd_pcm_recover) underrun occured
> recover returned 0
> 0 frames written


Apologies for the same,
Regards,
Ashlesha.


On 02/05/07, Ashlesha Shintre <ashlesha.shintre at gmail.com> wrote:
>
> Hi,
>
> Thanks for the link you emailed earlier.  I tried writing my own code,
> based on the how to in the alsa wiki.  I have attached that code with this
> email.
>
> The problem it faces is a buffer underrun every alternate time, i try
> writing to the device.
>
> In my code, to take care of underruns, I do the following:
>
> period_size=64;
> buffer is a short int array which is 16000 in length.
> every alternate call to snd_pcm_writei is successful but only write in the
> vicinity of 1350 frames, instead of size which is initialised to length of
> buffer.
>
> Now, in the code below, the snd_pcm_recover function prints a message
> indicating a buffer under-run has occured, however, it returns a 0,
> indicating success in recovery from the error!
>
> I am not sure how to deal with this -- is there a problem with my ALSA
> libraries?
> Sorry about the length of this email and thanks again,
>
> Ashlesha.
>
> while(size>(2*period_size))
> > {
> > frames = snd_pcm_writei (pcm_handle, buffer, size);
> > printf("frames returned is %d\n",frames);
> > if (frames>0)
> >     temp=frames;
> > if (frames ==  -32){
> >           frames = snd_pcm_recover(pcm_handle, frames, 0);
> >           printf("recover returned %d\n",frames);
> >           }
> > if (frames < 0){
> >           printf("snd_pcm_writei failed: %s\n", snd_strerror(frames));
> >           return -1;
> >           }
> > printf("%d frames written\n",frames);
> > if(temp>0)
> >     size=size-temp;
> > }
> >
>
>


More information about the Alsa-devel mailing list