diff --git a/gst/audiofx/audiochebband.c b/gst/audiofx/audiochebband.c index b6c01ebd0f..4d0b09cc5f 100644 --- a/gst/audiofx/audiochebband.c +++ b/gst/audiofx/audiochebband.c @@ -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); } diff --git a/gst/audiofx/audiocheblimit.c b/gst/audiofx/audiocheblimit.c index e1fcdfa76d..385160bc6c 100644 --- a/gst/audiofx/audiocheblimit.c +++ b/gst/audiofx/audiocheblimit.c @@ -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); } diff --git a/gst/audiofx/audiofirfilter.c b/gst/audiofx/audiofirfilter.c index 57fa360e1e..3c01700db8 100644 --- a/gst/audiofx/audiofirfilter.c +++ b/gst/audiofx/audiofirfilter.c @@ -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 diff --git a/gst/audiofx/audiofxbasefirfilter.c b/gst/audiofx/audiofxbasefirfilter.c index a213b04485..d19af6b8a6 100644 --- a/gst/audiofx/audiofxbasefirfilter.c +++ b/gst/audiofx/audiofxbasefirfilter.c @@ -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; diff --git a/gst/audiofx/audiofxbasefirfilter.h b/gst/audiofx/audiofxbasefirfilter.h index 263c97d766..5bbc50b51d 100644 --- a/gst/audiofx/audiofxbasefirfilter.h +++ b/gst/audiofx/audiofxbasefirfilter.h @@ -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 diff --git a/gst/audiofx/audiokaraoke.c b/gst/audiofx/audiokaraoke.c index da35c2bad8..c737dd5c11 100644 --- a/gst/audiofx/audiokaraoke.c +++ b/gst/audiofx/audiokaraoke.c @@ -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; } diff --git a/gst/audiofx/audiowsincband.c b/gst/audiofx/audiowsincband.c index 682e00a537..fdba187df1 100644 --- a/gst/audiofx/audiowsincband.c +++ b/gst/audiofx/audiowsincband.c @@ -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: diff --git a/gst/audiofx/audiowsinclimit.c b/gst/audiofx/audiowsinclimit.c index f46f5d3cc0..8064e3dbf2 100644 --- a/gst/audiofx/audiowsinclimit.c +++ b/gst/audiofx/audiowsinclimit.c @@ -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: