From 2978d1832335a8e42f6d3305eac111073d0dd00b Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Thu, 27 Mar 2003 09:10:22 +0000 Subject: [PATCH] check the current pcm status in snd_pcm_read/write_areas() if snd_pcm_wait() returns an error. this will fix the bogus return code of snd_pcm_readi/writei(). --- src/pcm/pcm.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/pcm/pcm.c b/src/pcm/pcm.c index b133d78b..b7ec2670 100644 --- a/src/pcm/pcm.c +++ b/src/pcm/pcm.c @@ -6110,9 +6110,15 @@ snd_pcm_sframes_t snd_pcm_read_areas(snd_pcm_t *pcm, const snd_pcm_channel_area_ } err = snd_pcm_wait(pcm, -1); - if (err < 0) - break; state = snd_pcm_state(pcm); + if (err < 0) { + /* check more precisely */ + if (state == SND_PCM_STATE_XRUN) + err = -EPIPE; + else if (state == SND_PCM_STATE_SUSPENDED) + err = -ESTRPIPE; + break; + } goto _again; } @@ -6183,9 +6189,15 @@ snd_pcm_sframes_t snd_pcm_write_areas(snd_pcm_t *pcm, const snd_pcm_channel_area } err = snd_pcm_wait(pcm, -1); - if (err < 0) - break; state = snd_pcm_state(pcm); + if (err < 0) { + /* check more precisely */ + if (state == SND_PCM_STATE_XRUN) + err = -EPIPE; + else if (state == SND_PCM_STATE_SUSPENDED) + err = -ESTRPIPE; + break; + } goto _again; } -- 2.47.1