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).
This commit is contained in:
Takashi Iwai 2007-12-14 15:19:03 +01:00
parent 86456d21e0
commit ce64f433a6
2 changed files with 21 additions and 0 deletions

View file

@ -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 */

View file

@ -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;
}