OSDN Git Service

check the current pcm status in snd_pcm_read/write_areas() if
authorTakashi Iwai <tiwai@suse.de>
Thu, 27 Mar 2003 09:10:22 +0000 (09:10 +0000)
committerTakashi Iwai <tiwai@suse.de>
Thu, 27 Mar 2003 09:10:22 +0000 (09:10 +0000)
snd_pcm_wait() returns an error.  this will fix the bogus
return code of snd_pcm_readi/writei().

src/pcm/pcm.c

index b133d78..b7ec267 100644 (file)
@@ -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;
                        
                }