[alsa-devel] [PATCH - JACK IO plug 1/1] pcm: ioplug: Provide avail helper function for plugins
Takashi Sakamoto
o-takashi at sakamocchi.jp
Thu Jul 5 12:36:47 CEST 2018
Hi,
On Jul 4 2018 15:21, Takashi Iwai wrote:
> On Wed, 04 Jul 2018 02:34:47 +0200,
> Takashi Sakamoto wrote:
>>
>> 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).
>
> Yes, that's an open question.
>
> I myself am no big fan of the versioned symbols. This has been a PITA
> for many applications. The versioned smybols is useful only if the
> function signature may change. But what's the difference from
> renaming the function, then?
>
> So we've stopped putting the new symbols into the new versioned
> section; the snd_dlopen was an exception because it really changed the
> signature.
Nowadays I have no positive reason to use versioned symbols as you said.
I'm OK and thanks for your explanation.
Takashi Sakamoto
More information about the Alsa-devel
mailing list