[alsa-devel] [PATCH - JACK IO plug 1/1] pcm: ioplug: Provide avail helper function for plugins
Takashi Sakamoto
o-takashi at sakamocchi.jp
Wed Jul 4 02:34:47 CEST 2018
Iwai-san,
On Jul 3 2018 22:59, twischer at de.adit-jv.com wrote:
> From: Timo Wischer <twischer at de.adit-jv.com>
>
> 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 at de.adit-jv.com>
>
> diff --git a/include/pcm_ioplug.h b/include/pcm_ioplug.h
> index c1310e3..b16fc8b 100644
> --- a/include/pcm_ioplug.h
> +++ b/include/pcm_ioplug.h
> @@ -235,6 +235,9 @@ int snd_pcm_ioplug_set_param_list(snd_pcm_ioplug_t *io, int type, unsigned int n
> int snd_pcm_ioplug_set_state(snd_pcm_ioplug_t *ioplug, snd_pcm_state_t state);
>
> /* calucalte the available frames */
> +snd_pcm_uframes_t snd_pcm_ioplug_avail(const snd_pcm_ioplug_t * const ioplug,
> + const snd_pcm_uframes_t hw_ptr,
> + const snd_pcm_uframes_t appl_ptr);
> 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);
> diff --git a/src/pcm/pcm_ioplug.c b/src/pcm/pcm_ioplug.c
> index 4d44ae2..6d52c27 100644
> --- a/src/pcm/pcm_ioplug.c
> +++ b/src/pcm/pcm_ioplug.c
> @@ -1221,6 +1221,21 @@ int snd_pcm_ioplug_set_state(snd_pcm_ioplug_t *ioplug, snd_pcm_state_t state)
> * \param ioplug the ioplug handle
> * \param hw_ptr hardware pointer in frames
> * \param appl_ptr application pointer in frames
> + * \return available frames for the application
> + */
> +snd_pcm_uframes_t snd_pcm_ioplug_avail(const snd_pcm_ioplug_t * const ioplug,
> + const snd_pcm_uframes_t hw_ptr,
> + const snd_pcm_uframes_t appl_ptr)
> +{
> + return __snd_pcm_avail(ioplug->pcm, hw_ptr, appl_ptr);
> +}
> +
> +/**
> + * \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,
> @@ -1230,8 +1245,9 @@ snd_pcm_uframes_t snd_pcm_ioplug_hw_avail(const snd_pcm_ioplug_t * const ioplug,
> /* 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);
> + const snd_pcm_uframes_t user_avail = snd_pcm_ioplug_avail(ioplug,
> + hw_ptr,
> + appl_ptr);
>
> if (user_avail > ioplug->pcm->buffer_size) {
> /* there was an Xrun */
I have a question about maintenance policy of this library to update
version script for GNU Linker (ld) when introducing new symbols. The
version script is not updated since node name as 'ALSA_0.9.7'. The newly
intduced symbol, 'snd_pcm_ioplug_hw_avail' is in node name of
'ALSA_0.9'.
```
$ readelf -s src/.libs/libasound.so.2.0.0 | grep snd_pcm_ioplug_hw_avail
1254: 000000000009bfe0 40 FUNC GLOBAL DEFAULT 13
snd_pcm_ioplug_hw_avail@@ALSA_0.9
3840: 000000000009bfe0 40 FUNC GLOBAL DEFAULT 13
snd_pcm_ioplug_hw_avail
```
The last node name is 'ALSA_1.1.6':
```
$ tail -n 10 src/Versions.in
global:
@SYMBOL_PREFIX at alsa_lisp_*;
} ALSA_0.9.5;
ALSA_1.1.6 {
global:
@SYMBOL_PREFIX at snd_dlopen;
} ALSA_0.9.7;
```
Practically this brings no issue, but theoretically the newly introduced
symbol should be in a new node name next to ALSA_1.1.6. I'm not so
strict in this point, but it's better to decide maintenance policy
(because I've added some APIs in recent years).
Regards
Takashi Sakamoto
More information about the Alsa-devel
mailing list