From 99c14e26d69d44572d0e904e4cec40a41c4c74b4 Mon Sep 17 00:00:00 2001
From: Tristan Matthews <tristan.matthews@savoirfairelinux.com>
Date: Tue, 20 Aug 2013 16:45:40 -0400
Subject: [PATCH] * #28679: audio: don't create a new scratch buffer every time
 we resample

---
 daemon/src/audio/samplerateconverter.cpp | 9 +++++----
 daemon/src/audio/samplerateconverter.h   | 1 +
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/daemon/src/audio/samplerateconverter.cpp b/daemon/src/audio/samplerateconverter.cpp
index 2f6c3d0e03..fbc32c1664 100644
--- a/daemon/src/audio/samplerateconverter.cpp
+++ b/daemon/src/audio/samplerateconverter.cpp
@@ -32,7 +32,7 @@
 #include "sfl_types.h"
 
 SamplerateConverter::SamplerateConverter(int freq, size_t channels /* = 1 */) : floatBufferIn_(),
-    floatBufferOut_(), samples_(0), channels_(channels), maxFreq_(freq), src_state_(0)
+    floatBufferOut_(), scratchBuffer_(), samples_(0), channels_(channels), maxFreq_(freq), src_state_(0)
 {
     int err;
     src_state_ = src_new(SRC_LINEAR, channels_, &err);
@@ -41,6 +41,7 @@ SamplerateConverter::SamplerateConverter(int freq, size_t channels /* = 1 */) :
 
     floatBufferIn_.resize(samples_);
     floatBufferOut_.resize(samples_);
+    scratchBuffer_.resize(samples_);
 }
 
 SamplerateConverter::~SamplerateConverter()
@@ -86,6 +87,7 @@ void SamplerateConverter::resample(const AudioBuffer &dataIn, AudioBuffer &dataO
     samples_ = std::max(inSamples, outSamples);
     floatBufferIn_.resize(inSamples);
     floatBufferOut_.resize(outSamples);
+    scratchBuffer_.resize(outSamples);
 
     SRC_DATA src_data;
     src_data.data_in = floatBufferIn_.data();
@@ -102,7 +104,6 @@ void SamplerateConverter::resample(const AudioBuffer &dataIn, AudioBuffer &dataO
     /*
     TODO: one-shot deinterleave and float-to-short conversion
     */
-    std::vector<SFLAudioSample> scratch_buff(outSamples);
-    src_float_to_short_array(floatBufferOut_.data(), scratch_buff.data(), outSamples);
-    dataOut.deinterleave(scratch_buff.data(), src_data.output_frames, nbChans);
+    src_float_to_short_array(floatBufferOut_.data(), scratchBuffer_.data(), outSamples);
+    dataOut.deinterleave(scratchBuffer_.data(), src_data.output_frames, nbChans);
 }
diff --git a/daemon/src/audio/samplerateconverter.h b/daemon/src/audio/samplerateconverter.h
index 2b533e2083..41f0e8be5e 100644
--- a/daemon/src/audio/samplerateconverter.h
+++ b/daemon/src/audio/samplerateconverter.h
@@ -78,6 +78,7 @@ class SamplerateConverter {
         /* temporary buffers */
         std::vector<float> floatBufferIn_;
         std::vector<float> floatBufferOut_;
+        std::vector<SFLAudioSample> scratchBuffer_;
 
         size_t samples_; // size in samples of temporary buffers
         size_t channels_; // number of channels configured
-- 
GitLab