ext/gconf/: Add new gconfaudiosrc and gconfvideosrc elements (needed for gnome-sound...
authorTim-Philipp Müller <tim@centricular.net>
Fri, 6 Jan 2006 16:28:30 +0000 (16:28 +0000)
committerTim-Philipp Müller <tim@centricular.net>
Fri, 6 Jan 2006 16:28:30 +0000 (16:28 +0000)
Original commit message from CVS:
* ext/gconf/Makefile.am:
* ext/gconf/gstgconfaudiosrc.c: (gst_gconf_audio_src_base_init),
(gst_gconf_audio_src_class_init), (gst_gconf_audio_src_reset),
(gst_gconf_audio_src_init), (gst_gconf_audio_src_dispose),
(do_toggle_element), (cb_toggle_element),
(gst_gconf_audio_src_change_state):
* ext/gconf/gstgconfaudiosrc.h:
* ext/gconf/gstgconfelements.c: (plugin_init):
* ext/gconf/gstgconfvideosrc.c: (gst_gconf_video_src_base_init),
(gst_gconf_video_src_class_init), (gst_gconf_video_src_reset),
(gst_gconf_video_src_init), (gst_gconf_video_src_dispose),
(do_toggle_element), (cb_toggle_element),
(gst_gconf_video_src_change_state):
* ext/gconf/gstgconfvideosrc.h:
Add new gconfaudiosrc and gconfvideosrc elements
(needed for gnome-sound-recorder).

ChangeLog
ext/gconf/Makefile.am
ext/gconf/gstgconfaudiosrc.c [new file with mode: 0644]
ext/gconf/gstgconfaudiosrc.h [new file with mode: 0644]
ext/gconf/gstgconfelements.c
ext/gconf/gstgconfvideosrc.c [new file with mode: 0644]
ext/gconf/gstgconfvideosrc.h [new file with mode: 0644]

index 622c28f..fe7f173 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2006-01-06  Tim-Philipp Müller  <tim at centricular dot net>
+
+       * ext/gconf/Makefile.am:
+       * ext/gconf/gstgconfaudiosrc.c: (gst_gconf_audio_src_base_init),
+       (gst_gconf_audio_src_class_init), (gst_gconf_audio_src_reset),
+       (gst_gconf_audio_src_init), (gst_gconf_audio_src_dispose),
+       (do_toggle_element), (cb_toggle_element),
+       (gst_gconf_audio_src_change_state):
+       * ext/gconf/gstgconfaudiosrc.h:
+       * ext/gconf/gstgconfelements.c: (plugin_init):
+       * ext/gconf/gstgconfvideosrc.c: (gst_gconf_video_src_base_init),
+       (gst_gconf_video_src_class_init), (gst_gconf_video_src_reset),
+       (gst_gconf_video_src_init), (gst_gconf_video_src_dispose),
+       (do_toggle_element), (cb_toggle_element),
+       (gst_gconf_video_src_change_state):
+       * ext/gconf/gstgconfvideosrc.h:
+         Add new gconfaudiosrc and gconfvideosrc elements
+         (needed for gnome-sound-recorder).
+
 2006-01-06  Edward Hervey  <edward@fluendo.com>
 
        * gst/id3demux/gstid3demux.c: (gst_id3demux_add_srcpad):
index 688d38a..942aa28 100644 (file)
@@ -2,8 +2,10 @@ plugin_LTLIBRARIES = libgstgconfelements.la
 
 libgstgconfelements_la_SOURCES = \
        gstgconfaudiosink.c \
+       gstgconfaudiosrc.c \
        gstgconfelements.c \
        gstgconfvideosink.c \
+       gstgconfvideosrc.c \
        gconf.c
 
 DIR_CFLAGS = -DGST_GCONF_DIR=\"/system/gstreamer/@GST_MAJORMINOR@\"
@@ -13,6 +15,8 @@ libgstgconfelements_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
 
 noinst_HEADERS = \
        gstgconfaudiosink.h \
+       gstgconfaudiosrc.h \
        gstgconfelements.h \
        gstgconfvideosink.h \
+       gstgconfvideosrc.h \
        gconf.h
diff --git a/ext/gconf/gstgconfaudiosrc.c b/ext/gconf/gstgconfaudiosrc.c
new file mode 100644 (file)
index 0000000..0ea53be
--- /dev/null
@@ -0,0 +1,185 @@
+/* GStreamer
+ * (c) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+ * (c) 2005 Tim-Philipp Müller <tim centricular net>
+ *
+ * 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 "gstgconfaudiosrc.h"
+
+static void gst_gconf_audio_src_dispose (GObject * object);
+static void cb_toggle_element (GConfClient * client,
+    guint connection_id, GConfEntry * entry, gpointer data);
+static GstStateChangeReturn
+gst_gconf_audio_src_change_state (GstElement * element,
+    GstStateChange transition);
+
+GST_BOILERPLATE (GstGConfAudioSrc, gst_gconf_audio_src, GstBin, GST_TYPE_BIN);
+
+static void
+gst_gconf_audio_src_base_init (gpointer klass)
+{
+  GstElementClass *eklass = GST_ELEMENT_CLASS (klass);
+  GstElementDetails gst_gconf_audio_src_details = {
+    "GConf audio source",
+    "Source/Audio",
+    "Audio source embedding the GConf-settings for audio input",
+    "Ronald Bultje <rbultje@ronald.bitfreak.net>"
+  };
+  GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
+      GST_PAD_SRC,
+      GST_PAD_ALWAYS,
+      GST_STATIC_CAPS_ANY);
+
+  gst_element_class_add_pad_template (eklass,
+      gst_static_pad_template_get (&src_template));
+  gst_element_class_set_details (eklass, &gst_gconf_audio_src_details);
+}
+
+static void
+gst_gconf_audio_src_class_init (GstGConfAudioSrcClass * klass)
+{
+  GObjectClass *oklass = G_OBJECT_CLASS (klass);
+  GstElementClass *eklass = GST_ELEMENT_CLASS (klass);
+
+  oklass->dispose = gst_gconf_audio_src_dispose;
+  eklass->change_state = gst_gconf_audio_src_change_state;
+}
+
+/*
+ * Hack to make negotiation work.
+ */
+
+static void
+gst_gconf_audio_src_reset (GstGConfAudioSrc * src)
+{
+  GstPad *targetpad;
+
+  /* fakesrc */
+  if (src->kid) {
+    gst_element_set_state (src->kid, GST_STATE_NULL);
+    gst_bin_remove (GST_BIN (src), src->kid);
+  }
+  src->kid = gst_element_factory_make ("fakesrc", "testsrc");
+  gst_bin_add (GST_BIN (src), src->kid);
+
+  targetpad = gst_element_get_pad (src->kid, "src");
+  gst_ghost_pad_set_target (GST_GHOST_PAD (src->pad), targetpad);
+  gst_object_unref (targetpad);
+}
+
+static void
+gst_gconf_audio_src_init (GstGConfAudioSrc * src,
+    GstGConfAudioSrcClass * g_class)
+{
+  src->pad = gst_ghost_pad_new_no_target ("src", GST_PAD_SRC);
+  gst_element_add_pad (GST_ELEMENT (src), src->pad);
+
+  gst_gconf_audio_src_reset (src);
+
+  src->client = gconf_client_get_default ();
+  gconf_client_add_dir (src->client, GST_GCONF_DIR,
+      GCONF_CLIENT_PRELOAD_RECURSIVE, NULL);
+  gconf_client_notify_add (src->client, GST_GCONF_DIR "/default/audiosrc",
+      cb_toggle_element, src, NULL, NULL);
+}
+
+static void
+gst_gconf_audio_src_dispose (GObject * object)
+{
+  GstGConfAudioSrc *src = GST_GCONF_AUDIO_SRC (object);
+
+  if (src->client) {
+    g_object_unref (G_OBJECT (src->client));
+    src->client = NULL;
+  }
+
+  GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
+}
+
+static gboolean
+do_toggle_element (GstGConfAudioSrc * src)
+{
+  GstPad *targetpad;
+
+  /* kill old element */
+  if (src->kid) {
+    GST_DEBUG_OBJECT (src, "Removing old kid");
+    gst_element_set_state (src->kid, GST_STATE_NULL);
+    gst_bin_remove (GST_BIN (src), src->kid);
+    src->kid = NULL;
+  }
+
+  GST_DEBUG_OBJECT (src, "Creating new kid");
+  if (!(src->kid = gst_gconf_get_default_audio_src ())) {
+    GST_ELEMENT_ERROR (src, LIBRARY, SETTINGS, (NULL),
+        ("Failed to render audio source from GConf"));
+    return FALSE;
+  }
+  gst_element_set_state (src->kid, GST_STATE (src));
+  gst_bin_add (GST_BIN (src), src->kid);
+
+  /* re-attach ghostpad */
+  GST_DEBUG_OBJECT (src, "Creating new ghostpad");
+  targetpad = gst_element_get_pad (src->kid, "src");
+  gst_ghost_pad_set_target (GST_GHOST_PAD (src->pad), targetpad);
+  gst_object_unref (targetpad);
+  GST_DEBUG_OBJECT (src, "done changing gconf audio source");
+
+  return TRUE;
+}
+
+static void
+cb_toggle_element (GConfClient * client,
+    guint connection_id, GConfEntry * entry, gpointer data)
+{
+  do_toggle_element (GST_GCONF_AUDIO_SRC (data));
+}
+
+static GstStateChangeReturn
+gst_gconf_audio_src_change_state (GstElement * element,
+    GstStateChange transition)
+{
+  GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+  GstGConfAudioSrc *src = GST_GCONF_AUDIO_SRC (element);
+
+  switch (transition) {
+    case GST_STATE_CHANGE_NULL_TO_READY:
+      if (!do_toggle_element (src))
+        return GST_STATE_CHANGE_FAILURE;
+      break;
+    default:
+      break;
+  }
+
+  ret = GST_CALL_PARENT_WITH_DEFAULT (GST_ELEMENT_CLASS, change_state,
+      (element, transition), GST_STATE_CHANGE_SUCCESS);
+
+  switch (transition) {
+    case GST_STATE_CHANGE_READY_TO_NULL:
+      gst_gconf_audio_src_reset (src);
+      break;
+    default:
+      break;
+  }
+
+  return ret;
+}
diff --git a/ext/gconf/gstgconfaudiosrc.h b/ext/gconf/gstgconfaudiosrc.h
new file mode 100644 (file)
index 0000000..7c4c32b
--- /dev/null
@@ -0,0 +1,52 @@
+/* GStreamer
+ * (c) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+ * (c) 2005 Tim-Philipp Müller <tim centricular net>
+ *
+ * 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_SRC_H__
+#define __GST_GCONF_AUDIO_SRC_H__
+
+#include <gst/gst.h>
+#include <gconf/gconf-client.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_GCONF_AUDIO_SRC            (gst_gconf_audio_src_get_type ())
+#define GST_GCONF_AUDIO_SRC(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GCONF_AUDIO_SRC, GstGConfAudioSrc))
+#define GST_GCONF_AUDIO_SRC_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GCONF_AUDIO_SRC, GstGConfAudioSrc))
+#define GST_IS_GCONF_AUDIO_SRC(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GCONF_AUDIO_SRC))
+#define GST_IS_GCONF_AUDIO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GCONF_AUDIO_SRC))
+
+typedef struct _GstGConfAudioSrc {
+  GstBin parent;
+
+  /* explicit pointers to stuff used */
+  GConfClient *client;
+  GstElement *kid;
+  GstPad *pad;
+} GstGConfAudioSrc;
+
+typedef struct _GstGConfAudioSrcClass {
+  GstBinClass parent_class;
+} GstGConfAudioSrcClass;
+
+GType   gst_gconf_audio_src_get_type   (void);
+
+G_END_DECLS
+
+#endif /* __GST_GCONF_AUDIO_SRC_H__ */
index e636278..06f0113 100644 (file)
@@ -26,7 +26,9 @@
 #include "gstgconfelements.h"
 
 #include "gstgconfaudiosink.h"
+#include "gstgconfaudiosrc.h"
 #include "gstgconfvideosink.h"
+#include "gstgconfvideosrc.h"
 
 GST_DEBUG_CATEGORY (gconf_debug);
 
@@ -36,10 +38,18 @@ 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);
+  if (!gst_element_register (plugin, "gconfvideosink",
+          GST_RANK_NONE, GST_TYPE_GCONF_VIDEO_SINK) ||
+      !gst_element_register (plugin, "gconfvideosrc",
+          GST_RANK_NONE, GST_TYPE_GCONF_VIDEO_SRC) ||
+      !gst_element_register (plugin, "gconfaudiosink",
+          GST_RANK_NONE, GST_TYPE_GCONF_AUDIO_SINK) ||
+      !gst_element_register (plugin, "gconfaudiosrc",
+          GST_RANK_NONE, GST_TYPE_GCONF_AUDIO_SRC)) {
+    return FALSE;
+  }
+
+  return TRUE;
 }
 
 GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
diff --git a/ext/gconf/gstgconfvideosrc.c b/ext/gconf/gstgconfvideosrc.c
new file mode 100644 (file)
index 0000000..ecc3cc2
--- /dev/null
@@ -0,0 +1,185 @@
+/* GStreamer
+ * (c) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+ * (c) 2005 Tim-Philipp Müller <tim centricular net>
+ *
+ * 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 "gstgconfvideosrc.h"
+
+static void gst_gconf_video_src_dispose (GObject * object);
+static void cb_toggle_element (GConfClient * client,
+    guint connection_id, GConfEntry * entry, gpointer data);
+static GstStateChangeReturn
+gst_gconf_video_src_change_state (GstElement * element,
+    GstStateChange transition);
+
+GST_BOILERPLATE (GstGConfVideoSrc, gst_gconf_video_src, GstBin, GST_TYPE_BIN);
+
+static void
+gst_gconf_video_src_base_init (gpointer klass)
+{
+  GstElementClass *eklass = GST_ELEMENT_CLASS (klass);
+  GstElementDetails gst_gconf_video_src_details = {
+    "GConf video source",
+    "Source/Video",
+    "Video source embedding the GConf-settings for video input",
+    "Ronald Bultje <rbultje@ronald.bitfreak.net>"
+  };
+  GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
+      GST_PAD_SRC,
+      GST_PAD_ALWAYS,
+      GST_STATIC_CAPS_ANY);
+
+  gst_element_class_add_pad_template (eklass,
+      gst_static_pad_template_get (&src_template));
+  gst_element_class_set_details (eklass, &gst_gconf_video_src_details);
+}
+
+static void
+gst_gconf_video_src_class_init (GstGConfVideoSrcClass * klass)
+{
+  GObjectClass *oklass = G_OBJECT_CLASS (klass);
+  GstElementClass *eklass = GST_ELEMENT_CLASS (klass);
+
+  oklass->dispose = gst_gconf_video_src_dispose;
+  eklass->change_state = gst_gconf_video_src_change_state;
+}
+
+/*
+ * Hack to make negotiation work.
+ */
+
+static void
+gst_gconf_video_src_reset (GstGConfVideoSrc * src)
+{
+  GstPad *targetpad;
+
+  /* fakesrc */
+  if (src->kid) {
+    gst_element_set_state (src->kid, GST_STATE_NULL);
+    gst_bin_remove (GST_BIN (src), src->kid);
+  }
+  src->kid = gst_element_factory_make ("fakesrc", "testsrc");
+  gst_bin_add (GST_BIN (src), src->kid);
+
+  targetpad = gst_element_get_pad (src->kid, "src");
+  gst_ghost_pad_set_target (GST_GHOST_PAD (src->pad), targetpad);
+  gst_object_unref (targetpad);
+}
+
+static void
+gst_gconf_video_src_init (GstGConfVideoSrc * src,
+    GstGConfVideoSrcClass * g_class)
+{
+  src->pad = gst_ghost_pad_new_no_target ("src", GST_PAD_SRC);
+  gst_element_add_pad (GST_ELEMENT (src), src->pad);
+
+  gst_gconf_video_src_reset (src);
+
+  src->client = gconf_client_get_default ();
+  gconf_client_add_dir (src->client, GST_GCONF_DIR,
+      GCONF_CLIENT_PRELOAD_RECURSIVE, NULL);
+  gconf_client_notify_add (src->client, GST_GCONF_DIR "/default/videosrc",
+      cb_toggle_element, src, NULL, NULL);
+}
+
+static void
+gst_gconf_video_src_dispose (GObject * object)
+{
+  GstGConfVideoSrc *src = GST_GCONF_VIDEO_SRC (object);
+
+  if (src->client) {
+    g_object_unref (G_OBJECT (src->client));
+    src->client = NULL;
+  }
+
+  GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
+}
+
+static gboolean
+do_toggle_element (GstGConfVideoSrc * src)
+{
+  GstPad *targetpad;
+
+  /* kill old element */
+  if (src->kid) {
+    GST_DEBUG_OBJECT (src, "Removing old kid");
+    gst_element_set_state (src->kid, GST_STATE_NULL);
+    gst_bin_remove (GST_BIN (src), src->kid);
+    src->kid = NULL;
+  }
+
+  GST_DEBUG_OBJECT (src, "Creating new kid");
+  if (!(src->kid = gst_gconf_get_default_video_src ())) {
+    GST_ELEMENT_ERROR (src, LIBRARY, SETTINGS, (NULL),
+        ("Failed to render video source from GConf"));
+    return FALSE;
+  }
+  gst_element_set_state (src->kid, GST_STATE (src));
+  gst_bin_add (GST_BIN (src), src->kid);
+
+  /* re-attach ghostpad */
+  GST_DEBUG_OBJECT (src, "Creating new ghostpad");
+  targetpad = gst_element_get_pad (src->kid, "src");
+  gst_ghost_pad_set_target (GST_GHOST_PAD (src->pad), targetpad);
+  gst_object_unref (targetpad);
+  GST_DEBUG_OBJECT (src, "done changing gconf video source");
+
+  return TRUE;
+}
+
+static void
+cb_toggle_element (GConfClient * client,
+    guint connection_id, GConfEntry * entry, gpointer data)
+{
+  do_toggle_element (GST_GCONF_VIDEO_SRC (data));
+}
+
+static GstStateChangeReturn
+gst_gconf_video_src_change_state (GstElement * element,
+    GstStateChange transition)
+{
+  GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+  GstGConfVideoSrc *src = GST_GCONF_VIDEO_SRC (element);
+
+  switch (transition) {
+    case GST_STATE_CHANGE_NULL_TO_READY:
+      if (!do_toggle_element (src))
+        return GST_STATE_CHANGE_FAILURE;
+      break;
+    default:
+      break;
+  }
+
+  ret = GST_CALL_PARENT_WITH_DEFAULT (GST_ELEMENT_CLASS, change_state,
+      (element, transition), GST_STATE_CHANGE_SUCCESS);
+
+  switch (transition) {
+    case GST_STATE_CHANGE_READY_TO_NULL:
+      gst_gconf_video_src_reset (src);
+      break;
+    default:
+      break;
+  }
+
+  return ret;
+}
diff --git a/ext/gconf/gstgconfvideosrc.h b/ext/gconf/gstgconfvideosrc.h
new file mode 100644 (file)
index 0000000..fa44e4b
--- /dev/null
@@ -0,0 +1,52 @@
+/* GStreamer
+ * (c) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+ * (c) 2005 Tim-Philipp Müller <tim centricular net>
+ *
+ * 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_SRC_H__
+#define __GST_GCONF_VIDEO_SRC_H__
+
+#include <gst/gst.h>
+#include <gconf/gconf-client.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_GCONF_VIDEO_SRC            (gst_gconf_video_src_get_type ())
+#define GST_GCONF_VIDEO_SRC(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GCONF_VIDEO_SRC, GstGConfVideoSrc))
+#define GST_GCONF_VIDEO_SRC_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GCONF_VIDEO_SRC, GstGConfVideoSrc))
+#define GST_IS_GCONF_VIDEO_SRC(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GCONF_VIDEO_SRC))
+#define GST_IS_GCONF_VIDEO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GCONF_VIDEO_SRC))
+
+typedef struct _GstGConfVideoSrc {
+  GstBin parent;
+
+  /* explicit pointers to stuff used */
+  GConfClient *client;
+  GstElement *kid;
+  GstPad *pad;
+} GstGConfVideoSrc;
+
+typedef struct _GstGConfVideoSrcClass {
+  GstBinClass parent_class;
+} GstGConfVideoSrcClass;
+
+GType   gst_gconf_video_src_get_type   (void);
+
+G_END_DECLS
+
+#endif /* __GST_GCONF_VIDEO_SRC_H__ */