pcm: ioplug: Provide hw_avail helper function for plugins

This function can be called without calling snd_pcm_avail_update().

The call to snd_pcm_avail_update() can take some time.
Therefore some developers would not like to call it from a real-time
context (e.g. from JACK client context).

Signed-off-by: Timo Wischer <twischer@de.adit-jv.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Timo Wischer 2018-03-13 09:34:42 +01:00 committed by Takashi Iwai
parent 9c2fb31d0e
commit df2452cc6a
3 changed files with 59 additions and 7 deletions

View file

@ -1148,3 +1148,29 @@ int snd_pcm_ioplug_set_state(snd_pcm_ioplug_t *ioplug, snd_pcm_state_t state)
ioplug->state = state;
return 0;
}
/**
* \brief Get the available frames. This function can be used to calculate the
* the available frames before calling #snd_pcm_avail_update()
* \param ioplug the ioplug handle
* \param hw_ptr hardware pointer in frames
* \param appl_ptr application pointer in frames
* \return available frames for the hardware
*/
snd_pcm_uframes_t snd_pcm_ioplug_hw_avail(const snd_pcm_ioplug_t * const ioplug,
const snd_pcm_uframes_t hw_ptr,
const snd_pcm_uframes_t appl_ptr)
{
/* available data/space which can be transferred by the user
* application
*/
const snd_pcm_uframes_t user_avail = __snd_pcm_avail(ioplug->pcm,
hw_ptr, appl_ptr);
if (user_avail > ioplug->pcm->buffer_size) {
/* there was an Xrun */
return 0;
}
/* available data/space which can be transferred by the DMA */
return ioplug->pcm->buffer_size - user_avail;
}