[vlc-commits] aout: factor out mdate() from the time_get() callback
Rémi Denis-Courmont
git at videolan.org
Thu Nov 22 21:24:03 CET 2012
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Thu Nov 22 22:21:38 2012 +0200| [ca4846feee716ada23b9318e75cde38c2a62e7a8] | committer: Rémi Denis-Courmont
aout: factor out mdate() from the time_get() callback
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=ca4846feee716ada23b9318e75cde38c2a62e7a8
---
include/vlc_aout.h | 9 ++++-----
modules/audio_output/alsa.c | 4 ++--
modules/audio_output/opensles_android.c | 3 +--
modules/audio_output/oss.c | 4 ++--
modules/audio_output/packet.c | 6 ++++--
modules/audio_output/pulse.c | 4 ++--
modules/audio_output/sndio.c | 4 ++--
modules/audio_output/wasapi.c | 6 ++----
src/audio_output/dec.c | 10 +++++-----
src/audio_output/output.c | 4 ++--
10 files changed, 26 insertions(+), 28 deletions(-)
diff --git a/include/vlc_aout.h b/include/vlc_aout.h
index be84182..f59489c 100644
--- a/include/vlc_aout.h
+++ b/include/vlc_aout.h
@@ -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.
*/
diff --git a/modules/audio_output/alsa.c b/modules/audio_output/alsa.c
index abdae3c..4e7ef93 100644
--- a/modules/audio_output/alsa.c
+++ b/modules/audio_output/alsa.c
@@ -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;
}
diff --git a/modules/audio_output/opensles_android.c b/modules/audio_output/opensles_android.c
index e84e92c..7840730 100644
--- a/modules/audio_output/opensles_android.c
+++ b/modules/audio_output/opensles_android.c
@@ -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;
}
diff --git a/modules/audio_output/oss.c b/modules/audio_output/oss.c
index 5d4db84..e3070d6 100644
--- a/modules/audio_output/oss.c
+++ b/modules/audio_output/oss.c
@@ -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;
}
diff --git a/modules/audio_output/packet.c b/modules/audio_output/packet.c
index f245a82..bbbd011 100644
--- a/modules/audio_output/packet.c
+++ b/modules/audio_output/packet.c
@@ -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;
}
diff --git a/modules/audio_output/pulse.c b/modules/audio_output/pulse.c
index 75857ec..452ccb7 100644
--- a/modules/audio_output/pulse.c
+++ b/modules/audio_output/pulse.c
@@ -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;
}
diff --git a/modules/audio_output/sndio.c b/modules/audio_output/sndio.c
index 3ac3a41..a790261 100644
--- a/modules/audio_output/sndio.c
+++ b/modules/audio_output/sndio.c
@@ -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;
}
diff --git a/modules/audio_output/wasapi.c b/modules/audio_output/wasapi.c
index 1b001cd..92a28d7 100644
--- a/modules/audio_output/wasapi.c
+++ b/modules/audio_output/wasapi.c
@@ -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;
}
diff --git a/src/audio_output/dec.c b/src/audio_output/dec.c
index 26a22a6..3dccce6 100644
--- a/src/audio_output/dec.c
+++ b/src/audio_output/dec.c
@@ -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.
diff --git a/src/audio_output/output.c b/src/audio_output/output.c
index ce40ec9..09fe342 100644
--- a/src/audio_output/output.c
+++ b/src/audio_output/output.c
@@ -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);
}
/**
More information about the vlc-commits
mailing list