diff --git a/src/pcm/pcm_local.h b/src/pcm/pcm_local.h index ce3e6a74..247b32ab 100644 --- a/src/pcm/pcm_local.h +++ b/src/pcm/pcm_local.h @@ -321,8 +321,34 @@ static inline snd_pcm_uframes_t snd_pcm_mmap_hw_offset(snd_pcm_t *pcm) return *pcm->hw.ptr % pcm->buffer_size; } -#define snd_pcm_mmap_playback_delay snd_pcm_mmap_playback_hw_avail -#define snd_pcm_mmap_capture_delay snd_pcm_mmap_capture_avail +static inline snd_pcm_uframes_t snd_pcm_mmap_playback_delay(snd_pcm_t *pcm) +{ + snd_pcm_state_t state = snd_pcm_state(pcm); + + switch (state) { + case SND_PCM_STATE_RUNNING: + case SND_PCM_STATE_DRAINING: + return snd_pcm_mmap_playback_hw_avail(pcm); + case SND_PCM_STATE_XRUN: + return -EPIPE; + default: + return -EBADFD; + } +} + +static inline snd_pcm_uframes_t snd_pcm_mmap_capture_delay(snd_pcm_t *pcm) +{ + snd_pcm_state_t state = snd_pcm_state(pcm); + + switch (state) { + case SND_PCM_STATE_RUNNING: + return snd_pcm_mmap_capture_hw_avail(pcm); + case SND_PCM_STATE_XRUN: + return -EPIPE; + default: + return -EBADFD; + } +} static inline snd_pcm_sframes_t snd_pcm_mmap_delay(snd_pcm_t *pcm) {