From 561ce54b2780a3cc00c793e39bf41f6e1c2f4148 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Thu, 30 May 2013 11:40:01 +0200 Subject: [PATCH] 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 /* 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 -- 2.7.4