[0.10] gst-plugins-good: equalizer: fix switching from passthrough to non-passthrough when parameters change

Tim Müller tpm at kemper.freedesktop.org
Fri Feb 17 12:30:22 PST 2012


Module: gst-plugins-good
Branch: 0.10
Commit: f6c2fcbc40d7a66bfaa06efe338200889c733bc3
URL:    http://cgit.freedesktop.org/gstreamer/gst-plugins-good/commit/?id=f6c2fcbc40d7a66bfaa06efe338200889c733bc3

Author: Tim-Philipp Müller <tim.muller at collabora.co.uk>
Date:   Fri Feb 17 17:21:53 2012 +0000

equalizer: fix switching from passthrough to non-passthrough when parameters change

commit b5bf0294 moved the if(need_new_coefficients) set_passthrough(equ)
after the if(is_passthrough) return FLOW_OK shortcut, so the passthrough
mode would never get updated even if the coefficients change.

Fixes equalizer-test doing .. nothing.

---

 gst/equalizer/gstiirequalizer.c |   11 +++++++++--
 1 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/gst/equalizer/gstiirequalizer.c b/gst/equalizer/gstiirequalizer.c
index d66db1a..ffd2c43 100644
--- a/gst/equalizer/gstiirequalizer.c
+++ b/gst/equalizer/gstiirequalizer.c
@@ -834,11 +834,16 @@ gst_iir_equalizer_transform_ip (GstBaseTransform * btrans, GstBuffer * buf)
   GstAudioFilter *filter = GST_AUDIO_FILTER (btrans);
   GstIirEqualizer *equ = GST_IIR_EQUALIZER (btrans);
   GstClockTime timestamp;
+  gboolean need_new_coefficients;
 
   if (G_UNLIKELY (filter->format.channels < 1 || equ->process == NULL))
     return GST_FLOW_NOT_NEGOTIATED;
 
-  if (gst_base_transform_is_passthrough (btrans))
+  BANDS_LOCK (equ);
+  need_new_coefficients = equ->need_new_coefficients;
+  BANDS_UNLOCK (equ);
+
+  if (!need_new_coefficients && gst_base_transform_is_passthrough (btrans))
     return GST_FLOW_OK;
 
   timestamp = GST_BUFFER_TIMESTAMP (buf);
@@ -850,14 +855,16 @@ gst_iir_equalizer_transform_ip (GstBaseTransform * btrans, GstBuffer * buf)
     guint f, nf = equ->freq_band_count;
 
     gst_object_sync_values (G_OBJECT (equ), timestamp);
+
     /* sync values for bands too */
+    /* FIXME: iterating equ->bands is not thread-safe here */
     for (f = 0; f < nf; f++) {
       gst_object_sync_values (G_OBJECT (filters[f]), timestamp);
     }
   }
 
   BANDS_LOCK (equ);
-  if (equ->need_new_coefficients) {
+  if (need_new_coefficients) {
     update_coefficients (equ);
     set_passthrough (equ);
   }



More information about the gstreamer-commits mailing list