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