[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