diff options
Diffstat (limited to 'gst/audiofx/audiocheblimit.c')
-rw-r--r-- | gst/audiofx/audiocheblimit.c | 120 |
1 files changed, 57 insertions, 63 deletions
diff --git a/gst/audiofx/audiocheblimit.c b/gst/audiofx/audiocheblimit.c index 344db9f1..1374faf9 100644 --- a/gst/audiofx/audiocheblimit.c +++ b/gst/audiofx/audiocheblimit.c @@ -29,7 +29,7 @@ */ /** - * SECTION:element-audiochebyshevfreqlimit + * SECTION:element-audiocheblimit * @short_description: Chebyshev low pass and high pass filter * * <refsect2> @@ -61,9 +61,9 @@ * <title>Example launch line</title> * <para> * <programlisting> - * gst-launch audiotestsrc freq=1500 ! audioconvert ! audiochebyshevfreqlimit mode=low-pass cutoff=1000 poles=4 ! audioconvert ! alsasink - * gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audiochebyshevfreqlimit mode=high-pass cutoff=400 ripple=0.2 ! audioconvert ! alsasink - * gst-launch audiotestsrc wave=white-noise ! audioconvert ! audiochebyshevfreqlimit mode=low-pass cutoff=800 type=2 ! audioconvert ! alsasink + * gst-launch audiotestsrc freq=1500 ! audioconvert ! audiocheblimit mode=low-pass cutoff=1000 poles=4 ! audioconvert ! alsasink + * gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audiocheblimit mode=high-pass cutoff=400 ripple=0.2 ! audioconvert ! alsasink + * gst-launch audiotestsrc wave=white-noise ! audioconvert ! audiocheblimit mode=low-pass cutoff=800 type=2 ! audioconvert ! alsasink * </programlisting> * </para> * </refsect2> @@ -81,13 +81,13 @@ #include <math.h> -#include "audiochebyshevfreqlimit.h" +#include "audiocheblimit.h" -#define GST_CAT_DEFAULT gst_audio_chebyshev_freq_limit_debug +#define GST_CAT_DEFAULT gst_audio_cheb_limit_debug GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); static const GstElementDetails element_details = -GST_ELEMENT_DETAILS ("AudioChebyshevFreqLimit", +GST_ELEMENT_DETAILS ("AudioChebLimit", "Filter/Effect/Audio", "Chebyshev low pass and high pass filter", "Sebastian Dröge <slomo@circular-chaos.org>"); @@ -117,27 +117,25 @@ enum " channels = (int) [ 1, MAX ]" #define DEBUG_INIT(bla) \ - GST_DEBUG_CATEGORY_INIT (gst_audio_chebyshev_freq_limit_debug, "audiochebyshevfreqlimit", 0, "audiochebyshevfreqlimit element"); + GST_DEBUG_CATEGORY_INIT (gst_audio_cheb_limit_debug, "audiocheblimit", 0, "audiocheblimit element"); -GST_BOILERPLATE_FULL (GstAudioChebyshevFreqLimit, - gst_audio_chebyshev_freq_limit, GstAudioFilter, GST_TYPE_AUDIO_FILTER, - DEBUG_INIT); +GST_BOILERPLATE_FULL (GstAudioChebLimit, + gst_audio_cheb_limit, GstAudioFilter, GST_TYPE_AUDIO_FILTER, DEBUG_INIT); -static void gst_audio_chebyshev_freq_limit_set_property (GObject * object, +static void gst_audio_cheb_limit_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); -static void gst_audio_chebyshev_freq_limit_get_property (GObject * object, +static void gst_audio_cheb_limit_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); -static gboolean gst_audio_chebyshev_freq_limit_setup (GstAudioFilter * filter, +static gboolean gst_audio_cheb_limit_setup (GstAudioFilter * filter, GstRingBufferSpec * format); static GstFlowReturn -gst_audio_chebyshev_freq_limit_transform_ip (GstBaseTransform * base, - GstBuffer * buf); -static gboolean gst_audio_chebyshev_freq_limit_start (GstBaseTransform * base); +gst_audio_cheb_limit_transform_ip (GstBaseTransform * base, GstBuffer * buf); +static gboolean gst_audio_cheb_limit_start (GstBaseTransform * base); -static void process_64 (GstAudioChebyshevFreqLimit * filter, +static void process_64 (GstAudioChebLimit * filter, gdouble * data, guint num_samples); -static void process_32 (GstAudioChebyshevFreqLimit * filter, +static void process_32 (GstAudioChebLimit * filter, gfloat * data, guint num_samples); enum @@ -146,9 +144,9 @@ enum MODE_HIGH_PASS }; -#define GST_TYPE_AUDIO_CHEBYSHEV_FREQ_LIMIT_MODE (gst_audio_chebyshev_freq_limit_mode_get_type ()) +#define GST_TYPE_AUDIO_CHEBYSHEV_FREQ_LIMIT_MODE (gst_audio_cheb_limit_mode_get_type ()) static GType -gst_audio_chebyshev_freq_limit_mode_get_type (void) +gst_audio_cheb_limit_mode_get_type (void) { static GType gtype = 0; @@ -161,7 +159,7 @@ gst_audio_chebyshev_freq_limit_mode_get_type (void) {0, NULL, NULL} }; - gtype = g_enum_register_static ("GstAudioChebyshevFreqLimitMode", values); + gtype = g_enum_register_static ("GstAudioChebLimitMode", values); } return gtype; } @@ -169,7 +167,7 @@ gst_audio_chebyshev_freq_limit_mode_get_type (void) /* GObject vmethod implementations */ static void -gst_audio_chebyshev_freq_limit_base_init (gpointer klass) +gst_audio_cheb_limit_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GstCaps *caps; @@ -183,9 +181,9 @@ gst_audio_chebyshev_freq_limit_base_init (gpointer klass) } static void -gst_audio_chebyshev_freq_limit_dispose (GObject * object) +gst_audio_cheb_limit_dispose (GObject * object) { - GstAudioChebyshevFreqLimit *filter = GST_AUDIO_CHEBYSHEV_FREQ_LIMIT (object); + GstAudioChebLimit *filter = GST_AUDIO_CHEB_LIMIT (object); if (filter->a) { g_free (filter->a); @@ -198,7 +196,7 @@ gst_audio_chebyshev_freq_limit_dispose (GObject * object) } if (filter->channels) { - GstAudioChebyshevFreqLimitChannelCtx *ctx; + GstAudioChebLimitChannelCtx *ctx; gint i, channels = GST_AUDIO_FILTER (filter)->format.channels; for (i = 0; i < channels; i++) { @@ -215,8 +213,7 @@ gst_audio_chebyshev_freq_limit_dispose (GObject * object) } static void -gst_audio_chebyshev_freq_limit_class_init (GstAudioChebyshevFreqLimitClass * - klass) +gst_audio_cheb_limit_class_init (GstAudioChebLimitClass * klass) { GObjectClass *gobject_class; GstBaseTransformClass *trans_class; @@ -226,9 +223,9 @@ gst_audio_chebyshev_freq_limit_class_init (GstAudioChebyshevFreqLimitClass * trans_class = (GstBaseTransformClass *) klass; filter_class = (GstAudioFilterClass *) klass; - gobject_class->set_property = gst_audio_chebyshev_freq_limit_set_property; - gobject_class->get_property = gst_audio_chebyshev_freq_limit_get_property; - gobject_class->dispose = gst_audio_chebyshev_freq_limit_dispose; + gobject_class->set_property = gst_audio_cheb_limit_set_property; + gobject_class->get_property = gst_audio_cheb_limit_get_property; + gobject_class->dispose = gst_audio_cheb_limit_dispose; g_object_class_install_property (gobject_class, PROP_MODE, g_param_spec_enum ("mode", "Mode", @@ -256,16 +253,15 @@ gst_audio_chebyshev_freq_limit_class_init (GstAudioChebyshevFreqLimitClass * "Number of poles to use, will be rounded up to the next even number", 2, 32, 4, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE)); - filter_class->setup = - GST_DEBUG_FUNCPTR (gst_audio_chebyshev_freq_limit_setup); + filter_class->setup = GST_DEBUG_FUNCPTR (gst_audio_cheb_limit_setup); trans_class->transform_ip = - GST_DEBUG_FUNCPTR (gst_audio_chebyshev_freq_limit_transform_ip); - trans_class->start = GST_DEBUG_FUNCPTR (gst_audio_chebyshev_freq_limit_start); + GST_DEBUG_FUNCPTR (gst_audio_cheb_limit_transform_ip); + trans_class->start = GST_DEBUG_FUNCPTR (gst_audio_cheb_limit_start); } static void -gst_audio_chebyshev_freq_limit_init (GstAudioChebyshevFreqLimit * filter, - GstAudioChebyshevFreqLimitClass * klass) +gst_audio_cheb_limit_init (GstAudioChebLimit * filter, + GstAudioChebLimitClass * klass) { filter->cutoff = 0.0; filter->mode = MODE_LOW_PASS; @@ -281,7 +277,7 @@ gst_audio_chebyshev_freq_limit_init (GstAudioChebyshevFreqLimit * filter, } static void -generate_biquad_coefficients (GstAudioChebyshevFreqLimit * filter, +generate_biquad_coefficients (GstAudioChebLimit * filter, gint p, gdouble * a0, gdouble * a1, gdouble * a2, gdouble * b1, gdouble * b2) { @@ -471,7 +467,7 @@ calculate_gain (gdouble * a, gdouble * b, gint num_a, gint num_b, gdouble zr, } static void -generate_coefficients (GstAudioChebyshevFreqLimit * filter) +generate_coefficients (GstAudioChebLimit * filter) { gint channels = GST_AUDIO_FILTER (filter)->format.channels; @@ -486,7 +482,7 @@ generate_coefficients (GstAudioChebyshevFreqLimit * filter) } if (filter->channels) { - GstAudioChebyshevFreqLimitChannelCtx *ctx; + GstAudioChebLimitChannelCtx *ctx; gint i; for (i = 0; i < channels; i++) { @@ -504,7 +500,7 @@ generate_coefficients (GstAudioChebyshevFreqLimit * filter) filter->a = g_new0 (gdouble, 1); filter->a[0] = 1.0; filter->num_b = 0; - filter->channels = g_new0 (GstAudioChebyshevFreqLimitChannelCtx, channels); + filter->channels = g_new0 (GstAudioChebLimitChannelCtx, channels); GST_LOG_OBJECT (filter, "rate was not set yet"); return; } @@ -516,7 +512,7 @@ generate_coefficients (GstAudioChebyshevFreqLimit * filter) filter->a = g_new0 (gdouble, 1); filter->a[0] = (filter->mode == MODE_LOW_PASS) ? 1.0 : 0.0; filter->num_b = 0; - filter->channels = g_new0 (GstAudioChebyshevFreqLimitChannelCtx, channels); + filter->channels = g_new0 (GstAudioChebLimitChannelCtx, channels); GST_LOG_OBJECT (filter, "cutoff was higher than nyquist frequency"); return; } else if (filter->cutoff <= 0.0) { @@ -524,7 +520,7 @@ generate_coefficients (GstAudioChebyshevFreqLimit * filter) filter->a = g_new0 (gdouble, 1); filter->a[0] = (filter->mode == MODE_LOW_PASS) ? 0.0 : 1.0; filter->num_b = 0; - filter->channels = g_new0 (GstAudioChebyshevFreqLimitChannelCtx, channels); + filter->channels = g_new0 (GstAudioChebLimitChannelCtx, channels); GST_LOG_OBJECT (filter, "cutoff is lower than zero"); return; } @@ -540,9 +536,9 @@ generate_coefficients (GstAudioChebyshevFreqLimit * filter) filter->num_b = np + 1; filter->b = b = g_new0 (gdouble, np + 3); - filter->channels = g_new0 (GstAudioChebyshevFreqLimitChannelCtx, channels); + filter->channels = g_new0 (GstAudioChebLimitChannelCtx, channels); for (i = 0; i < channels; i++) { - GstAudioChebyshevFreqLimitChannelCtx *ctx = &filter->channels[i]; + GstAudioChebLimitChannelCtx *ctx = &filter->channels[i]; ctx->x = g_new0 (gdouble, np + 1); ctx->y = g_new0 (gdouble, np + 1); @@ -623,10 +619,10 @@ generate_coefficients (GstAudioChebyshevFreqLimit * filter) } static void -gst_audio_chebyshev_freq_limit_set_property (GObject * object, guint prop_id, +gst_audio_cheb_limit_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { - GstAudioChebyshevFreqLimit *filter = GST_AUDIO_CHEBYSHEV_FREQ_LIMIT (object); + GstAudioChebLimit *filter = GST_AUDIO_CHEB_LIMIT (object); switch (prop_id) { case PROP_MODE: @@ -666,10 +662,10 @@ gst_audio_chebyshev_freq_limit_set_property (GObject * object, guint prop_id, } static void -gst_audio_chebyshev_freq_limit_get_property (GObject * object, guint prop_id, +gst_audio_cheb_limit_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { - GstAudioChebyshevFreqLimit *filter = GST_AUDIO_CHEBYSHEV_FREQ_LIMIT (object); + GstAudioChebLimit *filter = GST_AUDIO_CHEB_LIMIT (object); switch (prop_id) { case PROP_MODE: @@ -696,17 +692,16 @@ gst_audio_chebyshev_freq_limit_get_property (GObject * object, guint prop_id, /* GstAudioFilter vmethod implementations */ static gboolean -gst_audio_chebyshev_freq_limit_setup (GstAudioFilter * base, - GstRingBufferSpec * format) +gst_audio_cheb_limit_setup (GstAudioFilter * base, GstRingBufferSpec * format) { - GstAudioChebyshevFreqLimit *filter = GST_AUDIO_CHEBYSHEV_FREQ_LIMIT (base); + GstAudioChebLimit *filter = GST_AUDIO_CHEB_LIMIT (base); gboolean ret = TRUE; if (format->width == 32) - filter->process = (GstAudioChebyshevFreqLimitProcessFunc) + filter->process = (GstAudioChebLimitProcessFunc) process_32; else if (format->width == 64) - filter->process = (GstAudioChebyshevFreqLimitProcessFunc) + filter->process = (GstAudioChebLimitProcessFunc) process_64; else ret = FALSE; @@ -717,8 +712,8 @@ gst_audio_chebyshev_freq_limit_setup (GstAudioFilter * base, } static inline gdouble -process (GstAudioChebyshevFreqLimit * filter, - GstAudioChebyshevFreqLimitChannelCtx * ctx, gdouble x0) +process (GstAudioChebLimit * filter, + GstAudioChebLimitChannelCtx * ctx, gdouble x0) { gdouble val = filter->a[0] * x0; gint i, j; @@ -757,7 +752,7 @@ process (GstAudioChebyshevFreqLimit * filter, #define DEFINE_PROCESS_FUNC(width,ctype) \ static void \ -process_##width (GstAudioChebyshevFreqLimit * filter, \ +process_##width (GstAudioChebLimit * filter, \ g##ctype * data, guint num_samples) \ { \ gint i, j, channels = GST_AUDIO_FILTER (filter)->format.channels; \ @@ -778,10 +773,9 @@ DEFINE_PROCESS_FUNC (64, double); /* GstBaseTransform vmethod implementations */ static GstFlowReturn -gst_audio_chebyshev_freq_limit_transform_ip (GstBaseTransform * base, - GstBuffer * buf) +gst_audio_cheb_limit_transform_ip (GstBaseTransform * base, GstBuffer * buf) { - GstAudioChebyshevFreqLimit *filter = GST_AUDIO_CHEBYSHEV_FREQ_LIMIT (base); + GstAudioChebLimit *filter = GST_AUDIO_CHEB_LIMIT (base); guint num_samples = GST_BUFFER_SIZE (buf) / (GST_AUDIO_FILTER (filter)->format.width / 8); @@ -801,11 +795,11 @@ gst_audio_chebyshev_freq_limit_transform_ip (GstBaseTransform * base, static gboolean -gst_audio_chebyshev_freq_limit_start (GstBaseTransform * base) +gst_audio_cheb_limit_start (GstBaseTransform * base) { - GstAudioChebyshevFreqLimit *filter = GST_AUDIO_CHEBYSHEV_FREQ_LIMIT (base); + GstAudioChebLimit *filter = GST_AUDIO_CHEB_LIMIT (base); gint channels = GST_AUDIO_FILTER (filter)->format.channels; - GstAudioChebyshevFreqLimitChannelCtx *ctx; + GstAudioChebLimitChannelCtx *ctx; gint i; /* Reset the history of input and output values if |