audiofx: adjust to changed semantics of audiofilter _setup method
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Fri, 23 Mar 2012 17:42:48 +0000 (18:42 +0100)
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Fri, 23 Mar 2012 17:48:53 +0000 (18:48 +0100)
... in that it will now call subclass with info on proposed audio format
without having set that info already in base class.  As such,
subclass can not rely on audio format info being available there.

gst/audiofx/audiochebband.c
gst/audiofx/audiocheblimit.c
gst/audiofx/audiofirfilter.c
gst/audiofx/audiofxbasefirfilter.c
gst/audiofx/audiofxbasefirfilter.h
gst/audiofx/audiokaraoke.c
gst/audiofx/audiowsincband.c
gst/audiofx/audiowsinclimit.c

index b6c01eb..4d0b09c 100644 (file)
@@ -389,9 +389,15 @@ generate_biquad_coefficients (GstAudioChebBand * filter,
 }
 
 static void
-generate_coefficients (GstAudioChebBand * filter)
+generate_coefficients (GstAudioChebBand * filter, const GstAudioInfo * info)
 {
-  gint rate = GST_AUDIO_FILTER_RATE (filter);
+  gint rate;
+
+  if (info) {
+    rate = GST_AUDIO_INFO_RATE (info);
+  } else {
+    rate = GST_AUDIO_FILTER_RATE (filter);
+  }
 
   if (rate == 0) {
     gdouble *a = g_new0 (gdouble, 1);
@@ -572,37 +578,37 @@ gst_audio_cheb_band_set_property (GObject * object, guint prop_id,
     case PROP_MODE:
       g_mutex_lock (&filter->lock);
       filter->mode = g_value_get_enum (value);
-      generate_coefficients (filter);
+      generate_coefficients (filter, NULL);
       g_mutex_unlock (&filter->lock);
       break;
     case PROP_TYPE:
       g_mutex_lock (&filter->lock);
       filter->type = g_value_get_int (value);
-      generate_coefficients (filter);
+      generate_coefficients (filter, NULL);
       g_mutex_unlock (&filter->lock);
       break;
     case PROP_LOWER_FREQUENCY:
       g_mutex_lock (&filter->lock);
       filter->lower_frequency = g_value_get_float (value);
-      generate_coefficients (filter);
+      generate_coefficients (filter, NULL);
       g_mutex_unlock (&filter->lock);
       break;
     case PROP_UPPER_FREQUENCY:
       g_mutex_lock (&filter->lock);
       filter->upper_frequency = g_value_get_float (value);
-      generate_coefficients (filter);
+      generate_coefficients (filter, NULL);
       g_mutex_unlock (&filter->lock);
       break;
     case PROP_RIPPLE:
       g_mutex_lock (&filter->lock);
       filter->ripple = g_value_get_float (value);
-      generate_coefficients (filter);
+      generate_coefficients (filter, NULL);
       g_mutex_unlock (&filter->lock);
       break;
     case PROP_POLES:
       g_mutex_lock (&filter->lock);
       filter->poles = GST_ROUND_UP_4 (g_value_get_int (value));
-      generate_coefficients (filter);
+      generate_coefficients (filter, NULL);
       g_mutex_unlock (&filter->lock);
       break;
     default:
@@ -649,7 +655,7 @@ gst_audio_cheb_band_setup (GstAudioFilter * base, const GstAudioInfo * info)
 {
   GstAudioChebBand *filter = GST_AUDIO_CHEB_BAND (base);
 
-  generate_coefficients (filter);
+  generate_coefficients (filter, info);
 
   return GST_AUDIO_FILTER_CLASS (parent_class)->setup (base, info);
 }
index e1fcdfa..385160b 100644 (file)
@@ -343,9 +343,19 @@ generate_biquad_coefficients (GstAudioChebLimit * filter,
 }
 
 static void
-generate_coefficients (GstAudioChebLimit * filter)
+generate_coefficients (GstAudioChebLimit * filter, const GstAudioInfo * info)
 {
-  if (GST_AUDIO_FILTER_RATE (filter) == 0) {
+  gint rate;
+
+  if (info) {
+    rate = GST_AUDIO_INFO_RATE (info);
+  } else {
+    rate = GST_AUDIO_FILTER_RATE (filter);
+  }
+
+  GST_LOG_OBJECT (filter, "cutoff %f", filter->cutoff);
+
+  if (rate == 0) {
     gdouble *a = g_new0 (gdouble, 1);
     gdouble *b = g_new0 (gdouble, 1);
 
@@ -358,7 +368,7 @@ generate_coefficients (GstAudioChebLimit * filter)
     return;
   }
 
-  if (filter->cutoff >= GST_AUDIO_FILTER_RATE (filter) / 2.0) {
+  if (filter->cutoff >= rate / 2.0) {
     gdouble *a = g_new0 (gdouble, 1);
     gdouble *b = g_new0 (gdouble, 1);
 
@@ -492,31 +502,31 @@ gst_audio_cheb_limit_set_property (GObject * object, guint prop_id,
     case PROP_MODE:
       g_mutex_lock (&filter->lock);
       filter->mode = g_value_get_enum (value);
-      generate_coefficients (filter);
+      generate_coefficients (filter, NULL);
       g_mutex_unlock (&filter->lock);
       break;
     case PROP_TYPE:
       g_mutex_lock (&filter->lock);
       filter->type = g_value_get_int (value);
-      generate_coefficients (filter);
+      generate_coefficients (filter, NULL);
       g_mutex_unlock (&filter->lock);
       break;
     case PROP_CUTOFF:
       g_mutex_lock (&filter->lock);
       filter->cutoff = g_value_get_float (value);
-      generate_coefficients (filter);
+      generate_coefficients (filter, NULL);
       g_mutex_unlock (&filter->lock);
       break;
     case PROP_RIPPLE:
       g_mutex_lock (&filter->lock);
       filter->ripple = g_value_get_float (value);
-      generate_coefficients (filter);
+      generate_coefficients (filter, NULL);
       g_mutex_unlock (&filter->lock);
       break;
     case PROP_POLES:
       g_mutex_lock (&filter->lock);
       filter->poles = GST_ROUND_UP_2 (g_value_get_int (value));
-      generate_coefficients (filter);
+      generate_coefficients (filter, NULL);
       g_mutex_unlock (&filter->lock);
       break;
     default:
@@ -560,7 +570,7 @@ gst_audio_cheb_limit_setup (GstAudioFilter * base, const GstAudioInfo * info)
 {
   GstAudioChebLimit *filter = GST_AUDIO_CHEB_LIMIT (base);
 
-  generate_coefficients (filter);
+  generate_coefficients (filter, info);
 
   return GST_AUDIO_FILTER_CLASS (parent_class)->setup (base, info);
 }
index 57fa360..3c01700 100644 (file)
@@ -163,7 +163,7 @@ gst_audio_fir_filter_update_kernel (GstAudioFIRFilter * self, GValueArray * va)
   }
 
   gst_audio_fx_base_fir_filter_set_kernel (GST_AUDIO_FX_BASE_FIR_FILTER (self),
-      kernel, self->kernel->n_values, self->latency);
+      kernel, self->kernel->n_values, self->latency, NULL);
 }
 
 static void
index a213b04..d19af6b 100644 (file)
@@ -880,6 +880,8 @@ gst_audio_fx_base_fir_filter_transform (GstBaseTransform * base,
     gint64 tmp = diff;
     diff = generated_samples - diff;
     generated_samples = tmp;
+  } else {
+    diff = 0;
   }
 
   gst_buffer_resize (outbuf, diff * bps * channels,
@@ -1027,9 +1029,12 @@ gst_audio_fx_base_fir_filter_sink_event (GstBaseTransform * base,
 
 void
 gst_audio_fx_base_fir_filter_set_kernel (GstAudioFXBaseFIRFilter * self,
-    gdouble * kernel, guint kernel_length, guint64 latency)
+    gdouble * kernel, guint kernel_length, guint64 latency,
+    const GstAudioInfo * info)
 {
   gboolean latency_changed;
+  GstAudioFormat format;
+  gint channels;
 
   g_return_if_fail (kernel != NULL);
   g_return_if_fail (self != NULL);
@@ -1064,9 +1069,16 @@ gst_audio_fx_base_fir_filter_set_kernel (GstAudioFXBaseFIRFilter * self,
   self->kernel = kernel;
   self->kernel_length = kernel_length;
 
+  if (info) {
+    format = GST_AUDIO_INFO_FORMAT (info);
+    channels = GST_AUDIO_INFO_CHANNELS (info);
+  } else {
+    format = GST_AUDIO_FILTER_FORMAT (self);
+    channels = GST_AUDIO_FILTER_CHANNELS (self);
+  }
+
   gst_audio_fx_base_fir_filter_calculate_frequency_response (self);
-  gst_audio_fx_base_fir_filter_select_process_function (self,
-      GST_AUDIO_FILTER_FORMAT (self), GST_AUDIO_FILTER_CHANNELS (self));
+  gst_audio_fx_base_fir_filter_select_process_function (self, format, channels);
 
   if (latency_changed) {
     self->latency = latency;
index 263c97d..5bbc50b 100644 (file)
@@ -93,7 +93,8 @@ struct _GstAudioFXBaseFIRFilterClass {
 };
 
 GType gst_audio_fx_base_fir_filter_get_type (void);
-void gst_audio_fx_base_fir_filter_set_kernel (GstAudioFXBaseFIRFilter *filter, gdouble *kernel, guint kernel_length, guint64 latency);
+void gst_audio_fx_base_fir_filter_set_kernel (GstAudioFXBaseFIRFilter *filter, gdouble *kernel,
+                                              guint kernel_length, guint64 latency, const GstAudioInfo * info);
 void gst_audio_fx_base_fir_filter_push_residue (GstAudioFXBaseFIRFilter *filter);
 
 G_END_DECLS
index da35c2b..c737dd5 100644 (file)
@@ -161,12 +161,17 @@ gst_audio_karaoke_init (GstAudioKaraoke * filter)
 }
 
 static void
-update_filter (GstAudioKaraoke * filter)
+update_filter (GstAudioKaraoke * filter, const GstAudioInfo * info)
 {
   gfloat A, B, C;
   gint rate;
 
-  rate = GST_AUDIO_FILTER_RATE (filter);
+  if (info) {
+    rate = GST_AUDIO_INFO_RATE (info);
+  } else {
+    rate = GST_AUDIO_FILTER_RATE (filter);
+  }
+
   if (rate == 0)
     return;
 
@@ -198,11 +203,11 @@ gst_audio_karaoke_set_property (GObject * object, guint prop_id,
       break;
     case PROP_FILTER_BAND:
       filter->filter_band = g_value_get_float (value);
-      update_filter (filter);
+      update_filter (filter, NULL);
       break;
     case PROP_FILTER_WIDTH:
       filter->filter_width = g_value_get_float (value);
-      update_filter (filter);
+      update_filter (filter, NULL);
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -258,7 +263,7 @@ gst_audio_karaoke_setup (GstAudioFilter * base, const GstAudioInfo * info)
       ret = FALSE;
       break;
   }
-  update_filter (filter);
+  update_filter (filter, info);
 
   return ret;
 }
index 682e00a..fdba187 100644 (file)
@@ -220,7 +220,8 @@ gst_audio_wsincband_init (GstAudioWSincBand * self)
 }
 
 static void
-gst_audio_wsincband_build_kernel (GstAudioWSincBand * self)
+gst_audio_wsincband_build_kernel (GstAudioWSincBand * self,
+    const GstAudioInfo * info)
 {
   gint i = 0;
   gdouble sum = 0.0;
@@ -232,8 +233,13 @@ gst_audio_wsincband_build_kernel (GstAudioWSincBand * self)
 
   len = self->kernel_length;
 
-  rate = GST_AUDIO_FILTER_RATE (self);
-  channels = GST_AUDIO_FILTER_CHANNELS (self);
+  if (info) {
+    rate = GST_AUDIO_INFO_RATE (info);
+    channels = GST_AUDIO_INFO_CHANNELS (info);
+  } else {
+    rate = GST_AUDIO_FILTER_RATE (self);
+    channels = GST_AUDIO_FILTER_CHANNELS (self);
+  }
 
   if (rate == 0) {
     GST_DEBUG ("rate not set yet");
@@ -365,7 +371,7 @@ gst_audio_wsincband_build_kernel (GstAudioWSincBand * self)
   }
 
   gst_audio_fx_base_fir_filter_set_kernel (GST_AUDIO_FX_BASE_FIR_FILTER (self),
-      kernel, self->kernel_length, (len - 1) / 2);
+      kernel, self->kernel_length, (len - 1) / 2, info);
 }
 
 /* GstAudioFilter vmethod implementations */
@@ -376,7 +382,7 @@ gst_audio_wsincband_setup (GstAudioFilter * base, const GstAudioInfo * info)
 {
   GstAudioWSincBand *self = GST_AUDIO_WSINC_BAND (base);
 
-  gst_audio_wsincband_build_kernel (self);
+  gst_audio_wsincband_build_kernel (self, info);
 
   return GST_AUDIO_FILTER_CLASS (parent_class)->setup (base, info);
 }
@@ -412,7 +418,7 @@ gst_audio_wsincband_set_property (GObject * object, guint prop_id,
         gst_audio_fx_base_fir_filter_push_residue (GST_AUDIO_FX_BASE_FIR_FILTER
             (self));
         self->kernel_length = val;
-        gst_audio_wsincband_build_kernel (self);
+        gst_audio_wsincband_build_kernel (self, NULL);
       }
       g_mutex_unlock (&self->lock);
       break;
@@ -420,25 +426,25 @@ gst_audio_wsincband_set_property (GObject * object, guint prop_id,
     case PROP_LOWER_FREQUENCY:
       g_mutex_lock (&self->lock);
       self->lower_frequency = g_value_get_float (value);
-      gst_audio_wsincband_build_kernel (self);
+      gst_audio_wsincband_build_kernel (self, NULL);
       g_mutex_unlock (&self->lock);
       break;
     case PROP_UPPER_FREQUENCY:
       g_mutex_lock (&self->lock);
       self->upper_frequency = g_value_get_float (value);
-      gst_audio_wsincband_build_kernel (self);
+      gst_audio_wsincband_build_kernel (self, NULL);
       g_mutex_unlock (&self->lock);
       break;
     case PROP_MODE:
       g_mutex_lock (&self->lock);
       self->mode = g_value_get_enum (value);
-      gst_audio_wsincband_build_kernel (self);
+      gst_audio_wsincband_build_kernel (self, NULL);
       g_mutex_unlock (&self->lock);
       break;
     case PROP_WINDOW:
       g_mutex_lock (&self->lock);
       self->window = g_value_get_enum (value);
-      gst_audio_wsincband_build_kernel (self);
+      gst_audio_wsincband_build_kernel (self, NULL);
       g_mutex_unlock (&self->lock);
       break;
     default:
index f46f5d3..8064e3d 100644 (file)
@@ -215,7 +215,8 @@ gst_audio_wsinclimit_init (GstAudioWSincLimit * self)
 }
 
 static void
-gst_audio_wsinclimit_build_kernel (GstAudioWSincLimit * self)
+gst_audio_wsinclimit_build_kernel (GstAudioWSincLimit * self,
+    const GstAudioInfo * info)
 {
   gint i = 0;
   gdouble sum = 0.0;
@@ -226,8 +227,13 @@ gst_audio_wsinclimit_build_kernel (GstAudioWSincLimit * self)
 
   len = self->kernel_length;
 
-  rate = GST_AUDIO_FILTER_RATE (self);
-  channels = GST_AUDIO_FILTER_CHANNELS (self);
+  if (info) {
+    rate = GST_AUDIO_INFO_RATE (info);
+    channels = GST_AUDIO_INFO_CHANNELS (info);
+  } else {
+    rate = GST_AUDIO_FILTER_RATE (self);
+    channels = GST_AUDIO_FILTER_CHANNELS (self);
+  }
 
   if (rate == 0) {
     GST_DEBUG ("rate not set yet");
@@ -300,7 +306,7 @@ gst_audio_wsinclimit_build_kernel (GstAudioWSincLimit * self)
   }
 
   gst_audio_fx_base_fir_filter_set_kernel (GST_AUDIO_FX_BASE_FIR_FILTER (self),
-      kernel, self->kernel_length, (len - 1) / 2);
+      kernel, self->kernel_length, (len - 1) / 2, info);
 }
 
 /* GstAudioFilter vmethod implementations */
@@ -311,7 +317,7 @@ gst_audio_wsinclimit_setup (GstAudioFilter * base, const GstAudioInfo * info)
 {
   GstAudioWSincLimit *self = GST_AUDIO_WSINC_LIMIT (base);
 
-  gst_audio_wsinclimit_build_kernel (self);
+  gst_audio_wsinclimit_build_kernel (self, info);
 
   return GST_AUDIO_FILTER_CLASS (parent_class)->setup (base, info);
 }
@@ -347,7 +353,7 @@ gst_audio_wsinclimit_set_property (GObject * object, guint prop_id,
         gst_audio_fx_base_fir_filter_push_residue (GST_AUDIO_FX_BASE_FIR_FILTER
             (self));
         self->kernel_length = val;
-        gst_audio_wsinclimit_build_kernel (self);
+        gst_audio_wsinclimit_build_kernel (self, NULL);
       }
       g_mutex_unlock (&self->lock);
       break;
@@ -355,19 +361,19 @@ gst_audio_wsinclimit_set_property (GObject * object, guint prop_id,
     case PROP_FREQUENCY:
       g_mutex_lock (&self->lock);
       self->cutoff = g_value_get_float (value);
-      gst_audio_wsinclimit_build_kernel (self);
+      gst_audio_wsinclimit_build_kernel (self, NULL);
       g_mutex_unlock (&self->lock);
       break;
     case PROP_MODE:
       g_mutex_lock (&self->lock);
       self->mode = g_value_get_enum (value);
-      gst_audio_wsinclimit_build_kernel (self);
+      gst_audio_wsinclimit_build_kernel (self, NULL);
       g_mutex_unlock (&self->lock);
       break;
     case PROP_WINDOW:
       g_mutex_lock (&self->lock);
       self->window = g_value_get_enum (value);
-      gst_audio_wsinclimit_build_kernel (self);
+      gst_audio_wsinclimit_build_kernel (self, NULL);
       g_mutex_unlock (&self->lock);
       break;
     default: