diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | ext/soundtouch/gstbpmdetect.cc | 31 |
2 files changed, 28 insertions, 11 deletions
@@ -1,3 +1,11 @@ +2008-01-28 Sebastian Dröge <slomo@circular-chaos.org> + + * ext/soundtouch/gstbpmdetect.cc: + Clean up a bit and only allocate a temporary buffer for the data + if processing stereo data as BPMDetect downmixes from stereo to + mono and stores the result in the input data. Thanks to + Stefan Kost for the suggestions. + 2008-01-27 Sebastian Dröge <slomo@circular-chaos.org> * ext/soundtouch/gstpitch.cc: diff --git a/ext/soundtouch/gstbpmdetect.cc b/ext/soundtouch/gstbpmdetect.cc index d9949182..1ec5452a 100644 --- a/ext/soundtouch/gstbpmdetect.cc +++ b/ext/soundtouch/gstbpmdetect.cc @@ -189,23 +189,32 @@ gst_bpm_detect_transform_ip (GstBaseTransform * trans, GstBuffer * in) GstBPMDetect *bpm_detect = GST_BPM_DETECT (trans); GstAudioFilter *filter = GST_AUDIO_FILTER (trans); gint nsamples; - gfloat *data; gfloat bpm; - if (filter->format.channels == 0 || filter->format.rate == 0) { - GST_ERROR_OBJECT (bpm_detect, "No channels or rate set yet"); - return GST_FLOW_ERROR; - } - - nsamples = GST_BUFFER_SIZE (in) / (4 * filter->format.channels); + if (G_UNLIKELY (!bpm_detect->priv->detect)) { + if (filter->format.channels == 0 || filter->format.rate == 0) { + GST_ERROR_OBJECT (bpm_detect, "No channels or rate set yet"); + return GST_FLOW_ERROR; + } - if (!bpm_detect->priv->detect) bpm_detect->priv->detect = new BPMDetect (filter->format.channels, filter->format.rate); + } - data = (gfloat *) g_memdup (GST_BUFFER_DATA (in), GST_BUFFER_SIZE (in)); - bpm_detect->priv->detect->inputSamples (data, nsamples); - g_free (data); + nsamples = GST_BUFFER_SIZE (in) / (4 * filter->format.channels); + + /* For stereo BPMDetect->inputSamples() does downmixing into the input + * data but our buffer data shouldn't be modified. + */ + if (filter->format.channels == 1) { + bpm_detect->priv->detect->inputSamples ((gfloat *) GST_BUFFER_DATA (in), + nsamples); + } else { + gfloat *data = + (gfloat *) g_memdup (GST_BUFFER_DATA (in), GST_BUFFER_SIZE (in)); + bpm_detect->priv->detect->inputSamples (data, nsamples); + g_free (data); + } bpm = bpm_detect->priv->detect->getBpm (); if (bpm >= 1.0 && fabs (bpm_detect->bpm - bpm) >= 1.0) { |