summaryrefslogtreecommitdiffstats
path: root/gst/equalizer
diff options
context:
space:
mode:
authorSebastian Dröge <slomo@circular-chaos.org>2008-05-30 11:03:57 +0000
committerSebastian Dröge <slomo@circular-chaos.org>2008-05-30 11:03:57 +0000
commitc17d49ee20e40211c35ec86d50d4669ed68d0f38 (patch)
tree10b4639aaf20cb13496dab584e7326cb2138e88d /gst/equalizer
parent4ffab084be68d64390a46829edc602ed8725635a (diff)
gst/equalizer/gstiirequalizer.*: Update the filter coefficients only when needed in the transform_ip function and cor...
Original commit message from CVS: * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_band_set_property), (gst_iir_equalizer_init), (setup_filter), (set_passthrough), (update_coefficients), (gst_iir_equalizer_compute_frequencies), (gst_iir_equalizer_transform_ip): * gst/equalizer/gstiirequalizer.h: Update the filter coefficients only when needed in the transform_ip function and correctly set the element into passthrough mode if the gain of all bands is 0.
Diffstat (limited to 'gst/equalizer')
-rw-r--r--gst/equalizer/gstiirequalizer.c69
-rw-r--r--gst/equalizer/gstiirequalizer.h2
2 files changed, 55 insertions, 16 deletions
diff --git a/gst/equalizer/gstiirequalizer.c b/gst/equalizer/gstiirequalizer.c
index 1cde3247..b0954549 100644
--- a/gst/equalizer/gstiirequalizer.c
+++ b/gst/equalizer/gstiirequalizer.c
@@ -120,8 +120,11 @@ struct _GstIirEqualizerBandClass
};
static GType gst_iir_equalizer_band_get_type (void);
+
static void setup_filter (GstIirEqualizer * equ, GstIirEqualizerBand * band);
+static void set_passthrough (GstIirEqualizer * equ);
+
static void
gst_iir_equalizer_band_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec)
@@ -138,10 +141,10 @@ gst_iir_equalizer_band_set_property (GObject * object, guint prop_id,
GstIirEqualizer *equ =
GST_IIR_EQUALIZER (gst_object_get_parent (GST_OBJECT (band)));
+ equ->need_new_coefficients = equ->need_new_coefficients ||
+ (band->gain != gain);
band->gain = gain;
- if (GST_AUDIO_FILTER (equ)->format.rate) {
- setup_filter (equ, band);
- }
+
gst_object_unref (equ);
GST_DEBUG_OBJECT (band, "changed gain = %lf ", band->gain);
}
@@ -156,10 +159,9 @@ gst_iir_equalizer_band_set_property (GObject * object, guint prop_id,
GstIirEqualizer *equ =
GST_IIR_EQUALIZER (gst_object_get_parent (GST_OBJECT (band)));
+ equ->need_new_coefficients = equ->need_new_coefficients ||
+ (band->freq != freq);
band->freq = freq;
- if (GST_AUDIO_FILTER (equ)->format.rate) {
- setup_filter (equ, band);
- }
gst_object_unref (equ);
GST_DEBUG_OBJECT (band, "changed freq = %lf ", band->freq);
}
@@ -174,10 +176,9 @@ gst_iir_equalizer_band_set_property (GObject * object, guint prop_id,
GstIirEqualizer *equ =
GST_IIR_EQUALIZER (gst_object_get_parent (GST_OBJECT (band)));
+ equ->need_new_coefficients = equ->need_new_coefficients ||
+ (band->width != width);
band->width = width;
- if (GST_AUDIO_FILTER (equ)->format.rate) {
- setup_filter (equ, band);
- }
gst_object_unref (equ);
GST_DEBUG_OBJECT (band, "changed width = %lf ", band->width);
}
@@ -310,6 +311,7 @@ static void
gst_iir_equalizer_base_init (gpointer g_class)
{
GstAudioFilterClass *audiofilter_class = GST_AUDIO_FILTER_CLASS (g_class);
+
GstCaps *caps;
caps = gst_caps_from_string (ALLOWED_CAPS);
@@ -321,7 +323,9 @@ static void
gst_iir_equalizer_class_init (GstIirEqualizerClass * klass)
{
GstAudioFilterClass *audio_filter_class = (GstAudioFilterClass *) klass;
+
GstBaseTransformClass *btrans_class = (GstBaseTransformClass *) klass;
+
GObjectClass *gobject_class = (GObjectClass *) klass;
gobject_class->finalize = gst_iir_equalizer_finalize;
@@ -333,13 +337,14 @@ gst_iir_equalizer_class_init (GstIirEqualizerClass * klass)
static void
gst_iir_equalizer_init (GstIirEqualizer * eq, GstIirEqualizerClass * g_class)
{
- /* nothing to do here */
+ eq->need_new_coefficients = TRUE;
}
static void
gst_iir_equalizer_finalize (GObject * object)
{
GstIirEqualizer *equ = GST_IIR_EQUALIZER (object);
+
gint i;
for (i = 0; i < equ->freq_band_count; i++) {
@@ -385,7 +390,9 @@ setup_filter (GstIirEqualizer * equ, GstIirEqualizerBand * band)
*/
{
gdouble gain, omega, bw;
+
gdouble edge_gain, gamma;
+
gdouble alpha, beta;
@@ -414,6 +421,7 @@ setup_filter (GstIirEqualizer * equ, GstIirEqualizerBand * band)
band->a2 = 0.0;
band->b1 = 0.0;
band->b2 = 0.0;
+ gain = 1.0;
goto out;
} else {
bw = 2.0 * M_PI * (band->width / GST_AUDIO_FILTER (equ)->format.rate);
@@ -439,11 +447,38 @@ setup_filter (GstIirEqualizer * equ, GstIirEqualizerBand * band)
}
}
+static void
+set_passthrough (GstIirEqualizer * equ)
+{
+ gint i;
+
+ gboolean passthrough = TRUE;
+
+ for (i = 0; i < equ->freq_band_count; i++) {
+ passthrough = passthrough && (equ->bands[i]->gain == 0.0);
+ }
+
+ gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (equ), passthrough);
+ GST_DEBUG ("Passthrough mode: %d\n", passthrough);
+}
+
+static void
+update_coefficients (GstIirEqualizer * equ)
+{
+ gint i;
+
+ for (i = 0; i < equ->freq_band_count; i++) {
+ setup_filter (equ, equ->bands[i]);
+ }
+}
+
void
gst_iir_equalizer_compute_frequencies (GstIirEqualizer * equ, guint new_count)
{
guint old_count, i;
+
gdouble freq0, freq1, step;
+
gchar name[20];
old_count = equ->freq_band_count;
@@ -503,12 +538,7 @@ gst_iir_equalizer_compute_frequencies (GstIirEqualizer * equ, guint new_count)
freq0 = freq1;
}
-
- if (GST_AUDIO_FILTER (equ)->format.rate) {
- for (i = 0; i < new_count; i++) {
- setup_filter (equ, equ->bands[i]);
- }
- }
+ equ->need_new_coefficients = TRUE;
}
/* start of code that is type specific */
@@ -572,7 +602,9 @@ static GstFlowReturn
gst_iir_equalizer_transform_ip (GstBaseTransform * btrans, GstBuffer * buf)
{
GstAudioFilter *filter = GST_AUDIO_FILTER (btrans);
+
GstIirEqualizer *equ = GST_IIR_EQUALIZER (btrans);
+
GstClockTime timestamp;
if (gst_base_transform_is_passthrough (btrans))
@@ -581,6 +613,11 @@ gst_iir_equalizer_transform_ip (GstBaseTransform * btrans, GstBuffer * buf)
if (G_UNLIKELY (filter->format.channels < 1 || equ->process == NULL))
return GST_FLOW_NOT_NEGOTIATED;
+ if (equ->need_new_coefficients) {
+ update_coefficients (equ);
+ set_passthrough (equ);
+ }
+
timestamp = GST_BUFFER_TIMESTAMP (buf);
timestamp =
gst_segment_to_stream_time (&btrans->segment, GST_FORMAT_TIME, timestamp);
diff --git a/gst/equalizer/gstiirequalizer.h b/gst/equalizer/gstiirequalizer.h
index 6e7839a3..37ee8725 100644
--- a/gst/equalizer/gstiirequalizer.h
+++ b/gst/equalizer/gstiirequalizer.h
@@ -60,6 +60,8 @@ struct _GstIirEqualizer
gpointer history;
guint history_size;
+ gboolean need_new_coefficients;
+
ProcessFunc process;
};