gst/gstbus.c (gst_bus_remove_signal_watch): New function, removes signal watches previously added via gst_bus_add_sig...

Original commit message from CVS:
2005-09-29  Andy Wingo  <wingo@pobox.com>

* gst/gstbus.c (gst_bus_remove_signal_watch): New function,
removes signal watches previously added via
gst_bus_add_signal_watch.
(gst_bus_add_signal_watch): Don't return the source id, just store
it on the bus if there wasn't an id already.

* gst/gstbus.h (GstBus): Add a couple new fields. API changes for
add_signal_watch and remove_signal_watch.
This commit is contained in:
Andy Wingo 2005-09-29 16:04:31 +00:00
parent 52b24de958
commit 410315b375
4 changed files with 78 additions and 9 deletions

View file

@ -92,9 +92,13 @@ gst_bus_peek
gst_bus_pop gst_bus_pop
gst_bus_set_flushing gst_bus_set_flushing
gst_bus_set_sync_handler gst_bus_set_sync_handler
gst_bus_sync_signal_handler
gst_bus_create_watch gst_bus_create_watch
gst_bus_add_watch_full gst_bus_add_watch_full
gst_bus_add_watch gst_bus_add_watch
gst_bus_async_signal_func
gst_bus_add_signal_watch
gst_bus_remove_signal_watch
gst_bus_poll gst_bus_poll
<SUBSECTION Standard> <SUBSECTION Standard>
GstBusClass GstBusClass
@ -488,6 +492,7 @@ gst_element_lost_state
gst_element_message_full gst_element_message_full
gst_element_no_more_pads gst_element_no_more_pads
gst_element_post_message gst_element_post_message
gst_element_provide_clock
gst_element_provides_clock gst_element_provides_clock
gst_element_query gst_element_query
gst_element_query_convert gst_element_query_convert
@ -969,6 +974,8 @@ GST_MESSAGE_TRACE_NAME
GST_MESSAGE_TYPE GST_MESSAGE_TYPE
GST_MESSAGE_UNLOCK GST_MESSAGE_UNLOCK
GST_MESSAGE_WAIT GST_MESSAGE_WAIT
gst_message_type_to_quark
gst_message_type_get_name
gst_message_copy gst_message_copy
gst_message_get_structure gst_message_get_structure
gst_message_make_writable gst_message_make_writable

View file

@ -27,6 +27,9 @@ network connections also need a protocol to do this.
#GstBuffer, #GstCaps, #GstEvent #GstBuffer, #GstCaps, #GstEvent
</para> </para>
<!-- ##### SECTION Stability_Level ##### -->
<!-- ##### ENUM GstDPHeaderFlag ##### --> <!-- ##### ENUM GstDPHeaderFlag ##### -->
<para> <para>

View file

@ -867,22 +867,76 @@ gst_bus_sync_signal_handler (GstBus * bus, GstMessage * message, gpointer data)
/** /**
* gst_bus_add_signal_watch: * gst_bus_add_signal_watch:
* @bus: a #GstBus to create the watch for * @bus: a #GstBus on which you want to recieve the "message" signal
* *
* Adds a bus signal watch to the default main context with the default priority. * Adds a bus signal watch to the default main context with the default priority.
* After calling this statement, the bus will emit the message signal for each * After calling this statement, the bus will emit the message signal for each
* message posted on the bus. * message posted on the bus.
* *
* The watch can be removed using #g_source_remove(). * This function may be called multiple times. To clean up, the caller is
* * responsible for calling gst_bus_remove_signal_watch() as many times as this
* Returns: The event source id. * function is called.
* *
* MT safe. * MT safe.
*/ */
guint void
gst_bus_add_signal_watch (GstBus * bus) gst_bus_add_signal_watch (GstBus * bus)
{ {
g_return_val_if_fail (GST_IS_BUS (bus), 0); g_return_if_fail (GST_IS_BUS (bus));
return gst_bus_add_watch (bus, gst_bus_async_signal_func, NULL); /* I know the callees don't take this lock, so go ahead and abuse it */
GST_LOCK (bus);
if (bus->num_signal_watchers > 0)
goto done;
g_assert (bus->signal_watch_id == 0);
bus->signal_watch_id =
gst_bus_add_watch (bus, gst_bus_async_signal_func, NULL);
done:
bus->num_signal_watchers++;
GST_UNLOCK (bus);
}
/**
* gst_bus_remove_signal_watch:
* @bus: a #GstBus you previously added a signal watch to
*
* Removes a signal watch previously added with gst_bus_add_signal_watch().
*
* MT safe.
*/
void
gst_bus_remove_signal_watch (GstBus * bus)
{
g_return_if_fail (GST_IS_BUS (bus));
/* I know the callees don't take this lock, so go ahead and abuse it */
GST_LOCK (bus);
if (bus->num_signal_watchers == 0)
goto error;
bus->num_signal_watchers--;
if (bus->num_signal_watchers > 0)
goto done;
g_source_remove (bus->signal_watch_id);
bus->signal_watch_id = 0;
done:
GST_UNLOCK (bus);
return;
error:
{
g_critical ("Bus %s has no signal watches attached", GST_OBJECT_NAME (bus));
GST_UNLOCK (bus);
return;
}
} }

View file

@ -94,6 +94,9 @@ struct _GstBus
GstBusSyncHandler sync_handler; GstBusSyncHandler sync_handler;
gpointer sync_handler_data; gpointer sync_handler_data;
guint signal_watch_id;
guint num_signal_watchers;
/*< private > */ /*< private > */
gpointer _gst_reserved[GST_PADDING]; gpointer _gst_reserved[GST_PADDING];
}; };
@ -144,8 +147,10 @@ gboolean gst_bus_async_signal_func (GstBus *bus, GstMessage *message,
gpointer data); gpointer data);
GstBusSyncReply gst_bus_sync_signal_handler (GstBus *bus, GstMessage *message, GstBusSyncReply gst_bus_sync_signal_handler (GstBus *bus, GstMessage *message,
gpointer data); gpointer data);
/* add watch that dispatches signals */
guint gst_bus_add_signal_watch (GstBus * bus); /* convenience api to add/remove a gsource that emits the async signals */
void gst_bus_add_signal_watch (GstBus * bus);
void gst_bus_remove_signal_watch (GstBus * bus);
G_END_DECLS G_END_DECLS