[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gstreamer-cvs
Subject:    gst-plugins-base: adder: Add custom GstPad subclass to hold additional data and properties
From:       slomo () kemper ! freedesktop ! org (Sebastian Dröge)
Date:       2013-05-30 21:56:56
Message-ID: 20130530215656.4DDBE76AB0 () kemper ! freedesktop ! org
[Download RAW message or body]

Module: gst-plugins-base
Branch: master
Commit: 561ce54b2780a3cc00c793e39bf41f6e1c2f4148
URL:    http://cgit.freedesktop.org/gstreamer/gst-plugins-base/commit/?id=561ce54b2780a3cc00c793e39bf41f6e1c2f4148


Author: Sebastian Dröge <slomo@circular-chaos.org>
Date:   Thu May 30 11:40:01 2013 +0200

adder: Add custom GstPad subclass to hold additional data and properties

This will later allow to set per-stream volumes and mute status.

---

 gst/adder/gstadder.c |   82 +++++++++++++++++++++++++++++++++++++++++++++++++-
 gst/adder/gstadder.h |   24 ++++++++++++++-
 2 files changed, 104 insertions(+), 2 deletions(-)

diff --git a/gst/adder/gstadder.c b/gst/adder/gstadder.c
index bf5b11d..9b36a90 100644
--- a/gst/adder/gstadder.c
+++ b/gst/adder/gstadder.c
@@ -49,6 +49,85 @@
 #include <string.h>             /* strcmp */
 #include "gstadderorc.h"
 
+#define DEFAULT_PAD_VOLUME (1.0)
+#define DEFAULT_PAD_MUTE (FALSE)
+
+enum
+{
+  PROP_PAD_0,
+  PROP_PAD_VOLUME,
+  PROP_PAD_MUTE
+};
+
+G_DEFINE_TYPE (GstAdderPad, gst_adder_pad, GST_TYPE_PAD);
+
+static void
+gst_adder_pad_get_property (GObject * object, guint prop_id,
+    GValue * value, GParamSpec * pspec)
+{
+  GstAdderPad *pad = GST_ADDER_PAD (object);
+
+  switch (prop_id) {
+    case PROP_PAD_VOLUME:
+      g_value_set_double (value, pad->volume);
+      break;
+    case PROP_PAD_MUTE:
+      g_value_set_boolean (value, pad->mute);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
+
+static void
+gst_adder_pad_set_property (GObject * object, guint prop_id,
+    const GValue * value, GParamSpec * pspec)
+{
+  GstAdderPad *pad = GST_ADDER_PAD (object);
+
+  switch (prop_id) {
+    case PROP_PAD_VOLUME:
+      GST_OBJECT_LOCK (pad);
+      pad->volume = g_value_get_double (value);
+      GST_OBJECT_UNLOCK (pad);
+      break;
+    case PROP_PAD_MUTE:
+      GST_OBJECT_LOCK (pad);
+      pad->mute = g_value_get_boolean (value);
+      GST_OBJECT_UNLOCK (pad);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
+
+static void
+gst_adder_pad_class_init (GstAdderPadClass * klass)
+{
+  GObjectClass *gobject_class = (GObjectClass *) klass;
+
+  gobject_class->set_property = gst_adder_pad_set_property;
+  gobject_class->get_property = gst_adder_pad_get_property;
+
+  g_object_class_install_property (gobject_class, PROP_PAD_VOLUME,
+      g_param_spec_double ("volume", "Volume", "Volume of this pad",
+          0.0, 10.0, DEFAULT_PAD_VOLUME,
+          G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS));
+  g_object_class_install_property (gobject_class, PROP_PAD_MUTE,
+      g_param_spec_boolean ("mute", "Mute", "Mute this pad",
+          DEFAULT_PAD_MUTE,
+          G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS));
+}
+
+static void
+gst_adder_pad_init (GstAdderPad * pad)
+{
+  pad->volume = DEFAULT_PAD_VOLUME;
+  pad->mute = DEFAULT_PAD_MUTE;
+}
+
 enum
 {
   PROP_0,
@@ -1032,7 +1111,8 @@ gst_adder_request_new_pad (GstElement * element, GstPadTemplate \
* templ,  padcount = g_atomic_int_add (&adder->padcount, 1);
 
   name = g_strdup_printf ("sink_%u", padcount);
-  newpad = gst_pad_new_from_template (templ, name);
+  newpad = g_object_new (GST_TYPE_ADDER_PAD, "name", name, "direction",
+      templ->direction, "template", templ, NULL);
   GST_DEBUG_OBJECT (adder, "request new pad %s", name);
   g_free (name);
 
diff --git a/gst/adder/gstadder.h b/gst/adder/gstadder.h
index 53048cb..2524817 100644
--- a/gst/adder/gstadder.h
+++ b/gst/adder/gstadder.h
@@ -38,7 +38,9 @@ G_BEGIN_DECLS
 
 typedef struct _GstAdder             GstAdder;
 typedef struct _GstAdderClass        GstAdderClass;
-typedef struct _GstAdderInputChannel GstAdderInputChannel;
+
+typedef struct _GstAdderPad GstAdderPad;
+typedef struct _GstAdderPadClass GstAdderPadClass;
 
 typedef void (*GstAdderFunction) (gpointer out, gpointer in, guint size);
 
@@ -91,6 +93,26 @@ struct _GstAdderClass {
 
 GType    gst_adder_get_type (void);
 
+#define GST_TYPE_ADDER_PAD            (gst_adder_pad_get_type())
+#define GST_ADDER_PAD(obj)            \
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ADDER_PAD,GstAdderPad)) +#define \
GST_IS_ADDER_PAD(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ADDER_PAD)) \
+#define GST_ADDER_PAD_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass) \
,GST_TYPE_ADDER_PAD,GstAdderPadClass)) +#define GST_IS_ADDER_PAD_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_ADDER_PAD)) +#define \
GST_ADDER_PAD_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj) \
,GST_TYPE_ADDER_PAD,GstAdderPadClass)) +
+struct _GstAdderPad {
+  GstPad parent;
+
+  gdouble volume;
+  gboolean mute;
+};
+
+struct _GstAdderPadClass {
+  GstPadClass parent_class;
+};
+
+GType gst_adder_pad_get_type (void);
+
 G_END_DECLS
 
 



_______________________________________________
gstreamer-commits mailing list
gstreamer-commits@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/gstreamer-commits


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic