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,
}
}
_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)
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;
}
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;
}
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;
}
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;
}
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;