summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlessandro Decina <alessandro.decina@collabora.co.uk>2010-07-05 12:56:40 +0200
committerAlessandro Decina <alessandro.d@gmail.com>2010-07-06 10:46:42 +0200
commitdda86638110a97518c0d76aff405ffc0781c3573 (patch)
tree881842f3a988bc49c15a134184f5af4786b77aa8
parent8df1fdab57944bb08339e7fb54ae3a40ccb5e62f (diff)
clock: add gst_clock_id_wait_async_full.
Add gst_clock_id_wait_async_full. It's the same as gst_clock_id_wait_async but allows passing a GDestroyNotify to destroy user_data.
-rw-r--r--gst/gstclock.c41
-rw-r--r--gst/gstclock.h5
2 files changed, 43 insertions, 3 deletions
diff --git a/gst/gstclock.c b/gst/gstclock.c
index 925823f43e..ccc928b3f6 100644
--- a/gst/gstclock.c
+++ b/gst/gstclock.c
@@ -202,6 +202,7 @@ gst_clock_entry_new (GstClock * clock, GstClockTime time,
entry->status = GST_CLOCK_OK;
entry->func = NULL;
entry->user_data = NULL;
+ entry->destroy_data = NULL;
return (GstClockID) entry;
}
@@ -229,9 +230,13 @@ gst_clock_id_ref (GstClockID id)
static void
_gst_clock_id_free (GstClockID id)
{
+ GstClockEntry *entry;
g_return_if_fail (id != NULL);
GST_CAT_DEBUG (GST_CAT_CLOCK, "freed entry %p", id);
+ entry = (GstClockEntry *) id;
+ if (entry->destroy_data)
+ entry->destroy_data (entry->user_data);
#ifndef GST_DISABLE_TRACE
gst_alloc_trace_free (_gst_clock_entry_trace, id);
@@ -457,10 +462,11 @@ not_supported:
}
/**
- * gst_clock_id_wait_async:
+ * gst_clock_id_wait_async_full:
* @id: a #GstClockID to wait on
* @func: The callback function
* @user_data: User data passed in the callback
+ * @destroy_data: #GDestroyNotify for user_data
*
* Register a callback on the given #GstClockID @id with the given
* function and user_data. When passing a #GstClockID with an invalid
@@ -474,10 +480,12 @@ not_supported:
* Returns: the result of the non blocking wait.
*
* MT safe.
+ *
+ * Since: 0.10.30
*/
GstClockReturn
-gst_clock_id_wait_async (GstClockID id,
- GstClockCallback func, gpointer user_data)
+gst_clock_id_wait_async_full (GstClockID id,
+ GstClockCallback func, gpointer user_data, GDestroyNotify destroy_data)
{
GstClockEntry *entry;
GstClock *clock;
@@ -503,6 +511,7 @@ gst_clock_id_wait_async (GstClockID id,
entry->func = func;
entry->user_data = user_data;
+ entry->destroy_data = destroy_data;
res = cclass->wait_async (clock, entry);
@@ -524,6 +533,32 @@ not_supported:
}
/**
+ * gst_clock_id_wait_async:
+ * @id: a #GstClockID to wait on
+ * @func: The callback function
+ * @user_data: User data passed in the callback
+ *
+ * Register a callback on the given #GstClockID @id with the given
+ * function and user_data. When passing a #GstClockID with an invalid
+ * time to this function, the callback will be called immediately
+ * with a time set to GST_CLOCK_TIME_NONE. The callback will
+ * be called when the time of @id has been reached.
+ *
+ * The callback @func can be invoked from any thread, either provided by the
+ * core or from a streaming thread. The application should be prepared for this.
+ *
+ * Returns: the result of the non blocking wait.
+ *
+ * MT safe.
+ */
+GstClockReturn
+gst_clock_id_wait_async (GstClockID id,
+ GstClockCallback func, gpointer user_data)
+{
+ return gst_clock_id_wait_async_full (id, func, user_data, NULL);
+}
+
+/**
* gst_clock_id_unschedule:
* @id: The id to unschedule
*
diff --git a/gst/gstclock.h b/gst/gstclock.h
index c0d65c5ec8..8710dfa676 100644
--- a/gst/gstclock.h
+++ b/gst/gstclock.h
@@ -346,6 +346,7 @@ struct _GstClockEntry {
GstClockReturn status;
GstClockCallback func;
gpointer user_data;
+ GDestroyNotify destroy_data;
};
/**
@@ -544,6 +545,10 @@ GstClockReturn gst_clock_id_wait (GstClockID id,
GstClockReturn gst_clock_id_wait_async (GstClockID id,
GstClockCallback func,
gpointer user_data);
+GstClockReturn gst_clock_id_wait_async_full (GstClockID id,
+ GstClockCallback func,
+ gpointer user_data,
+ GDestroyNotify destroy_data);
void gst_clock_id_unschedule (GstClockID id);