Merge branch 'master' into 0.11
[platform/upstream/gstreamer.git] / gst / autodetect / gstautoaudiosrc.c
index afc12a9..ca7cb78 100644 (file)
@@ -62,15 +62,8 @@ static void gst_auto_audio_src_set_property (GObject * object, guint prop_id,
 static void gst_auto_audio_src_get_property (GObject * object, guint prop_id,
     GValue * value, GParamSpec * pspec);
 
-GST_BOILERPLATE (GstAutoAudioSrc, gst_auto_audio_src, GstBin, GST_TYPE_BIN);
-
-static const GstElementDetails gst_auto_audio_src_details =
-GST_ELEMENT_DETAILS ("Auto audio source",
-    "Source/Audio",
-    "Wrapper audio source for automatically detected audio source",
-    "Ronald Bultje <rbultje@ronald.bitfreak.net>\n"
-    "Jan Schmidt <thaytan@noraisin.net>\n"
-    "Stefan Kost <ensonic@users.sf.net>");
+#define gst_auto_audio_src_parent_class parent_class
+G_DEFINE_TYPE (GstAutoAudioSrc, gst_auto_audio_src, GST_TYPE_BIN);
 
 static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
     GST_PAD_SRC,
@@ -78,17 +71,6 @@ static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
     GST_STATIC_CAPS_ANY);
 
 static void
-gst_auto_audio_src_base_init (gpointer klass)
-{
-  GstElementClass *eklass = GST_ELEMENT_CLASS (klass);
-
-  gst_element_class_add_pad_template (eklass,
-      gst_static_pad_template_get (&src_template));
-
-  gst_element_class_set_details (eklass, &gst_auto_audio_src_details);
-}
-
-static void
 gst_auto_audio_src_class_init (GstAutoAudioSrcClass * klass)
 {
   GObjectClass *gobject_class;
@@ -97,13 +79,11 @@ gst_auto_audio_src_class_init (GstAutoAudioSrcClass * klass)
   gobject_class = G_OBJECT_CLASS (klass);
   eklass = GST_ELEMENT_CLASS (klass);
 
-  gobject_class->dispose =
-      (GObjectFinalizeFunc) GST_DEBUG_FUNCPTR (gst_auto_audio_src_dispose);
+  gobject_class->dispose = (GObjectFinalizeFunc) gst_auto_audio_src_dispose;
+  gobject_class->set_property = gst_auto_audio_src_set_property;
+  gobject_class->get_property = gst_auto_audio_src_get_property;
+
   eklass->change_state = GST_DEBUG_FUNCPTR (gst_auto_audio_src_change_state);
-  gobject_class->set_property =
-      GST_DEBUG_FUNCPTR (gst_auto_audio_src_set_property);
-  gobject_class->get_property =
-      GST_DEBUG_FUNCPTR (gst_auto_audio_src_get_property);
 
   /**
    * GstAutoAudioSrc:filter-caps
@@ -114,33 +94,45 @@ gst_auto_audio_src_class_init (GstAutoAudioSrcClass * klass)
    *
    * This property can only be set before the element goes to the READY state.
    *
-   * Since: 0.10.12
+   * Since: 0.10.14
    **/
   g_object_class_install_property (gobject_class, PROP_CAPS,
       g_param_spec_boxed ("filter-caps", "Filter caps",
           "Filter sink candidates using these caps.", GST_TYPE_CAPS,
-          G_PARAM_READWRITE));
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+  gst_element_class_add_pad_template (eklass,
+      gst_static_pad_template_get (&src_template));
+
+  gst_element_class_set_details_simple (eklass, "Auto audio source",
+      "Source/Audio",
+      "Wrapper audio source for automatically detected audio source",
+      "Jan Schmidt <thaytan@noraisin.net>, "
+      "Stefan Kost <ensonic@users.sf.net>");
 }
 
 static void
-gst_auto_audio_src_dispose (GstAutoAudioSrc * sink)
+gst_auto_audio_src_dispose (GstAutoAudioSrc * src)
 {
-  gst_auto_audio_src_clear_kid (sink);
+  gst_auto_audio_src_clear_kid (src);
 
-  if (sink->filter_caps)
-    gst_caps_unref (sink->filter_caps);
-  sink->filter_caps = NULL;
+  if (src->filter_caps)
+    gst_caps_unref (src->filter_caps);
+  src->filter_caps = NULL;
 
-  G_OBJECT_CLASS (parent_class)->dispose ((GObject *) sink);
+  G_OBJECT_CLASS (parent_class)->dispose ((GObject *) src);
 }
 
 static void
-gst_auto_audio_src_clear_kid (GstAutoAudioSrc * sink)
+gst_auto_audio_src_clear_kid (GstAutoAudioSrc * src)
 {
-  if (sink->kid) {
-    gst_element_set_state (sink->kid, GST_STATE_NULL);
-    gst_bin_remove (GST_BIN (sink), sink->kid);
-    sink->kid = NULL;
+  if (src->kid) {
+    gst_element_set_state (src->kid, GST_STATE_NULL);
+    gst_bin_remove (GST_BIN (src), src->kid);
+    src->kid = NULL;
+
+    /* Don't lose SOURCE flag */
+    GST_OBJECT_FLAG_SET (src, GST_ELEMENT_IS_SOURCE);
   }
 }
 
@@ -169,7 +161,7 @@ static GstStaticCaps raw_caps =
     GST_STATIC_CAPS ("audio/x-raw-int; audio/x-raw-float");
 
 static void
-gst_auto_audio_src_init (GstAutoAudioSrc * src, GstAutoAudioSrcClass * g_class)
+gst_auto_audio_src_init (GstAutoAudioSrc * src)
 {
   src->pad = gst_ghost_pad_new_no_target ("src", GST_PAD_SRC);
   gst_element_add_pad (GST_ELEMENT (src), src->pad);
@@ -180,7 +172,7 @@ gst_auto_audio_src_init (GstAutoAudioSrc * src, GstAutoAudioSrcClass * g_class)
   src->filter_caps = gst_static_caps_get (&raw_caps);
 
   /* mark as source */
-  GST_OBJECT_FLAG_UNSET (src, GST_ELEMENT_IS_SINK);
+  GST_OBJECT_FLAG_SET (src, GST_ELEMENT_IS_SOURCE);
 }
 
 static gboolean
@@ -225,7 +217,7 @@ gst_auto_audio_src_create_element_with_pretty_name (GstAutoAudioSrc * src,
   GstElement *element;
   gchar *name, *marker;
 
-  marker = g_strdup (GST_PLUGIN_FEATURE (factory)->name);
+  marker = g_strdup (GST_OBJECT_NAME (factory));
   if (g_str_has_suffix (marker, "src"))
     marker[strlen (marker) - 4] = '\0';
   if (g_str_has_prefix (marker, "gst"))
@@ -248,7 +240,7 @@ gst_auto_audio_src_find_best (GstAutoAudioSrc * src)
   GSList *errors = NULL;
   GstBus *bus = gst_bus_new ();
   GstPad *el_pad = NULL;
-  GstCaps *el_caps = NULL, *intersect = NULL;
+  GstCaps *el_caps = NULL;
   gboolean no_match = TRUE;
 
   list = gst_registry_feature_filter (gst_registry_get_default (),
@@ -267,21 +259,19 @@ gst_auto_audio_src_find_best (GstAutoAudioSrc * src)
     if ((el = gst_auto_audio_src_create_element_with_pretty_name (src, f))) {
       GstStateChangeReturn ret;
 
-      GST_DEBUG_OBJECT (src, "Testing %s", GST_PLUGIN_FEATURE (f)->name);
+      GST_DEBUG_OBJECT (src, "Testing %s", GST_OBJECT_NAME (f));
 
       /* If autoAudioSrc has been provided with filter caps,
        * accept only sources that match with the filter caps */
       if (src->filter_caps) {
         el_pad = gst_element_get_static_pad (GST_ELEMENT (el), "src");
-        el_caps = gst_pad_get_caps (el_pad);
+        el_caps = gst_pad_get_caps (el_pad, NULL);
         gst_object_unref (el_pad);
         GST_DEBUG_OBJECT (src,
             "Checking caps: %" GST_PTR_FORMAT " vs. %" GST_PTR_FORMAT,
             src->filter_caps, el_caps);
-        intersect = gst_caps_intersect (src->filter_caps, el_caps);
-        no_match = gst_caps_is_empty (intersect);
+        no_match = !gst_caps_can_intersect (src->filter_caps, el_caps);
         gst_caps_unref (el_caps);
-        gst_caps_unref (intersect);
 
         if (no_match) {
           GST_DEBUG_OBJECT (src, "Incompatible caps");