[alsa-devel] Vanilla Blocked I/O probs

Takashi Iwai tiwai at suse.de
Tue Apr 3 16:24:35 CEST 2007


At Tue, 03 Apr 2007 15:19:01 +0100,
Gordon Miller wrote:
> 
> Thanks Takashi
> 
> I went for this :
> 
> /*******************************************************/
> void
> record_block (void *buffer)
> {
>   int rc, needed = MAX_LEN;
>   void *buf_ptr = buffer;
> 
>   do
>   {
>     rc = snd_pcm_readi (handle, buf_ptr, needed);
>     needed -= rc;
>     buf_ptr += rc * (stereo_channel ? BPSSTEREO : BPSMONO);
>   }
>   while (needed);
> 
> }                               /* end record_block */
> /****************************************************/
> 
> I have a global variable "stereo_channel" as you see that is 0 (mono), 1 
> (stereo left only) or 2 (stereo right only). If it is non-zero I 
> multiply by BPSSTEREO (4) else BPSMONO (2). So "needed" counts down to 
> 0, and buf_ptr moves along.
> 
> It's not pretty, but it works !

Repeating read is indeed a correct implementation.  (It should be so
even for normal file reads.)

But I'd suggest to check the return value of snd_pcm_readi() whether
it's zero or negative.


Takashi


More information about the Alsa-devel mailing list