summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--gst-libs/gst/audio/audioclock.c28
2 files changed, 26 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 35b9dbb3..fb2cc6f3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2004-11-27 Martin Soto <martinsoto@users.sourceforge.net>
+
+ * gst-libs/gst/audio/audioclock.c (gst_audio_clock_set_active)
+ (gst_audio_clock_get_internal_time):
+ Fix active <-> inactive transitions: ensure time value always
+ grows and avoid abrupt value changes.
+
2004-11-27 Arwed v. Merkatz <v.merkatz@gmx.net>
* configure.ac:
* gst/tta/Makefile.am:
diff --git a/gst-libs/gst/audio/audioclock.c b/gst-libs/gst/audio/audioclock.c
index 75c4c1c5..65d2694f 100644
--- a/gst-libs/gst/audio/audioclock.c
+++ b/gst-libs/gst/audio/audioclock.c
@@ -109,22 +109,32 @@ gst_audio_clock_new (gchar * name, GstAudioClockGetTimeFunc func,
void
gst_audio_clock_set_active (GstAudioClock * aclock, gboolean active)
{
- GstClockTime time;
+ GstClockTime audio_time, system_time;
GstClock *clock;
+ GTimeVal timeval;
g_return_if_fail (GST_IS_AUDIO_CLOCK (aclock));
clock = GST_CLOCK (aclock);
- time = gst_clock_get_event_time (clock);
+ if (active == aclock->active) {
+ /* Nothing to do. */
+ return;
+ }
- if (active) {
- aclock->adjust = time - aclock->func (clock, aclock->user_data);
- } else {
- GTimeVal timeval;
+ audio_time = aclock->func (clock, aclock->user_data);
- g_get_current_time (&timeval);
+ g_get_current_time (&timeval);
+ system_time = GST_TIMEVAL_TO_TIME (timeval);
- aclock->adjust = GST_TIMEVAL_TO_TIME (timeval) - time;
+ /* Set the new adjust value in such a way that there's no abrupt
+ discontinuity, i.e. if gst_audio_clock_get_internal_time is
+ invoked right before and right after (de)activating the clock,
+ the values returned will be close to each other, and the second
+ value will be greater than or equal than the first. */
+ if (active) {
+ aclock->adjust = aclock->adjust + system_time - audio_time;
+ } else {
+ aclock->adjust = aclock->adjust + audio_time - system_time;
}
aclock->active = active;
@@ -141,7 +151,7 @@ gst_audio_clock_get_internal_time (GstClock * clock)
GTimeVal timeval;
g_get_current_time (&timeval);
- return GST_TIMEVAL_TO_TIME (timeval);
+ return GST_TIMEVAL_TO_TIME (timeval) + aclock->adjust;
}
}