snd_pcm_uframes_t size)
{
snd_pcm_uframes_t xfer = size;
- int res;
+ assert(snd_pcm_mmap_playback_avail(pcm) >= size);
while (size > 0) {
const snd_pcm_channel_area_t *pcm_areas;
snd_pcm_uframes_t pcm_offset;
snd_pcm_uframes_t frames = size;
snd_pcm_mmap_begin(pcm, &pcm_areas, &pcm_offset, &frames);
- if (frames > 0)
- snd_pcm_areas_copy(pcm_areas, pcm_offset,
- areas, offset,
- pcm->channels,
- frames, pcm->format);
+ snd_pcm_areas_copy(pcm_areas, pcm_offset,
+ areas, offset,
+ pcm->channels,
+ frames, pcm->format);
snd_pcm_mmap_commit(pcm, pcm_offset, frames);
- if (frames == 0) {
- if (pcm->mode & SND_PCM_NONBLOCK)
- return xfer;
- if ((res = snd_pcm_wait(pcm, -1)) < 0)
- return xfer > 0 ? xfer : res;
- } else {
- offset += frames;
- size -= frames;
- }
+ offset += frames;
+ size -= frames;
}
return xfer;
}
snd_pcm_uframes_t size)
{
snd_pcm_uframes_t xfer = size;
- int res;
+ assert(snd_pcm_mmap_capture_avail(pcm) >= size);
while (size > 0) {
const snd_pcm_channel_area_t *pcm_areas;
snd_pcm_uframes_t pcm_offset;
snd_pcm_uframes_t frames = size;
snd_pcm_mmap_begin(pcm, &pcm_areas, &pcm_offset, &frames);
- if (frames > 0)
- snd_pcm_areas_copy(areas, offset,
- pcm_areas, pcm_offset,
- pcm->channels,
- frames, pcm->format);
+ snd_pcm_areas_copy(areas, offset,
+ pcm_areas, pcm_offset,
+ pcm->channels,
+ frames, pcm->format);
snd_pcm_mmap_commit(pcm, pcm_offset, frames);
- if (frames == 0) {
- if (pcm->mode & SND_PCM_NONBLOCK)
- return xfer;
- if ((res = snd_pcm_wait(pcm, -1)) < 0)
- return xfer > 0 ? xfer : res;
- } else {
- offset += frames;
- size -= frames;
- }
+ offset += frames;
+ size -= frames;
}
return xfer;
}