plugio: Check for pointer callback error codes
By checking error code returned by the pointer callback, we can determine more precisely PCM state. Previous implementation assumed, that a software PCM can only produce overrun or underrun. It was impossible to mark software PCM as disconnected.
Signed-off-by: Arkadiusz Bokowy arkadiusz.bokowy@gmail.com --- src/pcm/pcm_ioplug.c | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-)
diff --git a/src/pcm/pcm_ioplug.c b/src/pcm/pcm_ioplug.c index 06c20d7b..cc234611 100644 --- a/src/pcm/pcm_ioplug.c +++ b/src/pcm/pcm_ioplug.c @@ -53,20 +53,29 @@ static int snd_pcm_ioplug_hw_ptr_update(snd_pcm_t *pcm) { ioplug_priv_t *io = pcm->private_data; snd_pcm_sframes_t hw; + unsigned int delta;
hw = io->data->callback->pointer(io->data); - if (hw >= 0) { - unsigned int delta; - if ((unsigned int)hw >= io->last_hw) - delta = hw - io->last_hw; - else - delta = pcm->buffer_size + hw - io->last_hw; - snd_pcm_mmap_hw_forward(io->data->pcm, delta); - io->last_hw = hw; - return 0; - } else - io->data->state = SNDRV_PCM_STATE_XRUN; - return -EPIPE; + if (hw < 0) { + switch (hw) { + case -ESTRPIPE: + io->data->state = SND_PCM_STATE_SUSPENDED; + break; + case -ENODEV: + io->data->state = SND_PCM_STATE_DISCONNECTED; + break; + default: + io->data->state = SND_PCM_STATE_XRUN; + } + return hw; + } + if ((unsigned int)hw >= io->last_hw) + delta = hw - io->last_hw; + else + delta = pcm->buffer_size + hw - io->last_hw; + snd_pcm_mmap_hw_forward(io->data->pcm, delta); + io->last_hw = hw; + return 0; }
static int snd_pcm_ioplug_info(snd_pcm_t *pcm, snd_pcm_info_t *info)