]> git.alsa-project.org Git - alsa-lib.git/commitdiff
fixed the handling of EINTR in read/write.
authorTakashi Iwai <tiwai@suse.de>
Thu, 15 Apr 2004 12:22:26 +0000 (12:22 +0000)
committerTakashi Iwai <tiwai@suse.de>
Thu, 15 Apr 2004 12:22:26 +0000 (12:22 +0000)
EINTR can be returned during ACPI suspend/resume.

src/pcm/pcm.c
src/pcm/pcm_hw.c
src/pcm/pcm_local.h

index 9befa900f6aecd7a0bdf0847b6d237379668d5cb..1de19212daffa6c18ef84684e1b2c2b81f488f82 100644 (file)
@@ -6066,7 +6066,7 @@ snd_pcm_sframes_t snd_pcm_read_areas(snd_pcm_t *pcm, const snd_pcm_channel_area_
                xfer += frames;
        }
  _end:
-       return xfer > 0 ? (snd_pcm_sframes_t) xfer : err;
+       return xfer > 0 ? (snd_pcm_sframes_t) xfer : snd_pcm_check_error(pcm, err);
 }
 
 snd_pcm_sframes_t snd_pcm_write_areas(snd_pcm_t *pcm, const snd_pcm_channel_area_t *areas,
@@ -6149,7 +6149,7 @@ snd_pcm_sframes_t snd_pcm_write_areas(snd_pcm_t *pcm, const snd_pcm_channel_area
                }
        }
  _end:
-       return xfer > 0 ? (snd_pcm_sframes_t) xfer : err;
+       return xfer > 0 ? (snd_pcm_sframes_t) xfer : snd_pcm_check_error(pcm, err);
 }
 
 snd_pcm_uframes_t _snd_pcm_mmap_hw_ptr(snd_pcm_t *pcm)
index de269290715abe643a44216379cae3611feb343f..25395dbfd80bd65c7298a9c0248b175f5c077014 100644 (file)
@@ -612,7 +612,7 @@ static snd_pcm_sframes_t snd_pcm_hw_writei(snd_pcm_t *pcm, const void *buffer, s
        fprintf(stderr, "hw_writei: frames = %li, result = %i, result = %li\n", size, result, xferi.result);
 #endif
        if (result < 0)
-               return err;
+               return snd_pcm_check_error(pcm, err);
        return xferi.result;
 }
 
@@ -630,7 +630,7 @@ static snd_pcm_sframes_t snd_pcm_hw_writen(snd_pcm_t *pcm, void **bufs, snd_pcm_
        fprintf(stderr, "hw_writen: frames = %li, result = %i, result = %li\n", size, result, xfern.result);
 #endif
        if (result < 0)
-               return err;
+               return snd_pcm_check_error(pcm, err);
        return xfern.result;
 }
 
@@ -648,7 +648,7 @@ static snd_pcm_sframes_t snd_pcm_hw_readi(snd_pcm_t *pcm, void *buffer, snd_pcm_
        fprintf(stderr, "hw_readi: frames = %li, result = %i, result = %li\n", size, result, xferi.result);
 #endif
        if (result < 0)
-               return err;
+               return snd_pcm_check_error(pcm, err);
        UPDATE_SHADOW_PTR(hw);
        return xferi.result;
 }
@@ -667,7 +667,7 @@ static snd_pcm_sframes_t snd_pcm_hw_readn(snd_pcm_t *pcm, void **bufs, snd_pcm_u
        fprintf(stderr, "hw_readn: frames = %li, result = %i, result = %li\n", size, result, xfern.result);
 #endif
        if (result < 0)
-               return err;
+               return snd_pcm_check_error(pcm, err);
        UPDATE_SHADOW_PTR(hw);
        return xfern.result;
 }
index 20c1784ec5b770a2fb2dd15bd6cfa8aa0ce98e8b..5693c82f0624d225073abbe6be024fe31b4d6bce 100644 (file)
@@ -265,6 +265,22 @@ int snd_pcm_channel_info(snd_pcm_t *pcm, snd_pcm_channel_info_t *info);
 int snd_pcm_channel_info_shm(snd_pcm_t *pcm, snd_pcm_channel_info_t *info, int shmid);
 int _snd_pcm_poll_descriptor(snd_pcm_t *pcm);
 
+/* handle special error cases */
+static inline int snd_pcm_check_error(snd_pcm_t *pcm, int err)
+{
+       if (err == -EINTR) {
+               switch (snd_pcm_state(pcm)) {
+               case SND_PCM_STATE_XRUN:
+                       return -EPIPE;
+               case SND_PCM_STATE_SUSPENDED:
+                       return -ESTRPIPE;
+               case SND_PCM_STATE_DISCONNECTED:
+                       return -ENOTTY;
+               }
+       }
+       return err;
+}
+
 static inline snd_pcm_uframes_t snd_pcm_mmap_playback_avail(snd_pcm_t *pcm)
 {
        snd_pcm_sframes_t avail;