summaryrefslogtreecommitdiffstats
path: root/sys/oss/gstossclock.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2003-07-03 14:35:50 +0000
committerAndy Wingo <wingo@pobox.com>2003-07-03 14:35:50 +0000
commit82c42cb6fd5e2127c3eddaee93d4db254498043b (patch)
tree35db2534d9f18c54f80470f24c0ba8e8e37b3cca /sys/oss/gstossclock.c
parentb69213925fb117e8c49e6032dd09631bc446536e (diff)
implemented wait_async and unschedule ossclock, and support it in osssink -- really should make this a general clock,...
Original commit message from CVS: implemented wait_async and unschedule ossclock, and support it in osssink -- really should make this a general clock, ill need it in gstsf
Diffstat (limited to 'sys/oss/gstossclock.c')
-rw-r--r--sys/oss/gstossclock.c56
1 files changed, 54 insertions, 2 deletions
diff --git a/sys/oss/gstossclock.c b/sys/oss/gstossclock.c
index 5171c086..a6249f03 100644
--- a/sys/oss/gstossclock.c
+++ b/sys/oss/gstossclock.c
@@ -25,7 +25,11 @@
static void gst_oss_clock_class_init (GstOssClockClass *klass);
static void gst_oss_clock_init (GstOssClock *clock);
-static GstClockTime gst_oss_clock_get_internal_time (GstClock *clock);
+static GstClockTime gst_oss_clock_get_internal_time (GstClock *clock);
+static GstClockReturn gst_oss_clock_id_wait_async (GstClock *clock,
+ GstClockEntry *entry);
+static void gst_oss_clock_id_unschedule (GstClock *clock,
+ GstClockEntry *entry);
static GstSystemClockClass *parent_class = NULL;
/* static guint gst_oss_clock_signals[LAST_SIGNAL] = { 0 }; */
@@ -68,7 +72,9 @@ gst_oss_clock_class_init (GstOssClockClass *klass)
parent_class = g_type_class_ref (GST_TYPE_SYSTEM_CLOCK);
- gstclock_class->get_internal_time = gst_oss_clock_get_internal_time;
+ gstclock_class->get_internal_time = gst_oss_clock_get_internal_time;
+ gstclock_class->wait_async = gst_oss_clock_id_wait_async;
+ gstclock_class->unschedule = gst_oss_clock_id_unschedule;
}
static void
@@ -137,3 +143,49 @@ gst_oss_clock_get_internal_time (GstClock *clock)
}
}
+void
+gst_oss_clock_update_time (GstClock *clock, GstClockTime time)
+{
+ GstOssClock *oss_clock = (GstOssClock*)clock;
+
+ while (oss_clock->async_entries) {
+ GstClockEntry *entry = (GstClockEntry*)oss_clock->async_entries->data;
+
+ if (entry->time > time)
+ break;
+
+ entry->func (clock, time, entry, entry->user_data);
+
+ oss_clock->async_entries = g_slist_delete_link (oss_clock->async_entries,
+ oss_clock->async_entries);
+ /* do I need to free the entry? */
+ }
+}
+
+static gint
+compare_clock_entries (GstClockEntry *entry1, GstClockEntry *entry2)
+{
+ return entry1->time - entry2->time;
+}
+
+static GstClockReturn
+gst_oss_clock_id_wait_async (GstClock *clock, GstClockEntry *entry)
+{
+ GstOssClock *oss_clock = (GstOssClock*)clock;
+
+ oss_clock->async_entries = g_slist_insert_sorted (oss_clock->async_entries,
+ entry,
+ (GCompareFunc)compare_clock_entries);
+
+ /* is this the proper return val? */
+ return GST_CLOCK_EARLY;
+}
+
+static void
+gst_oss_clock_id_unschedule (GstClock *clock, GstClockEntry *entry)
+{
+ GstOssClock *oss_clock = (GstOssClock*)clock;
+
+ oss_clock->async_entries = g_slist_remove (oss_clock->async_entries,
+ entry);
+}