summaryrefslogtreecommitdiffstats
path: root/gst/filter/gstbpwsinc.c
diff options
context:
space:
mode:
Diffstat (limited to 'gst/filter/gstbpwsinc.c')
-rw-r--r--gst/filter/gstbpwsinc.c141
1 files changed, 53 insertions, 88 deletions
diff --git a/gst/filter/gstbpwsinc.c b/gst/filter/gstbpwsinc.c
index 2304ac68..79fa39d9 100644
--- a/gst/filter/gstbpwsinc.c
+++ b/gst/filter/gstbpwsinc.c
@@ -230,18 +230,18 @@ gst_bpwsinc_class_init (GstBPWSincClass * klass)
gobject_class->get_property = bpwsinc_get_property;
gobject_class->dispose = gst_bpwsinc_dispose;
+ /* FIXME: Don't use the complete possible range but restrict the upper boundary
+ * so automatically generated UIs can use a slider */
g_object_class_install_property (gobject_class, PROP_LOWER_FREQUENCY,
- g_param_spec_double ("lower-frequency", "Lower Frequency",
- "Cut-off lower frequency (Hz)",
- 0.0, G_MAXDOUBLE, 0, G_PARAM_READWRITE));
+ g_param_spec_float ("lower-frequency", "Lower Frequency",
+ "Cut-off lower frequency (Hz)", 0.0, 100000.0, 0, G_PARAM_READWRITE));
g_object_class_install_property (gobject_class, PROP_UPPER_FREQUENCY,
- g_param_spec_double ("upper-frequency", "Upper Frequency",
- "Cut-off upper frequency (Hz)",
- 0.0, G_MAXDOUBLE, 0, G_PARAM_READWRITE));
+ g_param_spec_float ("upper-frequency", "Upper Frequency",
+ "Cut-off upper frequency (Hz)", 0.0, 100000.0, 0, G_PARAM_READWRITE));
g_object_class_install_property (gobject_class, PROP_LENGTH,
g_param_spec_int ("length", "Length",
"Filter kernel length, will be rounded to the next odd number",
- 3, G_MAXINT, 101, G_PARAM_READWRITE));
+ 3, 50000, 101, G_PARAM_READWRITE));
g_object_class_install_property (gobject_class, PROP_MODE,
g_param_spec_enum ("mode", "Mode",
@@ -282,86 +282,51 @@ gst_bpwsinc_init (GstBPWSinc * self, GstBPWSincClass * g_class)
bpwsinc_query_type);
}
-static void
-process_32 (GstBPWSinc * self, gfloat * src, gfloat * dst, guint input_samples)
-{
- gint kernel_length = self->kernel_length;
- gint i, j, k, l;
- gint channels = GST_AUDIO_FILTER (self)->format.channels;
- gint res_start;
-
- /* convolution */
- for (i = 0; i < input_samples; i++) {
- dst[i] = 0.0;
- k = i % channels;
- l = i / channels;
- for (j = 0; j < kernel_length; j++)
- if (l < j)
- dst[i] +=
- self->residue[(kernel_length + l - j) * channels +
- k] * self->kernel[j];
- else
- dst[i] += src[(l - j) * channels + k] * self->kernel[j];
- }
-
- /* copy the tail of the current input buffer to the residue, while
- * keeping parts of the residue if the input buffer is smaller than
- * the kernel length */
- if (input_samples < kernel_length * channels)
- res_start = kernel_length * channels - input_samples;
- else
- res_start = 0;
-
- for (i = 0; i < res_start; i++)
- self->residue[i] = self->residue[i + input_samples];
- for (i = res_start; i < kernel_length * channels; i++)
- self->residue[i] = src[input_samples - kernel_length * channels + i];
-
- self->residue_length += kernel_length * channels - res_start;
- if (self->residue_length > kernel_length * channels)
- self->residue_length = kernel_length * channels;
+#define DEFINE_PROCESS_FUNC(width,ctype) \
+static void \
+process_##width (GstBPWSinc * self, g##ctype * src, g##ctype * dst, guint input_samples) \
+{ \
+ gint kernel_length = self->kernel_length; \
+ gint i, j, k, l; \
+ gint channels = GST_AUDIO_FILTER (self)->format.channels; \
+ gint res_start; \
+ \
+ /* convolution */ \
+ for (i = 0; i < input_samples; i++) { \
+ dst[i] = 0.0; \
+ k = i % channels; \
+ l = i / channels; \
+ for (j = 0; j < kernel_length; j++) \
+ if (l < j) \
+ dst[i] += \
+ self->residue[(kernel_length + l - j) * channels + \
+ k] * self->kernel[j]; \
+ else \
+ dst[i] += src[(l - j) * channels + k] * self->kernel[j]; \
+ } \
+ \
+ /* copy the tail of the current input buffer to the residue, while \
+ * keeping parts of the residue if the input buffer is smaller than \
+ * the kernel length */ \
+ if (input_samples < kernel_length * channels) \
+ res_start = kernel_length * channels - input_samples; \
+ else \
+ res_start = 0; \
+ \
+ for (i = 0; i < res_start; i++) \
+ self->residue[i] = self->residue[i + input_samples]; \
+ for (i = res_start; i < kernel_length * channels; i++) \
+ self->residue[i] = src[input_samples - kernel_length * channels + i]; \
+ \
+ self->residue_length += kernel_length * channels - res_start; \
+ if (self->residue_length > kernel_length * channels) \
+ self->residue_length = kernel_length * channels; \
}
-static void
-process_64 (GstBPWSinc * self, gdouble * src, gdouble * dst,
- guint input_samples)
-{
- gint kernel_length = self->kernel_length;
- gint i, j, k, l;
- gint channels = GST_AUDIO_FILTER (self)->format.channels;
- gint res_start;
-
- /* convolution */
- for (i = 0; i < input_samples; i++) {
- dst[i] = 0.0;
- k = i % channels;
- l = i / channels;
- for (j = 0; j < kernel_length; j++)
- if (l < j)
- dst[i] +=
- self->residue[(kernel_length + l - j) * channels +
- k] * self->kernel[j];
- else
- dst[i] += src[(l - j) * channels + k] * self->kernel[j];
- }
+DEFINE_PROCESS_FUNC (32, float);
+DEFINE_PROCESS_FUNC (64, double);
- /* copy the tail of the current input buffer to the residue, while
- * keeping parts of the residue if the input buffer is smaller than
- * the kernel length */
- if (input_samples < kernel_length * channels)
- res_start = kernel_length * channels - input_samples;
- else
- res_start = 0;
-
- for (i = 0; i < res_start; i++)
- self->residue[i] = self->residue[i + input_samples];
- for (i = res_start; i < kernel_length * channels; i++)
- self->residue[i] = src[input_samples - kernel_length * channels + i];
-
- self->residue_length += kernel_length * channels - res_start;
- if (self->residue_length > kernel_length * channels)
- self->residue_length = kernel_length * channels;
-}
+#undef DEFINE_PROCESS_FUNC
static void
bpwsinc_build_kernel (GstBPWSinc * self)
@@ -860,13 +825,13 @@ bpwsinc_set_property (GObject * object, guint prop_id, const GValue * value,
}
case PROP_LOWER_FREQUENCY:
GST_BASE_TRANSFORM_LOCK (self);
- self->lower_frequency = g_value_get_double (value);
+ self->lower_frequency = g_value_get_float (value);
bpwsinc_build_kernel (self);
GST_BASE_TRANSFORM_UNLOCK (self);
break;
case PROP_UPPER_FREQUENCY:
GST_BASE_TRANSFORM_LOCK (self);
- self->upper_frequency = g_value_get_double (value);
+ self->upper_frequency = g_value_get_float (value);
bpwsinc_build_kernel (self);
GST_BASE_TRANSFORM_UNLOCK (self);
break;
@@ -899,10 +864,10 @@ bpwsinc_get_property (GObject * object, guint prop_id, GValue * value,
g_value_set_int (value, self->kernel_length);
break;
case PROP_LOWER_FREQUENCY:
- g_value_set_double (value, self->lower_frequency);
+ g_value_set_float (value, self->lower_frequency);
break;
case PROP_UPPER_FREQUENCY:
- g_value_set_double (value, self->upper_frequency);
+ g_value_set_float (value, self->upper_frequency);
break;
case PROP_MODE:
g_value_set_enum (value, self->mode);