[pulseaudio-tickets] [Bug 97799] Discontinuity in the interpolated delay after corking, flushing and uncorking.

bugzilla-daemon at freedesktop.org bugzilla-daemon at freedesktop.org
Tue Sep 13 23:16:03 UTC 2016


https://bugs.freedesktop.org/show_bug.cgi?id=97799

--- Comment #14 from Niklas Haas <bugs.freedesktop at haasn.xyz> ---
> Did you interpret my message so that I was asking you questions about the
> ordering of something? I did no such thing.

No, I was just pointing out that care needs to be taken when making assumptions
about what order various calls happen in. Although I now realize the point you
were making is independent of the order of events because it does not concern
the delay measurement, just the seek mode.

> Reading the ao_pulse code, cork/flush/uncork clearly happen in that order. The
> only possible uncertainty is that is the RELATIVE_ON_READ write really the
> first write after the seek.

Here is my code for reference:

diff --git a/audio/out/ao_pulse.c b/audio/out/ao_pulse.c
index 5a68553..a02ccb3 100644
--- a/audio/out/ao_pulse.c
+++ b/audio/out/ao_pulse.c
@@ -62,6 +62,9 @@ struct priv {
     char *cfg_sink;
     int cfg_buffer;
     int cfg_latency_hacks;
+
+    // XXX testing
+    bool want_reset;
 };

 #define GENERIC_ERR_MSG(str) \
@@ -518,9 +521,15 @@ static void cork(struct ao *ao, bool pause)
 static int play(struct ao *ao, void **data, int samples, int flags)
 {
     struct priv *priv = ao->priv;
+    enum pa_seek_mode seekmode = PA_SEEK_RELATIVE;
+    if (priv->want_reset) {
+        seekmode = PA_SEEK_RELATIVE_ON_READ;
+        priv->want_reset = false;
+    }
+
     pa_threaded_mainloop_lock(priv->mainloop);
     if (pa_stream_write(priv->stream, data[0], samples * ao->sstride, NULL, 0,
-                        PA_SEEK_RELATIVE) < 0) {
+                        seekmode) < 0) {
         GENERIC_ERR_MSG("pa_stream_write() failed");
         samples = -1;
     }
@@ -545,6 +554,7 @@ static void reset(struct ao *ao)
         !priv->retval)
         GENERIC_ERR_MSG("pa_stream_flush() failed");
     cork(ao, false);
+    priv->want_reset = true;
 }

 // Pause the audio stream by corking it on the server

Based on the way I implemented it, the stream flushing could should affect the
seek mode of exactly the next pa_stream_write and no more. play() itself
will only ever be called by a single thread, so it can't be the case that
two threads enter this code at the exact same time. But I'll add some printf
debugging to this to be sure:

...
relative
relative
relative
relative
relative
want_reset = true
relative_on_read
relative
relative
relative
relative
...

So yes, it happens in exactly that order.

I double, triple and quadruple checked (running the test multiple times for
each
case) and confirmed that the result is definitely different: With this patch
applied, I get only small spikes in ao-delay which translate to small
discontinuities of about 10-20ms in ao-dev.

If I take the exact same source code, replace PA_SEEK_RELATIVE_ON_READ by
PA_SEEK_RELATIVE in the branch I added, recompile and rerun the test, I get the
same behavior as in my first post again, which is the same behavior as without
this diff. So it isn't just down to pure chance.

-- 
You are receiving this mail because:
You are the assignee for the bug.
You are the QA Contact for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/pulseaudio-bugs/attachments/20160913/f84002a1/attachment.html>


More information about the pulseaudio-bugs mailing list