/* * ============================================================================ * * Preamble * * ============================================================================ */ /* * stuff from the C library */ #include /* * stuff from gobject/gstreamer */ #include #include #include #include /* * stuff from gstlal */ #include /* * ============================================================================ * * GStreamer Boiler Plate * * ============================================================================ */ static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE( GST_BASE_TRANSFORM_SINK_NAME, GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS( "audio/x-raw-float, " \ "rate = (int) [1, MAX], " \ "channels = (int) 1, " \ "endianness = (int) BYTE_ORDER, " \ "width = (int) 64" ) ); static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE( GST_BASE_TRANSFORM_SRC_NAME, GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS( "audio/x-raw-float, " \ "rate = (int) [1, MAX], " \ "channels = (int) 1, " \ "endianness = (int) BYTE_ORDER, " \ "width = (int) 64" ) ); GST_BOILERPLATE( GSTLALMean, gstlal_mean, GstBaseTransform, GST_TYPE_BASE_TRANSFORM ); enum property { ARG_N = 1 }; #define DEFAULT_N 1 /* * ============================================================================ * * GObject Method Overrides * * ============================================================================ */ /* * set_property() */ static void set_property(GObject *object, enum property prop_id, const GValue *value, GParamSpec *pspec) { GSTLALMean *element = GSTLAL_MEAN(object); GST_OBJECT_LOCK(element); switch (prop_id) { case ARG_N: { guint32 old_n = element->n; element->n = g_value_get_uint(value); if(element->n != old_n) g_object_notify(object, "n"); break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; } GST_OBJECT_UNLOCK(element); } /* * get_property() */ static void get_property(GObject *object, enum property prop_id, GValue *value, GParamSpec *pspec) { GSTLALMean *element = GSTLAL_MEAN(object); GST_OBJECT_LOCK(element); switch (prop_id) { case ARG_N: g_value_set_uint(value, element->n); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; } GST_OBJECT_UNLOCK(element); } /* * finalize() */ static void finalize(GObject *object) { GSTLALMean *element = GSTLAL_MEAN(object); /* * free resources */ /* * chain to parent class' finalize() method */ G_OBJECT_CLASS(parent_class)->finalize(object); } /* * base_init() */ static void gstlal_mean_base_init(gpointer gclass) { GstElementClass *element_class = GST_ELEMENT_CLASS(gclass); GstBaseTransformClass *transform_class = GST_BASE_TRANSFORM_CLASS(gclass); gst_element_class_set_details_simple(element_class, "Average of last N samples", "Filter/Audio", "Each output sample is the average of the N most recent samples", "Kipp Cannon "); gst_element_class_add_pad_template(element_class, gst_static_pad_template_get(&src_factory)); gst_element_class_add_pad_template(element_class, gst_static_pad_template_get(&sink_factory)); } /* * class_init() */ static void gstlal_mean_class_init(GSTLALMeanClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); gobject_class->set_property = GST_DEBUG_FUNCPTR(set_property); gobject_class->get_property = GST_DEBUG_FUNCPTR(get_property); gobject_class->finalize = GST_DEBUG_FUNCPTR(finalize); g_object_class_install_property( gobject_class, ARG_N, g_param_spec_uint( "n", "n", "Number of samples to average.", 0, G_MAXUINT, DEFAULT_N, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS ) ); } /* * init() */ static void gstlal_mean_init(GSTLALMean *filter, GSTLALMeanClass *kclass) { filter->n = DEFAULT_N; gst_base_transform_set_gap_aware(GST_BASE_TRANSFORM(filter), TRUE); }