}
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);
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:
{
GstAudioChebBand *filter = GST_AUDIO_CHEB_BAND (base);
- generate_coefficients (filter);
+ generate_coefficients (filter, info);
return GST_AUDIO_FILTER_CLASS (parent_class)->setup (base, info);
}
}
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);
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);
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:
{
GstAudioChebLimit *filter = GST_AUDIO_CHEB_LIMIT (base);
- generate_coefficients (filter);
+ generate_coefficients (filter, info);
return GST_AUDIO_FILTER_CLASS (parent_class)->setup (base, info);
}
}
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
gint64 tmp = diff;
diff = generated_samples - diff;
generated_samples = tmp;
+ } else {
+ diff = 0;
}
gst_buffer_resize (outbuf, diff * bps * channels,
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);
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;
};
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
}
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;
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);
ret = FALSE;
break;
}
- update_filter (filter);
+ update_filter (filter, info);
return ret;
}
}
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;
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");
}
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 */
{
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);
}
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;
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:
}
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;
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");
}
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 */
{
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);
}
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;
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: