From 3cce8bfa667613395d581f81e1e2d6da2f60aa34 Mon Sep 17 00:00:00 2001 From: Thomas Vander Stichele Date: Wed, 20 Jul 2005 09:55:36 +0000 Subject: [PATCH] put in gconf sinks Original commit message from CVS: put in gconf sinks --- ext/gconf/Makefile.am | 17 ++++ ext/gconf/gstgconfaudiosink.c | 195 ++++++++++++++++++++++++++++++++++++++++++ ext/gconf/gstgconfaudiosink.h | 59 +++++++++++++ ext/gconf/gstgconfelements.c | 49 +++++++++++ ext/gconf/gstgconfelements.h | 28 ++++++ ext/gconf/gstgconfvideosink.c | 195 ++++++++++++++++++++++++++++++++++++++++++ ext/gconf/gstgconfvideosink.h | 59 +++++++++++++ 7 files changed, 602 insertions(+) create mode 100644 ext/gconf/Makefile.am create mode 100644 ext/gconf/gstgconfaudiosink.c create mode 100644 ext/gconf/gstgconfaudiosink.h create mode 100644 ext/gconf/gstgconfelements.c create mode 100644 ext/gconf/gstgconfelements.h create mode 100644 ext/gconf/gstgconfvideosink.c create mode 100644 ext/gconf/gstgconfvideosink.h diff --git a/ext/gconf/Makefile.am b/ext/gconf/Makefile.am new file mode 100644 index 0000000..7f0052f --- /dev/null +++ b/ext/gconf/Makefile.am @@ -0,0 +1,17 @@ +plugin_LTLIBRARIES = libgstgconfelements.la + +libgstgconfelements_la_SOURCES = \ + gstgconfaudiosink.c \ + gstgconfelements.c \ + gstgconfvideosink.c + +DIR_CFLAGS = -DGST_GCONF_DIR=\"/system/gstreamer/@GST_MAJORMINOR@\" +libgstgconfelements_la_CFLAGS = $(GST_CFLAGS) $(GCONF_CFLAGS) $(DIR_CFLAGS) +libgstgconfelements_la_LIBADD = $(GCONF_LIBS) \ + $(top_builddir)/gst-libs/gst/gconf/libgstgconf-@GST_MAJORMINOR@.la +libgstgconfelements_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) + +noinst_HEADERS = \ + gstgconfaudiosink.h \ + gstgconfelements.h \ + gstgconfvideosink.h diff --git a/ext/gconf/gstgconfaudiosink.c b/ext/gconf/gstgconfaudiosink.c new file mode 100644 index 0000000..1db9a13 --- /dev/null +++ b/ext/gconf/gstgconfaudiosink.c @@ -0,0 +1,195 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstgconfelements.h" +#include "gstgconfaudiosink.h" + +static void gst_gconf_audio_sink_base_init (GstGConfAudioSinkClass * klass); +static void gst_gconf_audio_sink_class_init (GstGConfAudioSinkClass * klass); +static void gst_gconf_audio_sink_init (GstGConfAudioSink * sink); +static void gst_gconf_audio_sink_dispose (GObject * object); + +static void cb_toggle_element (GConfClient * client, + guint connection_id, GConfEntry * entry, gpointer data); + +static GstElementStateReturn +gst_gconf_audio_sink_change_state (GstElement * element); + +static GstBinClass *parent_class = NULL; + +GType +gst_gconf_audio_sink_get_type (void) +{ + static GType gst_gconf_audio_sink_type = 0; + + if (!gst_gconf_audio_sink_type) { + static const GTypeInfo gst_gconf_audio_sink_info = { + sizeof (GstGConfAudioSinkClass), + (GBaseInitFunc) gst_gconf_audio_sink_base_init, + NULL, + (GClassInitFunc) gst_gconf_audio_sink_class_init, + NULL, + NULL, + sizeof (GstGConfAudioSink), + 0, + (GInstanceInitFunc) gst_gconf_audio_sink_init, + }; + + gst_gconf_audio_sink_type = g_type_register_static (GST_TYPE_BIN, + "GstGConfAudioSink", &gst_gconf_audio_sink_info, 0); + } + + return gst_gconf_audio_sink_type; +} + +static void +gst_gconf_audio_sink_base_init (GstGConfAudioSinkClass * klass) +{ + GstElementClass *eklass = GST_ELEMENT_CLASS (klass); + GstElementDetails gst_gconf_audio_sink_details = { + "GConf audio sink", + "Sink/Audio", + "Audio sink embedding the GConf-settings for audio output", + "Ronald Bultje " + }; + GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + + gst_element_class_add_pad_template (eklass, + gst_static_pad_template_get (&sink_template)); + gst_element_class_set_details (eklass, &gst_gconf_audio_sink_details); +} + +static void +gst_gconf_audio_sink_class_init (GstGConfAudioSinkClass * klass) +{ + GObjectClass *oklass = G_OBJECT_CLASS (klass); + GstElementClass *eklass = GST_ELEMENT_CLASS (klass); + + parent_class = g_type_class_ref (GST_TYPE_BIN); + + oklass->dispose = gst_gconf_audio_sink_dispose; + eklass->change_state = gst_gconf_audio_sink_change_state; +} + +static void +gst_gconf_audio_sink_init (GstGConfAudioSink * sink) +{ + sink->pad = NULL; + sink->kid = NULL; + + sink->client = gconf_client_get_default (); + gconf_client_add_dir (sink->client, GST_GCONF_DIR, + GCONF_CLIENT_PRELOAD_RECURSIVE, NULL); + gconf_client_notify_add (sink->client, GST_GCONF_DIR "/default/audiosink", + cb_toggle_element, sink, NULL, NULL); + cb_toggle_element (sink->client, 0, NULL, sink); + + sink->init = FALSE; +} + +static void +gst_gconf_audio_sink_dispose (GObject * object) +{ + GstGConfAudioSink *sink = GST_GCONF_AUDIO_SINK (object); + + if (sink->client) { + g_object_unref (G_OBJECT (sink->client)); + sink->client = NULL; + } + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +cb_toggle_element (GConfClient * client, + guint connection_id, GConfEntry * entry, gpointer data) +{ + GstGConfAudioSink *sink = GST_GCONF_AUDIO_SINK (data); + GstPad *peer = NULL; + GstElementState state = GST_STATE (sink); + + /* save ghostpad */ + if (sink->pad) { + gst_object_ref (GST_OBJECT (sink->pad)); + peer = GST_PAD_PEER (GST_PAD_REALIZE (sink->pad)); + if (peer) + gst_pad_unlink (peer, sink->pad); + } + + /* kill old element */ + if (sink->kid) { + GST_DEBUG_OBJECT (sink, "Removing old kid"); + gst_bin_remove (GST_BIN (sink), sink->kid); + sink->kid = NULL; + } + + GST_DEBUG_OBJECT (sink, "Creating new kid (%ssink)", + entry ? "audio" : "fake"); + sink->kid = entry ? gst_gconf_get_default_audio_sink () : + gst_element_factory_make ("fakesink", "temporary-element"); + if (!sink->kid) { + GST_ELEMENT_ERROR (sink, LIBRARY, SETTINGS, (NULL), + ("Failed to render audio sink from GConf")); + return; + } + gst_bin_add (GST_BIN (sink), sink->kid); + + /* re-attach ghostpad */ + if (sink->pad) { + GST_DEBUG_OBJECT (sink, "Re-doing existing ghostpad"); + gst_pad_add_ghost_pad (gst_element_get_pad (sink->kid, "sink"), sink->pad); + } else { + GST_DEBUG_OBJECT (sink, "Creating new ghostpad"); + sink->pad = gst_ghost_pad_new ("sink", + gst_element_get_pad (sink->kid, "sink")); + gst_element_add_pad (GST_ELEMENT (sink), sink->pad); + } + if (peer) { + GST_DEBUG_OBJECT (sink, "Linking..."); + gst_pad_link (peer, sink->pad); + } + GST_DEBUG_OBJECT (sink, "Syncing state"); + gst_element_set_state (GST_ELEMENT (sink), state); + + GST_DEBUG_OBJECT (sink, "done changing gconf audio sink"); + sink->init = TRUE; +} + +static GstElementStateReturn +gst_gconf_audio_sink_change_state (GstElement * element) +{ + GstGConfAudioSink *sink = GST_GCONF_AUDIO_SINK (element); + + if (GST_STATE_TRANSITION (element) == GST_STATE_NULL_TO_READY && !sink->init) { + cb_toggle_element (sink->client, 0, + gconf_client_get_entry (sink->client, + GST_GCONF_DIR "/default/audiosink", NULL, TRUE, NULL), sink); + if (!sink->init) + return GST_STATE_FAILURE; + } + + return GST_ELEMENT_CLASS (parent_class)->change_state (element); +} diff --git a/ext/gconf/gstgconfaudiosink.h b/ext/gconf/gstgconfaudiosink.h new file mode 100644 index 0000000..28f6d82 --- /dev/null +++ b/ext/gconf/gstgconfaudiosink.h @@ -0,0 +1,59 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __GST_GCONF_AUDIO_SINK_H__ +#define __GST_GCONF_AUDIO_SINK_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_GCONF_AUDIO_SINK \ + (gst_gconf_audio_sink_get_type ()) +#define GST_GCONF_AUDIO_SINK(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GCONF_AUDIO_SINK, \ + GstGConfAudioSink)) +#define GST_GCONF_AUDIO_SINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GCONF_AUDIO_SINK, \ + GstGConfAudioSink)) +#define GST_IS_GCONF_AUDIO_SINK(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GCONF_AUDIO_SINK)) +#define GST_IS_GCONF_AUDIO_SINK_CLASS(obj) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GCONF_AUDIO_SINK)) + +typedef struct _GstGConfAudioSink { + GstBin parent; + + /* explicit pointers to stuff used */ + GConfClient *client; + GstElement *kid; + GstPad *pad; + gboolean init; +} GstGConfAudioSink; + +typedef struct _GstGConfAudioSinkClass { + GstBinClass parent_class; +} GstGConfAudioSinkClass; + +GType gst_gconf_audio_sink_get_type (void); + +G_END_DECLS + +#endif /* __GST_GCONF_AUDIO_SINK_H__ */ diff --git a/ext/gconf/gstgconfelements.c b/ext/gconf/gstgconfelements.c new file mode 100644 index 0000000..48aa4cf --- /dev/null +++ b/ext/gconf/gstgconfelements.c @@ -0,0 +1,49 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "gstgconfelements.h" + +#include "gstgconfaudiosink.h" +#include "gstgconfvideosink.h" + +GST_DEBUG_CATEGORY (gconf_debug); + +static gboolean +plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (gconf_debug, "gconf", 0, + "GConf/GStreamer audio/video output wrapper elements"); + + return gst_element_register (plugin, "gconfvideosink", + GST_RANK_NONE, GST_TYPE_GCONF_VIDEO_SINK) && + gst_element_register (plugin, "gconfaudiosink", + GST_RANK_NONE, GST_TYPE_GCONF_AUDIO_SINK); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "gconfelements", + "Plugin contains plugins wrapping the GStreamer/GConf audio/video output settings", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) diff --git a/ext/gconf/gstgconfelements.h b/ext/gconf/gstgconfelements.h new file mode 100644 index 0000000..c49ab53 --- /dev/null +++ b/ext/gconf/gstgconfelements.h @@ -0,0 +1,28 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __GST_GCONF_ELEMENTS_H__ +#define __GST_GCONF_ELEMENTS_H__ + +#include + +GST_DEBUG_CATEGORY_EXTERN (gconf_debug); +#define GST_CAT_DEFAULT gconf_debug + +#endif /* __GST_GCONF_ELEMENTS_H__ */ diff --git a/ext/gconf/gstgconfvideosink.c b/ext/gconf/gstgconfvideosink.c new file mode 100644 index 0000000..ce20bf7 --- /dev/null +++ b/ext/gconf/gstgconfvideosink.c @@ -0,0 +1,195 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstgconfelements.h" +#include "gstgconfvideosink.h" + +static void gst_gconf_video_sink_base_init (GstGConfVideoSinkClass * klass); +static void gst_gconf_video_sink_class_init (GstGConfVideoSinkClass * klass); +static void gst_gconf_video_sink_init (GstGConfVideoSink * sink); +static void gst_gconf_video_sink_dispose (GObject * object); + +static void cb_toggle_element (GConfClient * client, + guint connection_id, GConfEntry * entry, gpointer data); + +static GstElementStateReturn +gst_gconf_video_sink_change_state (GstElement * element); + +static GstBinClass *parent_class = NULL; + +GType +gst_gconf_video_sink_get_type (void) +{ + static GType gst_gconf_video_sink_type = 0; + + if (!gst_gconf_video_sink_type) { + static const GTypeInfo gst_gconf_video_sink_info = { + sizeof (GstGConfVideoSinkClass), + (GBaseInitFunc) gst_gconf_video_sink_base_init, + NULL, + (GClassInitFunc) gst_gconf_video_sink_class_init, + NULL, + NULL, + sizeof (GstGConfVideoSink), + 0, + (GInstanceInitFunc) gst_gconf_video_sink_init, + }; + + gst_gconf_video_sink_type = g_type_register_static (GST_TYPE_BIN, + "GstGConfVideoSink", &gst_gconf_video_sink_info, 0); + } + + return gst_gconf_video_sink_type; +} + +static void +gst_gconf_video_sink_base_init (GstGConfVideoSinkClass * klass) +{ + GstElementClass *eklass = GST_ELEMENT_CLASS (klass); + GstElementDetails gst_gconf_video_sink_details = { + "GConf video sink", + "Sink/Video", + "Video sink embedding the GConf-settings for video output", + "Ronald Bultje " + }; + GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + + gst_element_class_add_pad_template (eklass, + gst_static_pad_template_get (&sink_template)); + gst_element_class_set_details (eklass, &gst_gconf_video_sink_details); +} + +static void +gst_gconf_video_sink_class_init (GstGConfVideoSinkClass * klass) +{ + GObjectClass *oklass = G_OBJECT_CLASS (klass); + GstElementClass *eklass = GST_ELEMENT_CLASS (klass); + + parent_class = g_type_class_ref (GST_TYPE_BIN); + + oklass->dispose = gst_gconf_video_sink_dispose; + eklass->change_state = gst_gconf_video_sink_change_state; +} + +static void +gst_gconf_video_sink_init (GstGConfVideoSink * sink) +{ + sink->pad = NULL; + sink->kid = NULL; + + sink->client = gconf_client_get_default (); + gconf_client_add_dir (sink->client, GST_GCONF_DIR, + GCONF_CLIENT_PRELOAD_RECURSIVE, NULL); + gconf_client_notify_add (sink->client, GST_GCONF_DIR "/default/videosink", + cb_toggle_element, sink, NULL, NULL); + cb_toggle_element (sink->client, 0, NULL, sink); + + sink->init = FALSE; +} + +static void +gst_gconf_video_sink_dispose (GObject * object) +{ + GstGConfVideoSink *sink = GST_GCONF_VIDEO_SINK (object); + + if (sink->client) { + g_object_unref (G_OBJECT (sink->client)); + sink->client = NULL; + } + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +cb_toggle_element (GConfClient * client, + guint connection_id, GConfEntry * entry, gpointer data) +{ + GstGConfVideoSink *sink = GST_GCONF_VIDEO_SINK (data); + GstPad *peer = NULL; + GstElementState state = GST_STATE (sink); + + /* save ghostpad */ + if (sink->pad) { + gst_object_ref (GST_OBJECT (sink->pad)); + peer = GST_PAD_PEER (GST_PAD_REALIZE (sink->pad)); + if (peer) + gst_pad_unlink (peer, sink->pad); + } + + /* kill old element */ + if (sink->kid) { + GST_DEBUG_OBJECT (sink, "Removing old kid"); + gst_bin_remove (GST_BIN (sink), sink->kid); + sink->kid = NULL; + } + + GST_DEBUG_OBJECT (sink, "Creating new kid (%ssink)", + entry ? "video" : "fake"); + sink->kid = entry ? gst_gconf_get_default_video_sink () : + gst_element_factory_make ("fakesink", "temporary-element"); + if (!sink->kid) { + GST_ELEMENT_ERROR (sink, LIBRARY, SETTINGS, (NULL), + ("Failed to render video sink from GConf")); + return; + } + gst_bin_add (GST_BIN (sink), sink->kid); + + /* re-attach ghostpad */ + if (sink->pad) { + GST_DEBUG_OBJECT (sink, "Re-doing existing ghostpad"); + gst_pad_add_ghost_pad (gst_element_get_pad (sink->kid, "sink"), sink->pad); + } else { + GST_DEBUG_OBJECT (sink, "Creating new ghostpad"); + sink->pad = gst_ghost_pad_new ("sink", + gst_element_get_pad (sink->kid, "sink")); + gst_element_add_pad (GST_ELEMENT (sink), sink->pad); + } + if (peer) { + GST_DEBUG_OBJECT (sink, "Linking..."); + gst_pad_link (peer, sink->pad); + } + GST_DEBUG_OBJECT (sink, "Syncing state"); + gst_element_set_state (GST_ELEMENT (sink), state); + + GST_DEBUG_OBJECT (sink, "done changing gconf video sink"); + sink->init = TRUE; +} + +static GstElementStateReturn +gst_gconf_video_sink_change_state (GstElement * element) +{ + GstGConfVideoSink *sink = GST_GCONF_VIDEO_SINK (element); + + if (GST_STATE_TRANSITION (element) == GST_STATE_NULL_TO_READY && !sink->init) { + cb_toggle_element (sink->client, 0, + gconf_client_get_entry (sink->client, + GST_GCONF_DIR "/default/videosink", NULL, TRUE, NULL), sink); + if (!sink->init) + return GST_STATE_FAILURE; + } + + return GST_ELEMENT_CLASS (parent_class)->change_state (element); +} diff --git a/ext/gconf/gstgconfvideosink.h b/ext/gconf/gstgconfvideosink.h new file mode 100644 index 0000000..2aa4675 --- /dev/null +++ b/ext/gconf/gstgconfvideosink.h @@ -0,0 +1,59 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __GST_GCONF_VIDEO_SINK_H__ +#define __GST_GCONF_VIDEO_SINK_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_GCONF_VIDEO_SINK \ + (gst_gconf_video_sink_get_type ()) +#define GST_GCONF_VIDEO_SINK(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GCONF_VIDEO_SINK, \ + GstGConfVideoSink)) +#define GST_GCONF_VIDEO_SINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GCONF_VIDEO_SINK, \ + GstGConfVideoSink)) +#define GST_IS_GCONF_VIDEO_SINK(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GCONF_VIDEO_SINK)) +#define GST_IS_GCONF_VIDEO_SINK_CLASS(obj) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GCONF_VIDEO_SINK)) + +typedef struct _GstGConfVideoSink { + GstBin parent; + + /* explicit pointers to stuff used */ + GConfClient *client; + GstElement *kid; + GstPad *pad; + gboolean init; +} GstGConfVideoSink; + +typedef struct _GstGConfVideoSinkClass { + GstBinClass parent_class; +} GstGConfVideoSinkClass; + +GType gst_gconf_video_sink_get_type (void); + +G_END_DECLS + +#endif /* __GST_GCONF_VIDEO_SINK_H__ */ -- 2.7.4