![](https://secure.gravatar.com/avatar/dd006fd48e4d5c9cb8dff9cc0f9487df.jpg?s=120&d=mm&r=g)
Signed-off-by: Arkadiusz Bokowy arkadiusz.bokowy@gmail.com --- src/pcm/pcm_ioplug.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-)
diff --git a/src/pcm/pcm_ioplug.c b/src/pcm/pcm_ioplug.c index 98184398..c96104e9 100644 --- a/src/pcm/pcm_ioplug.c +++ b/src/pcm/pcm_ioplug.c @@ -54,7 +54,7 @@ static int snd_pcm_ioplug_poll_revents(snd_pcm_t *pcm, struct pollfd *pfds, unsi
/* update the hw pointer */ /* called in lock */ -static void snd_pcm_ioplug_hw_ptr_update(snd_pcm_t *pcm) +static int snd_pcm_ioplug_hw_ptr_update(snd_pcm_t *pcm) { ioplug_priv_t *io = pcm->private_data; snd_pcm_sframes_t hw; @@ -85,7 +85,9 @@ static void snd_pcm_ioplug_hw_ptr_update(snd_pcm_t *pcm) snd_pcm_ioplug_drop(pcm); else io->data->state = SNDRV_PCM_STATE_XRUN; + return -EPIPE; } + return 0; }
static int snd_pcm_ioplug_info(snd_pcm_t *pcm, snd_pcm_info_t *info) @@ -115,7 +117,10 @@ static int snd_pcm_ioplug_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp) io->data->callback->delay) return io->data->callback->delay(io->data, delayp); else { - snd_pcm_ioplug_hw_ptr_update(pcm); + int err; + err = snd_pcm_ioplug_hw_ptr_update(pcm); + if (err < 0) + return err; *delayp = snd_pcm_mmap_delay(pcm); } return 0; @@ -499,11 +504,14 @@ static int snd_pcm_ioplug_start(snd_pcm_t *pcm) static int snd_pcm_ioplug_drop(snd_pcm_t *pcm) { ioplug_priv_t *io = pcm->private_data; + int err;
if (io->data->state == SND_PCM_STATE_OPEN) return -EBADFD;
- io->data->callback->stop(io->data); + err = io->data->callback->stop(io->data); + if (err < 0) + return err;
gettimestamp(&io->trigger_tstamp, pcm->tstamp_type); io->data->state = SND_PCM_STATE_SETUP; @@ -625,7 +633,7 @@ static int snd_pcm_ioplug_resume(snd_pcm_t *pcm) ioplug_priv_t *io = pcm->private_data;
if (io->data->callback->resume) - io->data->callback->resume(io->data); + return io->data->callback->resume(io->data); return 0; }
@@ -898,13 +906,14 @@ static void clear_io_params(ioplug_priv_t *io) static int snd_pcm_ioplug_close(snd_pcm_t *pcm) { ioplug_priv_t *io = pcm->private_data; + int err = 0;
clear_io_params(io); if (io->data->callback->close) - io->data->callback->close(io->data); + err = io->data->callback->close(io->data); free(io);
- return 0; + return err; }
static const snd_pcm_ops_t snd_pcm_ioplug_ops = {