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

This will later allow to set per-stream volumes and mute status.
This commit is contained in:
Sebastian Dröge 2013-05-30 11:40:01 +02:00
parent 0b933ff87b
commit 561ce54b27
2 changed files with 104 additions and 2 deletions

View file

@ -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);

View file

@ -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