From: Jaroslav Kysela Date: Tue, 9 Apr 2019 07:14:33 +0000 (+0200) Subject: pcm: fix wait condition in snd_pcm_write_areas() to avoid return zero X-Git-Tag: v1.1.9~11 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=c7fc3fdbe23e63757b0e2c88c0d7c029c660923b;p=alsa-lib.git pcm: fix wait condition in snd_pcm_write_areas() to avoid return zero The hw_ptr might be updated during the snd_pcm_may_wait_for_avail_min() call, so even if it returns zero (OK), the avail must be updated again. Signed-off-by: Jaroslav Kysela --- diff --git a/src/pcm/pcm.c b/src/pcm/pcm.c index 11aec805..f0dc28d3 100644 --- a/src/pcm/pcm.c +++ b/src/pcm/pcm.c @@ -7389,18 +7389,27 @@ snd_pcm_sframes_t snd_pcm_write_areas(snd_pcm_t *pcm, const snd_pcm_channel_area err = avail; goto _end; } - if ((state == SND_PCM_STATE_RUNNING && - size > (snd_pcm_uframes_t)avail && - snd_pcm_may_wait_for_avail_min(pcm, avail))) { - if (pcm->mode & SND_PCM_NONBLOCK) { - err = -EAGAIN; + if (state == SND_PCM_STATE_RUNNING && + size > (snd_pcm_uframes_t)avail) { + if (snd_pcm_may_wait_for_avail_min(pcm, avail)) { + if (pcm->mode & SND_PCM_NONBLOCK) { + err = -EAGAIN; + goto _end; + } + + err = snd_pcm_wait_nocheck(pcm, -1); + if (err < 0) + break; + goto _again; + } + /* the snd_pcm_may_wait_for_avail_min may check against the + * updated hw.ptr (slaves), get the avail again here + */ + avail = __snd_pcm_avail_update(pcm); + if (avail < 0) { + err = avail; goto _end; } - - err = snd_pcm_wait_nocheck(pcm, -1); - if (err < 0) - break; - goto _again; } frames = size; if (frames > (snd_pcm_uframes_t) avail)