From 03809532ca26ce0cb833d610008f5dd28df41e15 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Wed, 1 Mar 2017 17:28:16 -0500 Subject: [PATCH] Remove naked malloc (or similar) and free in: Equalization48x --- src/effects/Equalization48x.cpp | 29 ++++++++++++++--------------- src/effects/Equalization48x.h | 7 ++++++- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/effects/Equalization48x.cpp b/src/effects/Equalization48x.cpp index 0f2b6816a..594f76355 100644 --- a/src/effects/Equalization48x.cpp +++ b/src/effects/Equalization48x.cpp @@ -158,7 +158,7 @@ void * malloc_simd(const size_t size) #endif } -void free_simd(void* mem) +void free_simd::operator() (void* mem) const { #if defined WIN32 // WIN32 _aligned_free(mem); @@ -169,7 +169,7 @@ void free_simd(void* mem) EffectEqualization48x::EffectEqualization48x(): mThreadCount(0),mFilterSize(0),mWindowSize(0),mBlockSize(0),mWorkerDataCount(0),mBlocksPerBuffer(20), - mScratchBufferSize(0),mSubBufferSize(0),mBigBuffer(NULL),mThreaded(false), + mScratchBufferSize(0),mSubBufferSize(0),mThreaded(false), mBenching(false),mBufferCount(0) { } @@ -211,7 +211,7 @@ bool EffectEqualization48x::AllocateBuffersWorkers(int nThreads) mScratchBufferSize=mWindowSize*3*sizeof(float)*mBufferCount; // 3 window size blocks of instruction size mSubBufferSize=mBlockSize*(mBufferCount*(mBlocksPerBuffer-1)); // we are going to do a full block overlap - mBigBuffer=(float *)malloc_simd(sizeof(float)*(mSubBufferSize+mFilterSize+mScratchBufferSize)*mWorkerDataCount); // we run over by filtersize + mBigBuffer.reset( (float *)malloc_simd(sizeof(float) * (mSubBufferSize + mFilterSize + mScratchBufferSize) * mWorkerDataCount) ); // we run over by filtersize // fill the bufferInfo mBufferInfo.reinit(mWorkerDataCount); for(int i=0;iAppend((samplePtr)&mBigBuffer[(bigRun?mBlockSize:0)+(mFilterSize>>1)], floatSample, subBufferSize-((bigRun?mBlockSize:0)+(mFilterSize>>1))); } if(singleProcessLength && !bBreakLoop) { - t->Get((samplePtr)mBigBuffer, floatSample, currentSample, singleProcessLength+mBlockSize+(mFilterSize>>1)); - ProcessBuffer(mBigBuffer, mBigBuffer, singleProcessLength+mBlockSize+(mFilterSize>>1)); + t->Get((samplePtr)mBigBuffer.get(), floatSample, currentSample, singleProcessLength+mBlockSize+(mFilterSize>>1)); + ProcessBuffer(mBigBuffer.get(), mBigBuffer.get(), singleProcessLength+mBlockSize+(mFilterSize>>1)); output->Append((samplePtr)&mBigBuffer[bigRuns > 0 ? mBlockSize : 0], floatSample, singleProcessLength+mBlockSize+(mFilterSize>>1)); } output->Flush(); @@ -853,8 +852,8 @@ bool EffectEqualization48x::ProcessOne4x(int count, WaveTrack * t, output->Append((samplePtr)&mBigBuffer[(bigRun?mBlockSize:0)+(mFilterSize>>1)], floatSample, subBufferSize-((bigRun?mBlockSize:0)+(mFilterSize>>1))); } if(singleProcessLength && !bBreakLoop) { - t->Get((samplePtr)mBigBuffer, floatSample, currentSample, singleProcessLength+mBlockSize+(mFilterSize>>1)); - ProcessBuffer(mBigBuffer, mBigBuffer, singleProcessLength+mBlockSize+(mFilterSize>>1)); + t->Get((samplePtr)mBigBuffer.get(), floatSample, currentSample, singleProcessLength+mBlockSize+(mFilterSize>>1)); + ProcessBuffer(mBigBuffer.get(), mBigBuffer.get(), singleProcessLength+mBlockSize+(mFilterSize>>1)); output->Append((samplePtr)&mBigBuffer[bigRuns > 0 ? mBlockSize : 0], floatSample, singleProcessLength+mBlockSize+(mFilterSize>>1)); // output->Append((samplePtr)&mBigBuffer[bigRuns?mBlockSize:0], floatSample, singleProcessLength); } @@ -965,8 +964,8 @@ bool EffectEqualization48x::ProcessOne1x4xThreaded(int count, WaveTrack * t, mDataMutex.Unlock(); // Get back in line for data } if(singleProcessLength && !bBreakLoop) { - t->Get((samplePtr)mBigBuffer, floatSample, currentSample, singleProcessLength+mBlockSize+(mFilterSize>>1)); - ProcessBuffer(mBigBuffer, mBigBuffer, singleProcessLength+mBlockSize+(mFilterSize>>1)); + t->Get((samplePtr)mBigBuffer.get(), floatSample, currentSample, singleProcessLength+mBlockSize+(mFilterSize>>1)); + ProcessBuffer(mBigBuffer.get(), mBigBuffer.get(), singleProcessLength+mBlockSize+(mFilterSize>>1)); output->Append((samplePtr)&mBigBuffer[mBlockSize], floatSample, singleProcessLength+mBlockSize+(mFilterSize>>1)); } output->Flush(); @@ -1183,8 +1182,8 @@ bool EffectEqualization48x::ProcessOne8x(int count, WaveTrack * t, output->Append((samplePtr)&mBigBuffer[(bigRun?mBlockSize:0)+(mFilterSize>>1)], floatSample, mSubBufferSize-((bigRun?mBlockSize:0)+(mFilterSize>>1))); } if(singleProcessLength && !bBreakLoop) { - t->Get((samplePtr)mBigBuffer, floatSample, currentSample, singleProcessLength+mBlockSize+(mFilterSize>>1)); - ProcessBuffer(mBigBuffer, mBigBuffer, singleProcessLength+mBlockSize+(mFilterSize>>1)); + t->Get((samplePtr)mBigBuffer.get(), floatSample, currentSample, singleProcessLength+mBlockSize+(mFilterSize>>1)); + ProcessBuffer(mBigBuffer.get(), mBigBuffer.get(), singleProcessLength+mBlockSize+(mFilterSize>>1)); output->Append((samplePtr)&mBigBuffer[mBlockSize], floatSample, singleProcessLength+mBlockSize+(mFilterSize>>1)); } output->Flush(); @@ -1262,8 +1261,8 @@ bool EffectEqualization48x::ProcessOne8xThreaded(int count, WaveTrack * t, mDataMutex.Unlock(); // Get back in line for data } if(singleProcessLength && !bBreakLoop) { - t->Get((samplePtr)mBigBuffer, floatSample, currentSample, singleProcessLength+mBlockSize+(mFilterSize>>1)); - ProcessBuffer(mBigBuffer, mBigBuffer, singleProcessLength+mBlockSize+(mFilterSize>>1)); + t->Get((samplePtr)mBigBuffer.get(), floatSample, currentSample, singleProcessLength+mBlockSize+(mFilterSize>>1)); + ProcessBuffer(mBigBuffer.get(), mBigBuffer.get(), singleProcessLength+mBlockSize+(mFilterSize>>1)); output->Append((samplePtr)&mBigBuffer[mBlockSize], floatSample, singleProcessLength+mBlockSize+(mFilterSize>>1)); } output->Flush(); diff --git a/src/effects/Equalization48x.h b/src/effects/Equalization48x.h index 61a493e15..746734b15 100644 --- a/src/effects/Equalization48x.h +++ b/src/effects/Equalization48x.h @@ -32,6 +32,11 @@ Intrinsics (SSE/AVX) and Threaded Equalization #define MATH_FUNCTION_AVX 16 #define MATH_FUNCTION_SEGMENTED_CODE 32 +struct free_simd { + void operator () (void*) const; +}; +using simd_floats = std::unique_ptr< float[], free_simd >; + // added by Andrew Hallendorff intrinsics processing enum EQBufferStatus { @@ -156,7 +161,7 @@ private: size_t mBlocksPerBuffer; size_t mScratchBufferSize; size_t mSubBufferSize; - float *mBigBuffer; + simd_floats mBigBuffer; ArrayOf mBufferInfo; wxMutex mDataMutex; ArrayOf mEQWorkers;