gst/equalizer/gstiirequalizer.*: Update the filter coefficients only when needed...
authorSebastian Dröge <slomo@circular-chaos.org>
Fri, 30 May 2008 11:03:57 +0000 (11:03 +0000)
committerSebastian Dröge <slomo@circular-chaos.org>
Fri, 30 May 2008 11:03:57 +0000 (11:03 +0000)
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.

ChangeLog
gst/equalizer/gstiirequalizer.c
gst/equalizer/gstiirequalizer.h

index fcca16e..03dbf73 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2008-05-30  Sebastian Dröge  <slomo@circular-chaos.org>
+
+       * 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.
+
 2008-05-29  Wim Taymans  <wim.taymans@collabora.co.uk>
 
        Based on patch by: Sebastian Keller <sebastian-keller at gmx dot de>
index 1cde324..b095454 100644 (file)
@@ -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);
index 6e7839a..37ee872 100644 (file)
@@ -60,6 +60,8 @@ struct _GstIirEqualizer
   gpointer history;
   guint history_size;
 
+  gboolean need_new_coefficients;
+
   ProcessFunc process;
 };