[pulseaudio-discuss] [PATCH] alsa-util: Set ALSA report_delay flag in pa_alsa_safe_delay()
Georg Chini
georg at chini.tk
Tue Apr 3 22:52:12 UTC 2018
On 04.04.2018 00:35, Pierre-Louis Bossart wrote:
> On 4/2/18 3:14 PM, Georg Chini wrote:
>> On 02.04.2018 21:35, Pierre-Louis Bossart wrote:
>>>
>>>
>>> On 04/02/2018 07:54 AM, Georg Chini wrote:
>>>> The current code does not call
>>>> snd_pcm_status_set_audio_htstamp_config()
>>>> to configure the way timestamps are updated in ALSA. This leads to
>>>> incorrect time stamps in the status object returned by
>>>> snd_pcm_status(),
>>>> so the computed latencies are wrong.
>>>>
>>>> This patch uses snd_pcm_status_set_audio_htstamp_config() to set the
>>>> ALSA report_delay flag to 1 before the call to snd_pcm_status(). With
>>>> this, time stamps are updated as expected.
>>>> ---
>>>> src/modules/alsa/alsa-util.c | 7 +++++++
>>>> 1 file changed, 7 insertions(+)
>>>>
>>>> diff --git a/src/modules/alsa/alsa-util.c
>>>> b/src/modules/alsa/alsa-util.c
>>>> index 61fb4903..b91a0e98 100644
>>>> --- a/src/modules/alsa/alsa-util.c
>>>> +++ b/src/modules/alsa/alsa-util.c
>>>> @@ -1187,6 +1187,7 @@ int pa_alsa_safe_delay(snd_pcm_t *pcm,
>>>> snd_pcm_status_t *status, snd_pcm_sframes
>>>> size_t abs_k;
>>>> int err;
>>>> snd_pcm_sframes_t avail = 0;
>>>> + snd_pcm_audio_tstamp_config_t tstamp_config;
>>>> pa_assert(pcm);
>>>> pa_assert(delay);
>>>> @@ -1200,6 +1201,12 @@ int pa_alsa_safe_delay(snd_pcm_t *pcm,
>>>> snd_pcm_status_t *status, snd_pcm_sframes
>>>> * avail, delay and timestamp values in a single kernel call
>>>> to improve
>>>> * timer-based scheduling */
>>>> + /* The time stamp configuration needs to be set so that the
>>>> + * ALSA code will use the internal delay reported by the
>>>> driver */
>>>> + tstamp_config.type_requested = 1; /* ALSA default time stamp
>>>> type */
>>>> + tstamp_config.report_delay = 1;
>>>> + snd_pcm_status_set_audio_htstamp_config(status, &tstamp_config);
>>>> +
>>> are you sure it's necessary or is this possibly a misunderstanding
>>> of what audio_tstamps are?
>>>
>>> this command is only for the audio timestamp, and to the best of my
>>> knowledge you are not using the results using one of the
>>> snd_pcm_status_get_audio_htstamp_* commands
>>>
>>> the typical usage (see alsa-lib/test/audio_time.c) is this:
>>>
>>> snd_pcm_status_set_audio_htstamp_config(status,
>>> audio_tstamp_config);
>>>
>>> if ((err = snd_pcm_status(handle, status)) < 0) {
>>> printf("Stream status error: %s\n", snd_strerror(err));
>>> exit(0);
>>> }
>>> snd_pcm_status_get_trigger_htstamp(status, trigger_timestamp);
>>> snd_pcm_status_get_htstamp(status, timestamp);
>>> snd_pcm_status_get_audio_htstamp(status, audio_timestamp);
>>> snd_pcm_status_get_audio_htstamp_report(status,
>>> audio_tstamp_report);
>>>
>>> if you are not using the _get_audio_hstamp() then the config has
>>> essentially no effect, and the delay is available separately in the
>>> status command as before.
>>>
>>>> if ((err = snd_pcm_status(pcm, status)) < 0)
>>>> return err;
>>
>> See this bug report, why it is needed:
>>
>> https://bugzilla.kernel.org/show_bug.cgi?id=199235
>>
>> It finally turned out that there was not a bug but just the flag
>> missing.
>> We are using snd_pcm_status_get_htstamp() with the time smoother
>> to calculate sink/source latency.
>
> Humm, that looks more like a bug in the fix (20e3f9 'ALSA: pcm: update
> tstamp only in audio_tstamp changed'). I don't think we intended that
> changes in the way the audio_tstamp is calculated (with or without
> delay) would impact when the system timestamp is updated. I am pretty
> sure we only wanted to update the timestamp when the hw_ptr changed
> with this fix so as to go back to the traditional behavior before
> kernel 4.1.
>
> Can you check if just using tstamp_config.type_requested = 1; isn't
> enough for PulseAudio? If not, we have two conflicting desires on when
> the system timestamp should be updated.
>
>
>
It isn't enough. For the time stamp to be updated you need to have
report_delay set.
More information about the pulseaudio-discuss
mailing list