]> git.sesse.net Git - vlc/commitdiff
aout: factor out mdate() from the time_get() callback
authorRémi Denis-Courmont <remi@remlab.net>
Thu, 22 Nov 2012 20:21:38 +0000 (22:21 +0200)
committerRémi Denis-Courmont <remi@remlab.net>
Thu, 22 Nov 2012 20:23:17 +0000 (22:23 +0200)
include/vlc_aout.h
modules/audio_output/alsa.c
modules/audio_output/opensles_android.c
modules/audio_output/oss.c
modules/audio_output/packet.c
modules/audio_output/pulse.c
modules/audio_output/sndio.c
modules/audio_output/wasapi.c
src/audio_output/dec.c
src/audio_output/output.c

index be84182e2ec977052104c5f6a5c4328986de92d8..f59489c71cb67cc67c0f5097e3adf36b530bb418 100644 (file)
@@ -150,11 +150,10 @@ struct audio_output
     /**< Stops the existing stream (optional, may be NULL).
       * \note A stream must have been started when called.
       */
-    int (*time_get)(audio_output_t *, mtime_t *write_pts);
-    /**< Estimates the date/time of the playback buffer write offset
-      * (optional, may be NULL). The read offset is not returned since it is
-      * always implicitly equal to the current time (mdate()).
-      * \param write_pts timestamp of the write offset [OUT]
+    int (*time_get)(audio_output_t *, mtime_t *delay);
+    /**< Estimates playback buffer latency (optional, may be NULL).
+      * \param delay pointer to the delay until the next sample to be written
+      *              to the playback buffer is rendered [OUT]
       * \return 0 on success, non-zero on failure or lack of data
       * \note A stream must have been started when called.
       */
index abdae3c0465f84b34a15b109aafa0c2f811c6078..4e7ef93ee2f015f5a56cecba54ae01549aaf68e6 100644 (file)
@@ -520,7 +520,7 @@ error:
     return VLC_EGENERIC;
 }
 
-static int TimeGet (audio_output_t *aout, mtime_t *restrict pts)
+static int TimeGet (audio_output_t *aout, mtime_t *restrict delay)
 {
     aout_sys_t *sys = aout->sys;
     snd_pcm_sframes_t frames;
@@ -531,7 +531,7 @@ static int TimeGet (audio_output_t *aout, mtime_t *restrict pts)
         msg_Err (aout, "cannot estimate delay: %s", snd_strerror (val));
         return -1;
     }
-    *pts = mdate () + (frames * CLOCK_FREQ / sys->format.i_rate);
+    *delay = frames * CLOCK_FREQ / sys->format.i_rate;
     return 0;
 }
 
index e84e92caa87f7c2275a3f8e2f69f1b6918d8c31e..78407307f6ea72c922b0cb68c4b95b6f6b6c3269 100644 (file)
@@ -149,8 +149,7 @@ static int TimeGet(audio_output_t* p_aout, mtime_t* restrict drift)
         return -1;
     }
 
-    if (delay && st.count)
-        *drift = mdate() + delay;
+    *drift = (delay && st.count) ? delay : 0;
     return 0;
 }
 
index 5d4db8438295c686580eb651802bbb974e7cba04..e3070d61001cdd04678e7805cd230d496f97dc82 100644 (file)
@@ -324,8 +324,8 @@ static int TimeGet (audio_output_t *aout, mtime_t *restrict pts)
         return -1;
     }
 
-    *pts = mdate () + ((delay * CLOCK_FREQ * sys->format.i_frame_length)
-                      / (sys->format.i_rate * sys->format.i_bytes_per_frame));
+    *pts = (delay * CLOCK_FREQ * sys->format.i_frame_length)
+                        / (sys->format.i_rate * sys->format.i_bytes_per_frame);
     return 0;
 }
 
index f245a821345fb38b4b97c474bb3e799909bcb5e2..bbbd01124b7f73c08764ce0e16ac61edb7badd2a 100644 (file)
@@ -157,18 +157,20 @@ void aout_PacketDestroy (audio_output_t *aout)
     vlc_mutex_destroy (&p->lock);
 }
 
-int aout_PacketTimeGet (audio_output_t *aout,  mtime_t *restrict pts)
+int aout_PacketTimeGet (audio_output_t *aout, mtime_t *restrict delay)
 {
     aout_packet_t *p = aout_packet (aout);
     mtime_t time_report;
 
+    /* Problem: This measurement is imprecise and prone to jitter.
+     * Solution: Do not use aout_Packet...(). */
     vlc_mutex_lock (&p->lock);
     time_report = date_Get (&p->fifo.end_date);
     vlc_mutex_unlock (&p->lock);
 
     if (time_report == VLC_TS_INVALID)
         return -1;
-    *pts = time_report;
+    *delay = time_report - mdate ();
     return 0;
 }
 
index 75857ec98b357f84eb4bae32c5047b798e7facfe..452ccb76442f51d2eca32f5261637a2859b7f446 100644 (file)
@@ -426,7 +426,7 @@ static void sink_input_info_cb(pa_context *ctx, const pa_sink_input_info *i,
 
 /*** VLC audio output callbacks ***/
 
-static int TimeGet(audio_output_t *aout, mtime_t *restrict write_pts)
+static int TimeGet(audio_output_t *aout, mtime_t *restrict delay)
 {
     aout_sys_t *sys = aout->sys;
     pa_stream *s = sys->stream;
@@ -438,7 +438,7 @@ static int TimeGet(audio_output_t *aout, mtime_t *restrict write_pts)
     if (delta == VLC_TS_INVALID)
         return -1;
 
-    *write_pts = mdate() + delta;
+    *delay = delta;
     return 0;
 }
 
index 3ac3a414f831678922595d52f0dfdc9d75c04e40..a79026141df0646aa64a85a84c2fd59a9ab0fb6b 100644 (file)
@@ -197,7 +197,7 @@ static void PositionChanged (void *arg, int delta)
     sys->read_offset += delta;
 }
 
-static int TimeGet (audio_output_t *aout, mtime_t *restrict pts)
+static int TimeGet (audio_output_t *aout, mtime_t *restrict delay)
 {
     aout_sys_t *sys = aout->sys;
     long long frames = sys->write_offset - sys->read_offset;
@@ -205,7 +205,7 @@ static int TimeGet (audio_output_t *aout, mtime_t *restrict pts)
     if (frames == 0)
         return -1;
 
-    *pts = mdate () + (frames * CLOCK_FREQ / sys->rate);
+    *delay = frames * CLOCK_FREQ / sys->rate;
     return 0;
 }
 
index 1b001cde4da1b39b4e5a826f4374f6936b1c2335..92a28d77a27980133487108bacec2894881bec57 100644 (file)
@@ -135,7 +135,7 @@ struct aout_sys_t
 
 
 /*** VLC audio output callbacks ***/
-static int TimeGet(audio_output_t *aout, mtime_t *restrict pts)
+static int TimeGet(audio_output_t *aout, mtime_t *restrict delay)
 {
     aout_sys_t *sys = aout->sys;
     UINT64 pos, qpcpos;
@@ -159,10 +159,8 @@ static int TimeGet(audio_output_t *aout, mtime_t *restrict pts)
         return -1;
     }
 
-    mtime_t delay =  ((GetQPC() - qpcpos) / (10000000 / CLOCK_FREQ));
+    *delay = ((GetQPC() - qpcpos) / (10000000 / CLOCK_FREQ));
     static_assert((10000000 % CLOCK_FREQ) == 0, "Frequency conversion broken");
-
-    *pts = mdate() + delay;
     return 0;
 }
 
index 26a22a6c6ddf46cc5faf6ac55d390b7c6adcbf5f..3dccce6564e3bf70aea2ecb050fcf79bd5b4c0f4 100644 (file)
@@ -267,7 +267,7 @@ static void aout_DecSynchronize (audio_output_t *aout, mtime_t dec_pts,
                                  int input_rate)
 {
     aout_owner_t *owner = aout_owner (aout);
-    mtime_t aout_pts, drift;
+    mtime_t drift;
 
     /**
      * Depending on the drift between the actual and intended playback times,
@@ -285,9 +285,9 @@ static void aout_DecSynchronize (audio_output_t *aout, mtime_t dec_pts,
      * all samples in the buffer will have been played. Then:
      *    pts = mdate() + delay
      */
-    if (aout_OutputTimeGet (aout, &aout_pts) != 0)
+    if (aout_OutputTimeGet (aout, &drift) != 0)
         return; /* nothing can be done if timing is unknown */
-    drift = aout_pts - dec_pts;
+    drift += mdate () - dec_pts;
 
     /* Late audio output.
      * This can happen due to insufficient caching, scheduling jitter
@@ -311,9 +311,9 @@ static void aout_DecSynchronize (audio_output_t *aout, mtime_t dec_pts,
         owner->sync.discontinuity = true;
 
         /* Now the output might be too early... Recheck. */
-        if (aout_OutputTimeGet (aout, &aout_pts) != 0)
+        if (aout_OutputTimeGet (aout, &drift) != 0)
             return; /* nothing can be done if timing is unknown */
-        drift = aout_pts - dec_pts;
+        drift += mdate () - dec_pts;
     }
 
     /* Early audio output.
index ce40ec9ee47ad39ac95265d9cc4ae4faa7b919d1..09fe342b4f77e31e27da19f23efc144421b34434 100644 (file)
@@ -404,13 +404,13 @@ void aout_OutputDelete (audio_output_t *aout)
         aout->stop (aout);
 }
 
-int aout_OutputTimeGet (audio_output_t *aout, mtime_t *pts)
+int aout_OutputTimeGet (audio_output_t *aout, mtime_t *delay)
 {
     aout_assert_locked (aout);
 
     if (aout->time_get == NULL)
         return -1;
-    return aout->time_get (aout, pts);
+    return aout->time_get (aout, delay);
 }
 
 /**