gst-libs/gst/audio/audioclock.c (gst_audio_clock_set_active)

Original commit message from CVS:
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.
This commit is contained in:
Martin Soto 2004-11-27 09:37:20 +00:00
parent 4e97b99b8a
commit 5665cc636d
2 changed files with 26 additions and 9 deletions

View file

@ -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:

View file

@ -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);
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;
}
}