summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--ext/soundtouch/gstbpmdetect.cc31
2 files changed, 28 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index 84c6aba1..fddd1dc2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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) {