[pulseaudio-discuss] [PATCH] alsa-util: Set ALSA report_delay flag in pa_alsa_safe_delay()
Georg Chini
georg at chini.tk
Mon Apr 2 20:14:29 UTC 2018
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.
More information about the pulseaudio-discuss
mailing list