mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-20 00:31:13 +00:00
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:
parent
4e97b99b8a
commit
5665cc636d
2 changed files with 26 additions and 9 deletions
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue