summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2010-01-06 10:27:07 +0100
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2010-01-07 17:35:26 +0100
commit248e9cfe91804759a6bd79c8699afa45cd45e05d (patch)
tree8791b3303e00777ef6660e223c7407484b19a482
parentc99c9eee69c1f2d61e73d061349ee5d180b50f91 (diff)
WIP audiofxbasefirfilteraudiofxbasefirfilter
-rw-r--r--gst/audiofx/audiofxbasefirfilter.c49
1 files changed, 26 insertions, 23 deletions
diff --git a/gst/audiofx/audiofxbasefirfilter.c b/gst/audiofx/audiofxbasefirfilter.c
index 61aa8c62e..95d38a36b 100644
--- a/gst/audiofx/audiofxbasefirfilter.c
+++ b/gst/audiofx/audiofxbasefirfilter.c
@@ -1028,7 +1028,8 @@ gst_audio_fx_base_fir_filter_event (GstBaseTransform * base, GstEvent * event)
void
gst_audio_fx_base_fir_filter_update_buffer_size (GstAudioFXBaseFIRFilter * self,
- guint channels, guint old_kernel_length, guint old_real_buffer_length)
+ guint channels, guint old_kernel_length, guint old_buffer_length,
+ guint old_block_length)
{
gdouble *old_buffer = self->buffer;
guint size = 0;
@@ -1039,38 +1040,38 @@ gst_audio_fx_base_fir_filter_update_buffer_size (GstAudioFXBaseFIRFilter * self,
self->buffer_length = size;
self->buffer = g_new0 (gdouble, self->buffer_length);
if (old_buffer) {
- memcpy (self->buffer, old_buffer,
- sizeof (gdouble) * MIN (self->buffer_fill, size));
+ guint to_copy = MIN (self->buffer_fill, size);
+
+ /* FIXME: instead of dropping buffer content on size decreasing, process it! */
+ memcpy (self->buffer, old_buffer + self->buffer_fill - to_copy,
+ sizeof (gdouble) * to_copy);
g_free (old_buffer);
}
} else {
+ guint old_real_buffer_length = old_block_length + old_kernel_length - 1;
guint real_buffer_length = self->block_length + self->kernel_length - 1;
size = channels * real_buffer_length;
self->buffer = g_new0 (gdouble, size);
self->buffer_length = self->block_length;
- for (c = 0; c < channels; c++) {
- /* copy the kernel */
- memcpy (self->buffer + c * real_buffer_length,
- old_buffer + c * (old_real_buffer_length),
- sizeof (gdouble) * MIN (old_kernel_length - 1,
- self->kernel_length - 1));
- /* copy the channel residue */
- memcpy (self->buffer + c * real_buffer_length + self->kernel_length - 1,
- old_buffer + c * old_real_buffer_length + old_kernel_length - 1,
- sizeof (gdouble) *
- MIN ((old_real_buffer_length - (old_kernel_length - 1)),
- real_buffer_length - (self->kernel_length - 1)));
- }
- self->buffer_length = self->block_length;
- if (self->buffer_fill < self->kernel_length - 1) {
- self->buffer_fill = self->kernel_length - 1;
+ if (old_buffer) {
+ guint to_copy = MIN ((old_real_buffer_length - (old_kernel_length - 1)),
+ real_buffer_length - (self->kernel_length - 1));
+
+ /* FIXME: Copy the *last* samples, not the first */
+ /* FIXME: instead of dropping buffer content on size decreasing, process it! */
+ for (c = 0; c < channels; c++) {
+ /* copy the channel residue */
+ memcpy (self->buffer + c * real_buffer_length + self->kernel_length - 1,
+ old_buffer + c * old_real_buffer_length + old_kernel_length - 1,
+ sizeof (gdouble) * to_copy);
+ }
+ self->buffer_length = self->block_length;
+
+ g_free (old_buffer);
}
}
-
- /* FIXME check what would happen if the new buffer is too short
- * and if that is possible at all */
}
void
@@ -1080,6 +1081,7 @@ gst_audio_fx_base_fir_filter_set_kernel (GstAudioFXBaseFIRFilter * self,
gboolean latency_changed;
guint old_kernel_length;
guint old_buffer_length;
+ guint old_block_length;
g_return_if_fail (kernel != NULL);
g_return_if_fail (self != NULL);
@@ -1112,6 +1114,7 @@ gst_audio_fx_base_fir_filter_set_kernel (GstAudioFXBaseFIRFilter * self,
old_buffer_length = self->buffer_length;
old_kernel_length = self->kernel_length;
+ old_block_length = self->block_length;
self->kernel = kernel;
self->kernel_length = kernel_length;
@@ -1122,7 +1125,7 @@ gst_audio_fx_base_fir_filter_set_kernel (GstAudioFXBaseFIRFilter * self,
if (!self->drain_on_changes) {
gst_audio_fx_base_fir_filter_update_buffer_size (self,
GST_AUDIO_FILTER_CAST (self)->format.channels, old_kernel_length,
- old_buffer_length + old_kernel_length - 1);
+ old_buffer_length, old_block_length);
}
if (latency_changed) {