From: Takashi Iwai Date: Fri, 14 Dec 2007 14:19:03 +0000 (+0100) Subject: Add snd_pcm_ioplug_set_state() function X-Git-Tag: v1.0.16rc1~29 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=ce64f433a64b797b423cf7f24b9514dbeb17cf35;p=alsa-lib.git Add snd_pcm_ioplug_set_state() function Added an exported function snd_pcm_ioplug_set_state() to change the PCM state of ioplug from the plugin side (e.g. from another thread). --- diff --git a/include/pcm_ioplug.h b/include/pcm_ioplug.h index f8a23f69..f740a197 100644 --- a/include/pcm_ioplug.h +++ b/include/pcm_ioplug.h @@ -208,6 +208,9 @@ void snd_pcm_ioplug_params_reset(snd_pcm_ioplug_t *io); int snd_pcm_ioplug_set_param_minmax(snd_pcm_ioplug_t *io, int type, unsigned int min, unsigned int max); int snd_pcm_ioplug_set_param_list(snd_pcm_ioplug_t *io, int type, unsigned int num_list, const unsigned int *list); +/* change PCM status */ +int snd_pcm_ioplug_set_state(snd_pcm_ioplug_t *ioplug, snd_pcm_state_t state); + /** \} */ #endif /* __ALSA_PCM_IOPLUG_H */ diff --git a/src/pcm/pcm_ioplug.c b/src/pcm/pcm_ioplug.c index 19dab979..7bf19ca1 100644 --- a/src/pcm/pcm_ioplug.c +++ b/src/pcm/pcm_ioplug.c @@ -614,6 +614,8 @@ static snd_pcm_sframes_t snd_pcm_ioplug_avail_update(snd_pcm_t *pcm) snd_pcm_uframes_t avail; snd_pcm_ioplug_hw_ptr_update(pcm); + if (io->data->state == SNDRV_PCM_STATE_XRUN) + return -EPIPE; if (pcm->stream == SND_PCM_STREAM_CAPTURE && pcm->access != SND_PCM_ACCESS_RW_INTERLEAVED && pcm->access != SND_PCM_ACCESS_RW_NONINTERLEAVED) { @@ -1037,3 +1039,19 @@ const snd_pcm_channel_area_t *snd_pcm_ioplug_mmap_areas(snd_pcm_ioplug_t *ioplug return snd_pcm_mmap_areas(ioplug->pcm); return NULL; } + +/** + * \brief Change the ioplug PCM status + * \param ioplug the ioplug handle + * \param state the PCM status + * \return zero if successful or a negative error code + * + * Changes the PCM status of the ioplug to the given value. + * This function can be used for external plugins to notify the status + * change, e.g. XRUN. + */ +int snd_pcm_ioplug_set_state(snd_pcm_ioplug_t *ioplug, snd_pcm_state_t state) +{ + ioplug->state = state; + return 0; +}