+int pcm_read_frames(pcm_reader_t *r, void *data, unsigned nframes)
+{
+ int n;
+ unsigned count = 0;
+ uint8_t *bp = data;
+ unsigned bpf = pcm_get_format(r)->bytes_per_frame;
+
+ do {
+ n = r->vtbl->read_frames(r, bp, nframes - count);
+ if (n > 0) {
+ count += n;
+ bp += n * bpf;
+ }
+ } while (n > 0 && count < nframes);
+ return count;
+}
+