From: Benjamin O. <co...@us...> - 2003-12-16 19:35:39
|
CVS Root: /cvsroot/gstreamer Module: gstreamer Changes by: company Date: Tue Dec 16 2003 11:35:38 PST Log message: implement gst_bin_get_(all_)by_interface Modified files: gst : gstbin.c gstbin.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstbin.c.diff?r1=1.167&r2=1.168 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstbin.h.diff?r1=1.55&r2=1.56 ====Begin Diffs==== Index: gstbin.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstbin.c,v retrieving revision 1.167 retrieving revision 1.168 diff -u -d -r1.167 -r1.168 --- gstbin.c 13 Nov 2003 02:47:03 -0000 1.167 +++ gstbin.c 16 Dec 2003 19:35:26 -0000 1.168 @@ -892,6 +892,77 @@ } /** + * gst_bin_get_by_interface: + * @bin: bin to find element in + * @interface: interface to be implemented by interface + * + * Looks for the first element inside the bin that implements the given + * interface. If such an element is found, it returns the element. You can + * cast this element to the given interface afterwards. + * If you want all elements that implement the interface, use + * gst_bin_get_all_by_interface(). The function recurses bins inside bins. + * + * Returns: An element inside the bin implementing the interface. + */ +GstElement * +gst_bin_get_by_interface (GstBin *bin, const GType interface) +{ + GList *walk; + + g_return_val_if_fail (GST_IS_BIN (bin), NULL); + g_return_val_if_fail (G_TYPE_IS_INTERFACE (interface), NULL); + + walk = bin->children; + while (walk) { + if (G_TYPE_CHECK_INSTANCE_TYPE (walk->data, interface)) + return GST_ELEMENT (walk->data); + if (GST_IS_BIN (walk->data)) { + GstElement *ret; + ret = gst_bin_get_by_interface (GST_BIN (walk->data), interface); + if (ret) + return ret; + } + walk = g_list_next (walk); + } + + return NULL; +} + +/** + * gst_bin_get_all_by_interface: + * @bin: bin to find elements in + * @interface: interface to be implemented by interface + * + * Looks for all element inside the bin that implements the given + * interface. You can safely cast all returned elements to the given interface. + * The function recurses bins inside bins. You need to free the list using + * g_list_free() after use. + * + * Returns: An element inside the bin implementing the interface. + */ +GList * +gst_bin_get_all_by_interface (GstBin *bin, const GType interface) +{ + GList *walk, *ret = NULL; + + g_return_val_if_fail (GST_IS_BIN (bin), NULL); + g_return_val_if_fail (G_TYPE_IS_INTERFACE (interface), NULL); + + walk = bin->children; + while (walk) { + if (G_TYPE_CHECK_INSTANCE_TYPE (walk->data, interface)) + ret = g_list_prepend (ret, walk->data); + if (GST_IS_BIN (walk->data)) { + ret = g_list_concat (ret, + gst_bin_get_all_by_interface (GST_BIN (walk->data), interface)); + } + walk = g_list_next (walk); + } + + return ret; +} + +/** * gst_bin_sync_children_state: * @bin: #Gstbin to sync state * Index: gstbin.h =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstbin.h,v retrieving revision 1.55 retrieving revision 1.56 diff -u -d -r1.55 -r1.56 --- gstbin.h 13 Dec 2003 16:58:28 -0000 1.55 +++ gstbin.h 16 Dec 2003 19:35:26 -0000 1.56 @@ -103,6 +103,8 @@ GstElement* gst_bin_get_by_name_recurse_up (GstBin *bin, const gchar *name); G_CONST_RETURN GList* gst_bin_get_list (GstBin *bin); +GstElement* gst_bin_get_by_interface (GstBin *bin, const GType interface); +GList * gst_bin_get_all_by_interface (GstBin *bin, const GType interface); gboolean gst_bin_iterate (GstBin *bin); |