diff options
| -rw-r--r-- | gst/audiofx/audiowsincband.c | 28 | ||||
| -rw-r--r-- | gst/audiofx/audiowsinclimit.c | 28 | 
2 files changed, 48 insertions, 8 deletions
diff --git a/gst/audiofx/audiowsincband.c b/gst/audiofx/audiowsincband.c index d6bb3d12..9d550ba3 100644 --- a/gst/audiofx/audiowsincband.c +++ b/gst/audiofx/audiowsincband.c @@ -245,6 +245,7 @@ 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++) { @@ -260,8 +261,17 @@ process_32 (GstBPWSinc * self, gfloat * src, gfloat * dst, guint input_samples)          dst[i] += src[(l - j) * channels + k] * self->kernel[j];    } -  /* copy the tail of the current input buffer to the residue */ -  for (i = 0; i < kernel_length * channels; i++) +  /* 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];  } @@ -272,6 +282,7 @@ process_64 (GstBPWSinc * self, gdouble * src, gdouble * dst,    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++) { @@ -287,8 +298,17 @@ process_64 (GstBPWSinc * self, gdouble * src, gdouble * dst,          dst[i] += src[(l - j) * channels + k] * self->kernel[j];    } -  /* copy the tail of the current input buffer to the residue */ -  for (i = 0; i < kernel_length * channels; i++) +  /* 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];  } diff --git a/gst/audiofx/audiowsinclimit.c b/gst/audiofx/audiowsinclimit.c index f6393169..54ebc2a3 100644 --- a/gst/audiofx/audiowsinclimit.c +++ b/gst/audiofx/audiowsinclimit.c @@ -240,6 +240,7 @@ 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++) { @@ -255,8 +256,17 @@ process_32 (GstLPWSinc * self, gfloat * src, gfloat * dst, guint input_samples)          dst[i] += src[(l - j) * channels + k] * self->kernel[j];    } -  /* copy the tail of the current input buffer to the residue */ -  for (i = 0; i < kernel_length * channels; i++) +  /* 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];  } @@ -267,6 +277,7 @@ process_64 (GstLPWSinc * self, gdouble * src, gdouble * dst,    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++) { @@ -282,8 +293,17 @@ process_64 (GstLPWSinc * self, gdouble * src, gdouble * dst,          dst[i] += src[(l - j) * channels + k] * self->kernel[j];    } -  /* copy the tail of the current input buffer to the residue */ -  for (i = 0; i < kernel_length * channels; i++) +  /* 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];  }  | 
