diff --git a/src/RealFFTf48x.h b/src/RealFFTf48x.h index 45bc397a4..f568fa7a2 100644 --- a/src/RealFFTf48x.h +++ b/src/RealFFTf48x.h @@ -3,7 +3,7 @@ #include "MemoryX.h" -#define fft_type float +using fft_type = float; int SmallRB(int bits, int numberBits); diff --git a/src/effects/Equalization48x.cpp b/src/effects/Equalization48x.cpp index f99c1ff58..d91a44094 100644 --- a/src/effects/Equalization48x.cpp +++ b/src/effects/Equalization48x.cpp @@ -21,6 +21,7 @@ #ifdef EXPERIMENTAL_EQ_SSE_THREADED #include "../Project.h" #include "Equalization.h" +#include "../WaveClip.h" #include "../WaveTrack.h" #include "../float_cast.h" #include @@ -300,7 +301,7 @@ bool EffectEqualization48x::Process(EffectEqualization* effectEqualization) auto cleanup = finally( [&] { FreeBuffersWorkers(); } ); int count = 0; for( auto track : - mEffectEqualization->mOutputTracks->Selected< WaveTrack >() { + mEffectEqualization->mOutputTracks->Selected< WaveTrack >() ) { double trackStart = track->GetStartTime(); double trackEnd = track->GetEndTime(); double t0 = mEffectEqualization->mT0 < trackStart? trackStart: mEffectEqualization->mT0; @@ -333,24 +334,26 @@ bool EffectEqualization48x::TrackCompare() auto cleanup = finally( [&] { FreeBuffersWorkers(); } ); // Reset map // PRL: These two maps aren't really used - std::vector SecondIMap; + std::vector SecondIMap; std::vector SecondOMap; SecondIMap.clear(); SecondOMap.clear(); - TrackList SecondOutputTracks; + auto pSecondOutputTracks = TrackList::Create(); + auto &SecondOutputTracks = *pSecondOutputTracks; - for (auto aTrack : mEffectEqualization->mTracks->Any< WaveTrack >()) { + for (auto aTrack : + mEffectEqualization->inputTracks()->Any< const WaveTrack >()) { // Include selected tracks, plus sync-lock selected tracks for Track::All. if (aTrack->GetSelected() || (// mEffectEqualization->mOutputTracksType == TrackKind::All && aTrack->IsSyncLockSelected())) { - auto o = aTrack->Duplicate(); + auto o = mEffectEqualization->mFactory->DuplicateWaveTrack( *aTrack ); SecondIMap.push_back(aTrack); SecondIMap.push_back(o.get()); - SecondOutputTracks.push_back( o ); + SecondOutputTracks.Add( o ); } } @@ -359,7 +362,7 @@ bool EffectEqualization48x::TrackCompare() int count = 0; for( auto track : ( i ? mEffectEqualization->mOutputTracks.get() - : &SecondOutputTracks ) -> Selected< WaveTrack >() { + : &SecondOutputTracks ) -> Selected< WaveTrack >() ) { double trackStart = track->GetStartTime(); double trackEnd = track->GetEndTime(); double t0 = mEffectEqualization->mT0 < trackStart? trackStart: mEffectEqualization->mT0; @@ -380,7 +383,7 @@ bool EffectEqualization48x::TrackCompare() auto iter2 = (SecondOutputTracks.Selected< const WaveTrack >()).first; auto track2 = *iter2; for ( auto track : - mEffectEqualization->mOutputTracks->Selected< const WaveTrack >() { + mEffectEqualization->mOutputTracks->Selected< WaveTrack >() ) { double trackStart = track->GetStartTime(); double trackEnd = track->GetEndTime(); double t0 = mEffectEqualization->mT0 < trackStart? trackStart: mEffectEqualization->mT0; @@ -398,7 +401,8 @@ bool EffectEqualization48x::TrackCompare() return bBreakLoop; // return !bBreakLoop ? } -bool EffectEqualization48x::DeltaTrack(WaveTrack * t, WaveTrack * t2, sampleCount start, sampleCount len) +bool EffectEqualization48x::DeltaTrack( + WaveTrack * t, const WaveTrack * t2, sampleCount start, sampleCount len) { auto trackBlockSize = t->GetMaxBlockSize(); @@ -427,6 +431,8 @@ bool EffectEqualization48x::DeltaTrack(WaveTrack * t, WaveTrack * t2, sampleCoun return true; } +#include + bool EffectEqualization48x::Benchmark(EffectEqualization* effectEqualization) { mEffectEqualization=effectEqualization; @@ -464,7 +470,7 @@ bool EffectEqualization48x::Benchmark(EffectEqualization* effectEqualization) timer.Start(); int count = 0; for (auto track : - mEffectEqualization->mOutputTracks->Selected< WaveTrack >() { + mEffectEqualization->mOutputTracks->Selected< WaveTrack >() ) { double trackStart = track->GetStartTime(); double trackEnd = track->GetEndTime(); double t0 = mEffectEqualization->mT0 < trackStart? trackStart: mEffectEqualization->mT0; @@ -493,7 +499,8 @@ bool EffectEqualization48x::Benchmark(EffectEqualization* effectEqualization) wxTimeSpan tsDefaultThreaded(0, 0, 0, times[3]); wxTimeSpan tsDefault(0, 0, 0, times[4]); - Effect::MessageBox(wxString::Format(_("Benchmark times:\nOriginal: %s\nDefault Segmented: %s\nDefault Threaded: %s\nSSE: %s\nSSE Threaded: %s\n"),tsDefault.Format(wxT("%M:%S.%l")), + mEffectEqualization->MessageBox( + wxString::Format(_("Benchmark times:\nOriginal: %s\nDefault Segmented: %s\nDefault Threaded: %s\nSSE: %s\nSSE Threaded: %s\n"),tsDefault.Format(wxT("%M:%S.%l")), tsDefaultEnhanced.Format(wxT("%M:%S.%l")), tsDefaultThreaded.Format(wxT("%M:%S.%l")),tsSSE.Format(wxT("%M:%S.%l")),tsSSEThreaded.Format(wxT("%M:%S.%l")))); return bBreakLoop; // return !bBreakLoop ? } @@ -632,7 +639,9 @@ bool EffectEqualization48x::ProcessOne1x(int count, WaveTrack * t, if(bigRuns == 0) singleProcessLength = len.as_size_t(); else - singleProcessLength=(mFilterSize>>1)*bigRuns + len%(bigRuns*(subBufferSize-mBlockSize)); + singleProcessLength = + ((mFilterSize>>1)*bigRuns + len%(bigRuns*(subBufferSize-mBlockSize))) + .as_size_t(); auto currentSample=start; bool bBreakLoop = false; for(int bigRun=0;bigRun>1)*bigRuns + len%(bigRuns*(subBufferSize-mBlockSize)); + size_t singleProcessLength = + ((mFilterSize>>1)*bigRuns + len%(bigRuns*(subBufferSize-mBlockSize))) + .as_size_t(); auto currentSample=start; bool bBreakLoop = false; @@ -847,12 +858,14 @@ bool EffectEqualization48x::ProcessOne4x(int count, WaveTrack * t, return bBreakLoop; } +#include + void *EQWorker::Entry() { while(!mExitLoop) { int i = 0; { - wxMutexLocker locker( mMutex ); + wxMutexLocker locker( *mMutex ); for(; i < mBufferInfoCount; i++) { if(mBufferInfoList[i].mBufferStatus==BufferReady) { // we found an unlocked ready buffer mBufferInfoList[i].mBufferStatus=BufferBusy; // we own it now @@ -899,7 +912,9 @@ bool EffectEqualization48x::ProcessOne1x4xThreaded(int count, WaveTrack * t, auto bigRuns = len/(subBufferSize-mBlockSize); int trackBlocksPerBig=subBufferSize/trackBlockSize; int trackLeftovers=subBufferSize-trackBlocksPerBig*trackBlockSize; - size_t singleProcessLength=(mFilterSize>>1)*bigRuns + len%(bigRuns*(subBufferSize-mBlockSize)); + size_t singleProcessLength = + ((mFilterSize>>1)*bigRuns + len%(bigRuns*(subBufferSize-mBlockSize))) + .as_size_t(); auto currentSample=start; int bigBlocksRead=mWorkerDataCount, bigBlocksWritten=0; diff --git a/src/effects/Equalization48x.h b/src/effects/Equalization48x.h index 9eaeab5c8..7519bb520 100644 --- a/src/effects/Equalization48x.h +++ b/src/effects/Equalization48x.h @@ -17,6 +17,11 @@ Intrinsics (SSE/AVX) and Threaded Equalization #include "../MemoryX.h" +#include // to inherit +#include +class WaveTrack; +using fft_type = float; + #ifdef __AVX_ENABLED #define __MAXBUFFERCOUNT 8 #else @@ -129,7 +134,7 @@ public: private: bool RunFunctionSelect(int flags, int count, WaveTrack * t, sampleCount start, sampleCount len); bool TrackCompare(); - bool DeltaTrack(WaveTrack * t, WaveTrack * t2, sampleCount start, sampleCount len); + bool DeltaTrack(WaveTrack * t, const WaveTrack * t2, sampleCount start, sampleCount len); bool AllocateBuffersWorkers(int nThreads); bool FreeBuffersWorkers();