[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