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.

_______________________________________________
pulseaudio-discuss mailing list
pulseaudio-discuss@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss

Reply via email to