From 248e9cfe91804759a6bd79c8699afa45cd45e05d Mon Sep 17 00:00:00 2001 From: Sebastian Dröge Date: Wed, 6 Jan 2010 10:27:07 +0100 Subject: WIP audiofxbasefirfilter --- gst/audiofx/audiofxbasefirfilter.c | 49 ++++++++++++++++++++------------------ 1 file 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) { -- cgit v1.2.3