mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-23 00:36:51 +00:00
audiofx: adjust to changed semantics of audiofilter _setup method
... 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.
This commit is contained in:
parent
06f1c1817e
commit
9041a588f9
8 changed files with 93 additions and 47 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in a new issue