summaryrefslogtreecommitdiff
path: root/gst/equalizer
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim.muller@collabora.co.uk>2012-02-17 17:21:53 +0000
committerTim-Philipp Müller <tim.muller@collabora.co.uk>2012-02-17 18:35:54 +0000
commitf76f7374ea2227b8422aa6c3b1e084fff0180d0a (patch)
treef0b2199b25bab533ceec254f1900b58ccd0949b6 /gst/equalizer
parent5cb42081a5c401192cc5b2897181eb05e260adab (diff)
downloadgstreamer-plugins-good-f76f7374ea2227b8422aa6c3b1e084fff0180d0a.tar.gz
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.
Diffstat (limited to 'gst/equalizer')
-rw-r--r--gst/equalizer/gstiirequalizer.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/gst/equalizer/gstiirequalizer.c b/gst/equalizer/gstiirequalizer.c
index d66db1a4d..ffd2c4348 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);
}