summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Dröge <slomo@circular-chaos.org>2007-08-17 15:05:17 +0000
committerSebastian Dröge <slomo@circular-chaos.org>2007-08-17 15:05:17 +0000
commitce2c75404c68257a6bdf76208d588b18ff9c6252 (patch)
treee006d30de514363c941dc8ad02e37d07abbb65c4
parent03afa9b296733bd745f5dd66a15f56aa11a95433 (diff)
downloadgst-plugins-bad-ce2c75404c68257a6bdf76208d588b18ff9c6252.tar.gz
gst-plugins-bad-ce2c75404c68257a6bdf76208d588b18ff9c6252.tar.bz2
gst-plugins-bad-ce2c75404c68257a6bdf76208d588b18ff9c6252.zip
Use generator macros for the process functions for the different sample types, add lower upper boundaries for the GOb...
Original commit message from CVS: * gst/filter/gstbpwsinc.c: (gst_bpwsinc_class_init), (bpwsinc_set_property), (bpwsinc_get_property): * gst/filter/gstbpwsinc.h: * gst/filter/gstlpwsinc.c: (gst_lpwsinc_class_init), (gst_lpwsinc_init), (lpwsinc_build_kernel), (lpwsinc_set_property), (lpwsinc_get_property): * gst/filter/gstlpwsinc.h: * tests/check/elements/lpwsinc.c: (GST_START_TEST): Use generator macros for the process functions for the different sample types, add lower upper boundaries for the GObject properties so automatically generated UIs can use sliders and change frequency properties to floats to save a bit of memory, even ints would in theory be enough. Also rename frequency to cutoff for consistency reasons. * docs/plugins/gst-plugins-bad-plugins.args: * docs/plugins/gst-plugins-bad-plugins.signals: * docs/plugins/inspect/plugin-gstrtpmanager.xml: Regenerated for the above changes.
-rw-r--r--ChangeLog21
-rw-r--r--docs/plugins/gst-plugins-bad-plugins.args22
-rw-r--r--docs/plugins/gst-plugins-bad-plugins.signals102
-rw-r--r--docs/plugins/inspect/plugin-gstrtpmanager.xml2
-rw-r--r--gst/filter/gstbpwsinc.c141
-rw-r--r--gst/filter/gstbpwsinc.h2
-rw-r--r--gst/filter/gstlpwsinc.c143
-rw-r--r--gst/filter/gstlpwsinc.h2
-rw-r--r--tests/check/elements/lpwsinc.c10
9 files changed, 255 insertions, 190 deletions
diff --git a/ChangeLog b/ChangeLog
index c74f1140..db681edf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,24 @@
+2007-08-17 Sebastian Dröge <slomo@circular-chaos.org>
+
+ * gst/filter/gstbpwsinc.c: (gst_bpwsinc_class_init),
+ (bpwsinc_set_property), (bpwsinc_get_property):
+ * gst/filter/gstbpwsinc.h:
+ * gst/filter/gstlpwsinc.c: (gst_lpwsinc_class_init),
+ (gst_lpwsinc_init), (lpwsinc_build_kernel), (lpwsinc_set_property),
+ (lpwsinc_get_property):
+ * gst/filter/gstlpwsinc.h:
+ * tests/check/elements/lpwsinc.c: (GST_START_TEST):
+ Use generator macros for the process functions for the different
+ sample types, add lower upper boundaries for the GObject properties
+ so automatically generated UIs can use sliders and change frequency
+ properties to floats to save a bit of memory, even ints would in
+ theory be enough. Also rename frequency to cutoff for consistency
+ reasons.
+ * docs/plugins/gst-plugins-bad-plugins.args:
+ * docs/plugins/gst-plugins-bad-plugins.signals:
+ * docs/plugins/inspect/plugin-gstrtpmanager.xml:
+ Regenerated for the above changes.
+
2007-08-17 Stefan Kost <ensonic@users.sf.net>
* ext/amrwb/gstamrwbparse.c:
diff --git a/docs/plugins/gst-plugins-bad-plugins.args b/docs/plugins/gst-plugins-bad-plugins.args
index aaa99cbd..24b1ed0f 100644
--- a/docs/plugins/gst-plugins-bad-plugins.args
+++ b/docs/plugins/gst-plugins-bad-plugins.args
@@ -1501,7 +1501,7 @@
<ARG>
<NAME>GstBPWSinc::length</NAME>
<TYPE>gint</TYPE>
-<RANGE>>= 3</RANGE>
+<RANGE>[3,50000]</RANGE>
<FLAGS>rw</FLAGS>
<NICK>Length</NICK>
<BLURB>Filter kernel length, will be rounded to the next odd number.</BLURB>
@@ -1510,8 +1510,8 @@
<ARG>
<NAME>GstBPWSinc::lower-frequency</NAME>
-<TYPE>gdouble</TYPE>
-<RANGE>>= 0</RANGE>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,100000]</RANGE>
<FLAGS>rw</FLAGS>
<NICK>Lower Frequency</NICK>
<BLURB>Cut-off lower frequency (Hz).</BLURB>
@@ -1520,8 +1520,8 @@
<ARG>
<NAME>GstBPWSinc::upper-frequency</NAME>
-<TYPE>gdouble</TYPE>
-<RANGE>>= 0</RANGE>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,100000]</RANGE>
<FLAGS>rw</FLAGS>
<NICK>Upper Frequency</NICK>
<BLURB>Cut-off upper frequency (Hz).</BLURB>
@@ -1561,7 +1561,7 @@
<ARG>
<NAME>GstLPWSinc::length</NAME>
<TYPE>gint</TYPE>
-<RANGE>>= 3</RANGE>
+<RANGE>[3,50000]</RANGE>
<FLAGS>rw</FLAGS>
<NICK>Length</NICK>
<BLURB>Filter kernel length, will be rounded to the next odd number.</BLURB>
@@ -1589,6 +1589,16 @@
</ARG>
<ARG>
+<NAME>GstLPWSinc::cutoff</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,100000]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Cutoff</NICK>
+<BLURB>Cut-off Frequency (Hz).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
<NAME>GstIIR::A</NAME>
<TYPE>gdouble</TYPE>
<RANGE></RANGE>
diff --git a/docs/plugins/gst-plugins-bad-plugins.signals b/docs/plugins/gst-plugins-bad-plugins.signals
index be79db7c..bb6b21e4 100644
--- a/docs/plugins/gst-plugins-bad-plugins.signals
+++ b/docs/plugins/gst-plugins-bad-plugins.signals
@@ -30,6 +30,54 @@ guint arg1
</SIGNAL>
<SIGNAL>
+<NAME>GstRTPSession::on-bye-ssrc</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstRTPSession *gstrtpsession
+guint arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstRTPSession::on-bye-timeout</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstRTPSession *gstrtpsession
+guint arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstRTPSession::on-new-ssrc</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstRTPSession *gstrtpsession
+guint arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstRTPSession::on-ssrc-collision</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstRTPSession *gstrtpsession
+guint arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstRTPSession::on-ssrc-validated</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstRTPSession *gstrtpsession
+guint arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstRTPSession::on-timeout</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstRTPSession *gstrtpsession
+guint arg1
+</SIGNAL>
+
+<SIGNAL>
<NAME>GstRTPPtDemux::clear-pt-map</NAME>
<RETURNS>void</RETURNS>
<FLAGS>la</FLAGS>
@@ -93,6 +141,60 @@ guint arg2
</SIGNAL>
<SIGNAL>
+<NAME>GstRTPBin::on-bye-ssrc</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstRTPBin *gstrtpbin
+guint arg1
+guint arg2
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstRTPBin::on-bye-timeout</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstRTPBin *gstrtpbin
+guint arg1
+guint arg2
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstRTPBin::on-new-ssrc</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstRTPBin *gstrtpbin
+guint arg1
+guint arg2
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstRTPBin::on-ssrc-collision</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstRTPBin *gstrtpbin
+guint arg1
+guint arg2
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstRTPBin::on-ssrc-validated</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstRTPBin *gstrtpbin
+guint arg1
+guint arg2
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstRTPBin::on-timeout</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstRTPBin *gstrtpbin
+guint arg1
+guint arg2
+</SIGNAL>
+
+<SIGNAL>
<NAME>GstCDAudio::track-change</NAME>
<RETURNS>void</RETURNS>
<FLAGS>l</FLAGS>
diff --git a/docs/plugins/inspect/plugin-gstrtpmanager.xml b/docs/plugins/inspect/plugin-gstrtpmanager.xml
index 301e0402..05c65f32 100644
--- a/docs/plugins/inspect/plugin-gstrtpmanager.xml
+++ b/docs/plugins/inspect/plugin-gstrtpmanager.xml
@@ -86,7 +86,7 @@
<longname>RTP packet jitter-buffer</longname>
<class>Filter/Network/RTP</class>
<description>A buffer that deals with network jitter and other transmission faults</description>
- <author>Philippe Kalaf &lt;philippe.kalaf@collabora.co.uk&gt;, Wim Taymans &lt;wim@fluendo.com&gt;</author>
+ <author>Philippe Kalaf &lt;philippe.kalaf@collabora.co.uk&gt;, Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
<caps>
<name>src</name>
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);
diff --git a/gst/filter/gstbpwsinc.h b/gst/filter/gstbpwsinc.h
index d790d040..24a4d2da 100644
--- a/gst/filter/gstbpwsinc.h
+++ b/gst/filter/gstbpwsinc.h
@@ -65,7 +65,7 @@ struct _GstBPWSinc {
gint mode;
gint window;
- gdouble lower_frequency, upper_frequency;
+ gfloat lower_frequency, upper_frequency;
gint kernel_length; /* length of the filter kernel */
gdouble *residue; /* buffer for left-over samples from previous buffer */
diff --git a/gst/filter/gstlpwsinc.c b/gst/filter/gstlpwsinc.c
index 3869553b..3cf14e5d 100644
--- a/gst/filter/gstlpwsinc.c
+++ b/gst/filter/gstlpwsinc.c
@@ -227,15 +227,17 @@ gst_lpwsinc_class_init (GstLPWSincClass * klass)
gobject_class->get_property = lpwsinc_get_property;
gobject_class->dispose = gst_lpwsinc_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_FREQUENCY,
- g_param_spec_double ("frequency", "Frequency",
- "Cut-off Frequency (Hz)", 0.0, G_MAXDOUBLE, 0.0,
+ g_param_spec_float ("cutoff", "Cutoff",
+ "Cut-off Frequency (Hz)", 0.0, 100000.0, 0.0,
G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
-
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 | GST_PARAM_CONTROLLABLE));
+ 3, 50000, 101, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
g_object_class_install_property (gobject_class, PROP_MODE,
g_param_spec_enum ("mode", "Mode",
@@ -261,7 +263,7 @@ gst_lpwsinc_init (GstLPWSinc * self, GstLPWSincClass * g_class)
self->window = WINDOW_HAMMING;
self->kernel_length = 101;
self->latency = 50;
- self->frequency = 0.0;
+ self->cutoff = 0.0;
self->kernel = NULL;
self->residue = NULL;
@@ -275,86 +277,51 @@ gst_lpwsinc_init (GstLPWSinc * self, GstLPWSincClass * g_class)
lpwsinc_query_type);
}
-static void
-process_32 (GstLPWSinc * 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 (GstLPWSinc * 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 (GstLPWSinc * 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
lpwsinc_build_kernel (GstLPWSinc * self)
@@ -377,17 +344,17 @@ lpwsinc_build_kernel (GstLPWSinc * self)
}
/* Clamp cutoff frequency between 0 and the nyquist frequency */
- self->frequency =
- CLAMP (self->frequency, 0.0, GST_AUDIO_FILTER (self)->format.rate / 2);
+ self->cutoff =
+ CLAMP (self->cutoff, 0.0, GST_AUDIO_FILTER (self)->format.rate / 2);
GST_DEBUG ("lpwsinc: initializing filter kernel of length %d "
"with cutoff %.2lf Hz "
"for mode %s",
- len, self->frequency,
+ len, self->cutoff,
(self->mode == MODE_LOW_PASS) ? "low-pass" : "high-pass");
/* fill the kernel */
- w = 2 * M_PI * (self->frequency / GST_AUDIO_FILTER (self)->format.rate);
+ w = 2 * M_PI * (self->cutoff / GST_AUDIO_FILTER (self)->format.rate);
if (self->kernel)
g_free (self->kernel);
@@ -800,7 +767,7 @@ lpwsinc_set_property (GObject * object, guint prop_id, const GValue * value,
}
case PROP_FREQUENCY:
GST_BASE_TRANSFORM_LOCK (self);
- self->frequency = g_value_get_double (value);
+ self->cutoff = g_value_get_float (value);
lpwsinc_build_kernel (self);
GST_BASE_TRANSFORM_UNLOCK (self);
break;
@@ -833,7 +800,7 @@ lpwsinc_get_property (GObject * object, guint prop_id, GValue * value,
g_value_set_int (value, self->kernel_length);
break;
case PROP_FREQUENCY:
- g_value_set_double (value, self->frequency);
+ g_value_set_float (value, self->cutoff);
break;
case PROP_MODE:
g_value_set_enum (value, self->mode);
diff --git a/gst/filter/gstlpwsinc.h b/gst/filter/gstlpwsinc.h
index 3e09bd52..f56f5a4d 100644
--- a/gst/filter/gstlpwsinc.h
+++ b/gst/filter/gstlpwsinc.h
@@ -65,7 +65,7 @@ struct _GstLPWSinc {
gint mode;
gint window;
- gdouble frequency;
+ gfloat cutoff;
gint kernel_length; /* length of the filter kernel */
gdouble *residue; /* buffer for left-over samples from previous buffer */
diff --git a/tests/check/elements/lpwsinc.c b/tests/check/elements/lpwsinc.c
index 3d69bc95..d2aeda47 100644
--- a/tests/check/elements/lpwsinc.c
+++ b/tests/check/elements/lpwsinc.c
@@ -108,7 +108,7 @@ GST_START_TEST (test_lp_0hz)
"could not set to playing");
/* cutoff = sampling rate / 4, data = 0 */
- g_object_set (G_OBJECT (lpwsinc), "frequency", 44100 / 4.0, NULL);
+ g_object_set (G_OBJECT (lpwsinc), "cutoff", 44100 / 4.0, NULL);
inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble));
in = (gdouble *) GST_BUFFER_DATA (inbuffer);
for (i = 0; i < 128; i++)
@@ -166,7 +166,7 @@ GST_START_TEST (test_lp_22050hz)
GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
"could not set to playing");
- g_object_set (G_OBJECT (lpwsinc), "frequency", 44100 / 4.0, NULL);
+ g_object_set (G_OBJECT (lpwsinc), "cutoff", 44100 / 4.0, NULL);
inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble));
in = (gdouble *) GST_BUFFER_DATA (inbuffer);
for (i = 0; i < 128; i += 2) {
@@ -226,7 +226,7 @@ GST_START_TEST (test_hp_0hz)
GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
"could not set to playing");
- g_object_set (G_OBJECT (lpwsinc), "frequency", 44100 / 4.0, NULL);
+ g_object_set (G_OBJECT (lpwsinc), "cutoff", 44100 / 4.0, NULL);
inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble));
in = (gdouble *) GST_BUFFER_DATA (inbuffer);
for (i = 0; i < 128; i++)
@@ -284,7 +284,7 @@ GST_START_TEST (test_hp_22050hz)
GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
"could not set to playing");
- g_object_set (G_OBJECT (lpwsinc), "frequency", 44100 / 4.0, NULL);
+ g_object_set (G_OBJECT (lpwsinc), "cutoff", 44100 / 4.0, NULL);
inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble));
in = (gdouble *) GST_BUFFER_DATA (inbuffer);
for (i = 0; i < 128; i += 2) {
@@ -344,7 +344,7 @@ GST_START_TEST (test_small_buffer)
GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
"could not set to playing");
- g_object_set (G_OBJECT (lpwsinc), "frequency", 44100 / 4.0, NULL);
+ g_object_set (G_OBJECT (lpwsinc), "cutoff", 44100 / 4.0, NULL);
inbuffer = gst_buffer_new_and_alloc (20 * sizeof (gdouble));
in = (gdouble *) GST_BUFFER_DATA (inbuffer);
for (i = 0; i < 20; i++)