/** * gst_bus_add_signal_watch_full: * @bus: a #GstBus on which you want to receive the "message" signal * @priority: The priority of the watch. * * Adds a bus signal watch to the default main context with the given @priority * (e.g. %G_PRIORITY_DEFAULT). It is also possible to use a non-default main * context set up using g_main_context_push_thread_default() * (before one had to create a bus watch source and attach it to the desired * main context 'manually'). * * After calling this statement, the bus will emit the "message" signal for each * message posted on the bus when the main loop is running. * * 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 * function is called. * * There can only be a single bus watch per bus, you must remove any signal * watch before you can set another type of watch. * * MT safe. */ void gst_bus_add_signal_watch_full (GstBus * bus, gint priority) { g_return_if_fail (GST_IS_BUS (bus)); /* I know the callees don't take this lock, so go ahead and abuse it */ GST_OBJECT_LOCK (bus); if (bus->priv->num_signal_watchers > 0) goto done; /* this should not fail because the counter above takes care of it */ g_assert (!bus->priv->signal_watch); gst_bus_add_watch_full_unlocked (bus, priority, gst_bus_async_signal_func, NULL, NULL); if (G_UNLIKELY (!bus->priv->signal_watch)) goto add_failed; done: bus->priv->num_signal_watchers++; GST_OBJECT_UNLOCK (bus); return; /* ERRORS */ add_failed: { g_critical ("Could not add signal watch to bus %s", GST_OBJECT_NAME (bus)); GST_OBJECT_UNLOCK (bus); return; } }
/** * gst_bus_add_watch_full: * @bus: a #GstBus to create the watch for. * @priority: The priority of the watch. * @func: A function to call when a message is received. * @user_data: user data passed to @func. * @notify: the function to call when the source is removed. * * Adds a bus watch to the default main context with the given @priority. * This function is used to receive asynchronous messages in the main loop. * There can only be a single bus watch per bus, you must remove it before you * can set a new one. * * When @func is called, the message belongs to the caller; if you want to * keep a copy of it, call gst_message_ref() before leaving @func. * * The watch can be removed using g_source_remove() or by returning FALSE * from @func. * * Returns: The event source id. * * MT safe. */ guint gst_bus_add_watch_full (GstBus * bus, gint priority, GstBusFunc func, gpointer user_data, GDestroyNotify notify) { guint id; g_return_val_if_fail (GST_IS_BUS (bus), 0); GST_OBJECT_LOCK (bus); id = gst_bus_add_watch_full_unlocked (bus, priority, func, user_data, notify); GST_OBJECT_UNLOCK (bus); return id; }