From aee4005044c1c42d31b3706166a96ef1b4feda36 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Tue, 11 Sep 2018 13:07:32 -0400 Subject: [PATCH] Rewrite many iterations over tracks and channels in src/effects --- src/effects/AutoDuck.cpp | 9 +-- src/effects/ClickRemoval.cpp | 5 +- src/effects/Contrast.cpp | 42 +++++------ src/effects/Effect.cpp | 27 +------- src/effects/Equalization.cpp | 32 ++++----- src/effects/Equalization48x.cpp | 50 +++++--------- src/effects/NoiseReduction.cpp | 14 ++-- src/effects/NoiseRemoval.cpp | 5 +- src/effects/Paulstretch.cpp | 5 +- src/effects/Repair.cpp | 5 +- src/effects/SimpleMono.cpp | 6 +- src/effects/StereoToMono.cpp | 21 +++--- src/effects/TruncSilence.cpp | 6 +- src/effects/TwoPassSimpleMono.cpp | 6 +- src/effects/nyquist/Nyquist.cpp | 111 +++++++++--------------------- 15 files changed, 113 insertions(+), 231 deletions(-) diff --git a/src/effects/AutoDuck.cpp b/src/effects/AutoDuck.cpp index c6ec25f7a..765481ab2 100644 --- a/src/effects/AutoDuck.cpp +++ b/src/effects/AutoDuck.cpp @@ -389,19 +389,15 @@ bool EffectAutoDuck::Process() if (!cancel) { CopyInputTracks(); // Set up mOutputTracks. - SelectedTrackListOfKindIterator iter(Track::Wave, mOutputTracks.get()); - Track *iterTrack = iter.First(); int trackNum = 0; - while (iterTrack) + for( auto iterTrack : mOutputTracks->Selected< WaveTrack >() ) { - WaveTrack* t = (WaveTrack*)iterTrack; - for (size_t i = 0; i < regions.size(); i++) { const AutoDuckRegion& region = regions[i]; - if (ApplyDuckFade(trackNum, t, region.t0, region.t1)) + if (ApplyDuckFade(trackNum, iterTrack, region.t0, region.t1)) { cancel = true; break; @@ -411,7 +407,6 @@ bool EffectAutoDuck::Process() if (cancel) break; - iterTrack = iter.Next(); trackNum++; } } diff --git a/src/effects/ClickRemoval.cpp b/src/effects/ClickRemoval.cpp index 823bbf0fd..1ed5caacc 100644 --- a/src/effects/ClickRemoval.cpp +++ b/src/effects/ClickRemoval.cpp @@ -172,10 +172,8 @@ bool EffectClickRemoval::Process() bool bGoodResult = true; mbDidSomething = false; - SelectedTrackListOfKindIterator iter(Track::Wave, mOutputTracks.get()); - WaveTrack *track = (WaveTrack *) iter.First(); int count = 0; - while (track) { + for( auto track : mOutputTracks->Selected< WaveTrack >() ) { double trackStart = track->GetStartTime(); double trackEnd = track->GetEndTime(); double t0 = mT0 < trackStart? trackStart: mT0; @@ -193,7 +191,6 @@ bool EffectClickRemoval::Process() } } - track = (WaveTrack *) iter.Next(); count++; } if (bGoodResult && !mbDidSomething) // Processing successful, but ineffective. diff --git a/src/effects/Contrast.cpp b/src/effects/Contrast.cpp index 535b1e373..b3006670c 100644 --- a/src/effects/Contrast.cpp +++ b/src/effects/Contrast.cpp @@ -43,24 +43,26 @@ bool ContrastDialog::GetDB(float &dB) { float rms = float(0.0); - int numberSelecteTracks = 0; // For stereo tracks: sqrt((mean(L)+mean(R))/2) - bool isStereo = false; double meanSq = 0.0; AudacityProject *p = GetActiveProject(); - SelectedTrackListOfKindIterator iter(Track::Wave, p->GetTracks()); - WaveTrack *t = (WaveTrack *) iter.First(); - while (t) { - numberSelecteTracks++; - if (numberSelecteTracks > 1 && !isStereo) { - AudacityMessageDialog m(NULL, _("You can only measure one track at a time."), _("Error"), wxOK); - m.ShowModal(); - return false; - } - isStereo = t->GetLinked(); + auto range = + p->GetTracks()->SelectedLeaders< const WaveTrack >(); + auto numberSelectedTracks = range.size(); + if (numberSelectedTracks > 1) { + AudacityMessageDialog m(NULL, _("You can only measure one track at a time."), _("Error"), wxOK); + m.ShowModal(); + return false; + } + if(numberSelectedTracks == 0) { + wxMessageDialog m(NULL, _("Please select an audio track."), _("Error"), wxOK); + m.ShowModal(); + return false; + } + for ( auto t : TrackList::Channels( *range.begin() ) ) { wxASSERT(mT0 <= mT1); // Ignore whitespace beyond ends of track. @@ -87,19 +89,13 @@ bool ContrastDialog::GetDB(float &dB) } // Don't throw in this analysis dialog - rms = ((WaveTrack *)t)->GetRMS(mT0, mT1, false); + rms = t->GetRMS(mT0, mT1, false); meanSq += rms * rms; - t = (WaveTrack *) iter.Next(); } // TODO: This works for stereo, provided the audio clips are in both channels. // We should really count gaps between clips as silence. - rms = (meanSq > 0.0)? sqrt(meanSq/(double)numberSelecteTracks) : 0.0; + rms = (meanSq > 0.0)? sqrt(meanSq/(double)numberSelectedTracks) : 0.0; - if(numberSelecteTracks == 0) { - AudacityMessageDialog m(NULL, _("Please select an audio track."), _("Error"), wxOK); - m.ShowModal(); - return false; - } // Gives warning C4056, Overflow in floating-point constant arithmetic // -INFINITY is intentional here. // Looks like we are stuck with this warning, as @@ -344,9 +340,8 @@ void ContrastDialog::OnClose(wxCommandEvent & WXUNUSED(event)) void ContrastDialog::OnGetForeground(wxCommandEvent & /*event*/) { AudacityProject *p = GetActiveProject(); - SelectedTrackListOfKindIterator iter(Track::Wave, p->GetTracks()); - for (Track *t = iter.First(); t; t = iter.Next()) { + for ( auto t : p->GetTracks()->Selected< const WaveTrack >() ) { mForegroundStartT->SetValue(p->mViewInfo.selectedRegion.t0()); mForegroundEndT->SetValue(p->mViewInfo.selectedRegion.t1()); } @@ -360,9 +355,8 @@ void ContrastDialog::OnGetForeground(wxCommandEvent & /*event*/) void ContrastDialog::OnGetBackground(wxCommandEvent & /*event*/) { AudacityProject *p = GetActiveProject(); - SelectedTrackListOfKindIterator iter(Track::Wave, p->GetTracks()); - for (Track *t = iter.First(); t; t = iter.Next()) { + for ( auto t : p->GetTracks()->Selected< const WaveTrack >() ) { mBackgroundStartT->SetValue(p->mViewInfo.selectedRegion.t0()); mBackgroundEndT->SetValue(p->mViewInfo.selectedRegion.t1()); } diff --git a/src/effects/Effect.cpp b/src/effects/Effect.cpp index 5a312d82c..35884602f 100644 --- a/src/effects/Effect.cpp +++ b/src/effects/Effect.cpp @@ -2262,25 +2262,8 @@ void Effect::ReplaceProcessedTracks(const bool bGoodResult) void Effect::CountWaveTracks() { - mNumTracks = 0; - mNumGroups = 0; - - TrackListOfKindIterator iter(Track::Wave, mTracks); - Track *t = iter.First(); - - while(t) { - if (!t->GetSelected()) { - t = iter.Next(); - continue; - } - - if (t->GetKind() == Track::Wave) { - mNumTracks++; - if (!t->GetLinked()) - mNumGroups++; - } - t = iter.Next(); - } + mNumTracks = mTracks->Selected< const WaveTrack >().size(); + mNumGroups = mTracks->SelectedLeaders< const WaveTrack >().size(); } double Effect::CalcPreviewInputLength(double previewLength) @@ -2574,17 +2557,13 @@ void Effect::Preview(bool dryOnly) } } else { - TrackListOfKindIterator iter(Track::Wave, saveTracks); - WaveTrack *src = (WaveTrack *) iter.First(); - while (src) - { + for (auto src : saveTracks->Any< const WaveTrack >()) { if (src->GetSelected() || mPreviewWithNotSelected) { auto dest = src->Copy(mT0, t1); dest->SetSelected(src->GetSelected()); static_cast(dest.get())->SetDisplay(WaveTrack::NoDisplay); mTracks->Add(std::move(dest)); } - src = (WaveTrack *) iter.Next(); } } diff --git a/src/effects/Equalization.cpp b/src/effects/Equalization.cpp index d316f420e..e6e568b85 100644 --- a/src/effects/Equalization.cpp +++ b/src/effects/Equalization.cpp @@ -471,23 +471,20 @@ bool EffectEqualization::Init() { int selcount = 0; double rate = 0.0; - TrackListIterator iter(GetActiveProject()->GetTracks()); - Track *t = iter.First(); - while (t) { - if (t->GetSelected() && t->GetKind() == Track::Wave) { - WaveTrack *track = (WaveTrack *)t; - if (selcount==0) { - rate = track->GetRate(); + + auto trackRange = + GetActiveProject()->GetTracks()->Selected< const WaveTrack >(); + if (trackRange) { + rate = (*(trackRange.first++)) -> GetRate(); + ++selcount; + + for (auto track : trackRange) { + if (track->GetRate() != rate) { + Effect::MessageBox(_("To apply Equalization, all selected tracks must have the same sample rate.")); + return(false); } - else { - if (track->GetRate() != rate) { - Effect::MessageBox(_("To apply Equalization, all selected tracks must have the same sample rate.")); - return(false); - } - } - selcount++; + ++selcount; } - t = iter.Next(); } mHiFreq = rate / 2.0; @@ -532,10 +529,8 @@ bool EffectEqualization::Process() this->CopyInputTracks(); // Set up mOutputTracks. bool bGoodResult = true; - SelectedTrackListOfKindIterator iter(Track::Wave, mOutputTracks.get()); - WaveTrack *track = (WaveTrack *) iter.First(); int count = 0; - while (track) { + for( auto track : mOutputTracks->Selected< WaveTrack >() ) { double trackStart = track->GetStartTime(); double trackEnd = track->GetEndTime(); double t0 = mT0 < trackStart? trackStart: mT0; @@ -553,7 +548,6 @@ bool EffectEqualization::Process() } } - track = (WaveTrack *) iter.Next(); count++; } diff --git a/src/effects/Equalization48x.cpp b/src/effects/Equalization48x.cpp index bdc8ceab4..85ca8f6a4 100644 --- a/src/effects/Equalization48x.cpp +++ b/src/effects/Equalization48x.cpp @@ -296,10 +296,9 @@ bool EffectEqualization48x::Process(EffectEqualization* effectEqualization) mEffectEqualization->mM=(mEffectEqualization->mM&(~15))+1; AllocateBuffersWorkers(sMathPath&MATH_FUNCTION_THREADED); auto cleanup = finally( [&] { FreeBuffersWorkers(); } ); - SelectedTrackListOfKindIterator iter(Track::Wave, mEffectEqualization->mOutputTracks.get()); - WaveTrack *track = (WaveTrack *) iter.First(); int count = 0; - while (track) { + for( auto track : + mEffectEqualization->mOutputTracks->Selected< WaveTrack >() { double trackStart = track->GetStartTime(); double trackEnd = track->GetEndTime(); double t0 = mEffectEqualization->mT0 < trackStart? trackStart: mEffectEqualization->mT0; @@ -313,7 +312,6 @@ bool EffectEqualization48x::Process(EffectEqualization* effectEqualization) if( bBreakLoop ) break; } - track = (WaveTrack *) iter.Next(); count++; } @@ -340,10 +338,7 @@ bool EffectEqualization48x::TrackCompare() TrackList SecondOutputTracks; - //iterate over tracks of type trackType (All types if Track::All) - TrackListOfKindIterator aIt(mEffectEqualization->mOutputTracksType, mEffectEqualization->mTracks); - - for (Track *aTrack = aIt.First(); aTrack; aTrack = aIt.Next()) { + for (auto aTrack : mEffectEqualization->mTracks->Any< WaveTrack >()) { // Include selected tracks, plus sync-lock selected tracks for Track::All. if (aTrack->GetSelected() || @@ -357,15 +352,12 @@ bool EffectEqualization48x::TrackCompare() } } - for(int i=0;i<2;i++) { - SelectedTrackListOfKindIterator iter - (Track::Wave, i - ? mEffectEqualization->mOutputTracks.get() - : &SecondOutputTracks); + for(int i = 0; i < 2; i++) { i?sMathPath=sMathPath:sMathPath=0; - WaveTrack *track = (WaveTrack *) iter.First(); int count = 0; - while (track) { + for( auto track : + ( i ? mEffectEqualization->mOutputTracks.get() + : &SecondOutputTracks ) -> Selected< WaveTrack >() { double trackStart = track->GetStartTime(); double trackEnd = track->GetEndTime(); double t0 = mEffectEqualization->mT0 < trackStart? trackStart: mEffectEqualization->mT0; @@ -379,16 +371,14 @@ bool EffectEqualization48x::TrackCompare() if( bBreakLoop ) break; } - track = (WaveTrack *) iter.Next(); count++; } } - SelectedTrackListOfKindIterator - iter(Track::Wave, mEffectEqualization->mOutputTracks.get()); - SelectedTrackListOfKindIterator iter2(Track::Wave, &SecondOutputTracks); - WaveTrack *track = (WaveTrack *) iter.First(); - WaveTrack *track2 = (WaveTrack *) iter2.First(); - while (track) { + + auto iter2 = (SecondOutputTracks.Selected< const WaveTrack >()).first; + auto track2 = *iter2; + for ( auto track : + mEffectEqualization->mOutputTracks->Selected< const WaveTrack >() { double trackStart = track->GetStartTime(); double trackEnd = track->GetEndTime(); double t0 = mEffectEqualization->mT0 < trackStart? trackStart: mEffectEqualization->mT0; @@ -400,8 +390,7 @@ bool EffectEqualization48x::TrackCompare() auto len = end - start; DeltaTrack(track, track2, start, len); } - track = (WaveTrack *) iter.Next(); - track2 = (WaveTrack *) iter2.Next(); + track2 = * ++iter2; } mEffectEqualization->ReplaceProcessedTracks(!bBreakLoop); return bBreakLoop; // return !bBreakLoop ? @@ -447,12 +436,10 @@ bool EffectEqualization48x::Benchmark(EffectEqualization* effectEqualization) mEffectEqualization->mM=(mEffectEqualization->mM&(~15))+1; AllocateBuffersWorkers(MATH_FUNCTION_THREADED); auto cleanup = finally( [&] { FreeBuffersWorkers(); } ); - SelectedTrackListOfKindIterator - iter(Track::Wave, mEffectEqualization->mOutputTracks.get()); long times[] = { 0,0,0,0,0 }; wxStopWatch timer; - mBenching=true; - for(int i=0;i<5 && !bBreakLoop;i++) { + mBenching = true; + for(int i = 0; i < 5 && !bBreakLoop; i++) { int localMathPath; switch(i) { case 0: localMathPath=MATH_FUNCTION_SSE|MATH_FUNCTION_THREADED; @@ -471,11 +458,11 @@ bool EffectEqualization48x::Benchmark(EffectEqualization* effectEqualization) break; default: localMathPath=-1; } - if(localMathPath>=0) { + if(localMathPath >= 0) { timer.Start(); - WaveTrack *track = (WaveTrack *) iter.First(); int count = 0; - while (track) { + for (auto track : + mEffectEqualization->mOutputTracks->Selected< WaveTrack >() { double trackStart = track->GetStartTime(); double trackEnd = track->GetEndTime(); double t0 = mEffectEqualization->mT0 < trackStart? trackStart: mEffectEqualization->mT0; @@ -489,7 +476,6 @@ bool EffectEqualization48x::Benchmark(EffectEqualization* effectEqualization) if( bBreakLoop ) break; } - track = (WaveTrack *) iter.Next(); count++; } times[i]=timer.Time(); diff --git a/src/effects/NoiseReduction.cpp b/src/effects/NoiseReduction.cpp index 4325c4161..6437a957d 100644 --- a/src/effects/NoiseReduction.cpp +++ b/src/effects/NoiseReduction.cpp @@ -264,7 +264,7 @@ public: bool Process(EffectNoiseReduction &effect, Statistics &statistics, TrackFactory &factory, - SelectedTrackListOfKindIterator &iter, double mT0, double mT1); + TrackList &tracks, double mT0, double mT1); private: bool ProcessOne(EffectNoiseReduction &effect, @@ -606,8 +606,7 @@ bool EffectNoiseReduction::Process() this->CopyInputTracks(); // Set up mOutputTracks. - SelectedTrackListOfKindIterator iter(Track::Wave, mOutputTracks.get()); - WaveTrack *track = (WaveTrack *) iter.First(); + auto track = * (mOutputTracks->Selected< const WaveTrack >()).begin(); if (!track) return false; @@ -633,7 +632,8 @@ bool EffectNoiseReduction::Process() , mF0, mF1 #endif ); - bool bGoodResult = worker.Process(*this, *mStatistics, *mFactory, iter, mT0, mT1); + bool bGoodResult = worker.Process + (*this, *mStatistics, *mFactory, *mOutputTracks, mT0, mT1); if (mSettings->mDoProfile) { if (bGoodResult) mSettings->mDoProfile = false; // So that "repeat last effect" will reduce noise @@ -650,11 +650,10 @@ EffectNoiseReduction::Worker::~Worker() bool EffectNoiseReduction::Worker::Process (EffectNoiseReduction &effect, Statistics &statistics, TrackFactory &factory, - SelectedTrackListOfKindIterator &iter, double inT0, double inT1) + TrackList &tracks, double inT0, double inT1) { int count = 0; - WaveTrack *track = (WaveTrack *) iter.First(); - while (track) { + for ( auto track : tracks.Selected< WaveTrack >() ) { if (track->GetRate() != mSampleRate) { if (mDoProfile) effect.Effect::MessageBox(_("All noise profile data must have the same sample rate.")); @@ -677,7 +676,6 @@ bool EffectNoiseReduction::Worker::Process count, track, start, len)) return false; } - track = (WaveTrack *) iter.Next(); ++count; } diff --git a/src/effects/NoiseRemoval.cpp b/src/effects/NoiseRemoval.cpp index 54c08bf78..b10c6390b 100644 --- a/src/effects/NoiseRemoval.cpp +++ b/src/effects/NoiseRemoval.cpp @@ -208,10 +208,8 @@ bool EffectNoiseRemoval::Process() this->CopyInputTracks(); // Set up mOutputTracks. bool bGoodResult = true; - SelectedTrackListOfKindIterator iter(Track::Wave, mOutputTracks.get()); - WaveTrack *track = (WaveTrack *) iter.First(); int count = 0; - while (track) { + for( auto track : mOutputTracks->Selected< WaveTrack >() ) { double trackStart = track->GetStartTime(); double trackEnd = track->GetEndTime(); double t0 = mT0 < trackStart? trackStart: mT0; @@ -227,7 +225,6 @@ bool EffectNoiseRemoval::Process() break; } } - track = (WaveTrack *) iter.Next(); count++; } diff --git a/src/effects/Paulstretch.cpp b/src/effects/Paulstretch.cpp index 067209af9..01ba0a06a 100644 --- a/src/effects/Paulstretch.cpp +++ b/src/effects/Paulstretch.cpp @@ -164,11 +164,9 @@ double EffectPaulstretch::CalcPreviewInputLength(double previewLength) bool EffectPaulstretch::Process() { CopyInputTracks(); - SelectedTrackListOfKindIterator iter(Track::Wave, mOutputTracks.get()); - WaveTrack *track = (WaveTrack *) iter.First(); m_t1=mT1; int count=0; - while (track) { + for( auto track : mOutputTracks->Selected< WaveTrack >() ) { double trackStart = track->GetStartTime(); double trackEnd = track->GetEndTime(); double t0 = mT0 < trackStart? trackStart: mT0; @@ -179,7 +177,6 @@ bool EffectPaulstretch::Process() return false; } - track = (WaveTrack *) iter.Next(); count++; } mT1=m_t1; diff --git a/src/effects/Repair.cpp b/src/effects/Repair.cpp index 9d6f18f76..940b328ff 100644 --- a/src/effects/Repair.cpp +++ b/src/effects/Repair.cpp @@ -74,10 +74,8 @@ bool EffectRepair::Process() this->CopyInputTracks(); // Set up mOutputTracks. //v This may be too much copying for EffectRepair. bool bGoodResult = true; - SelectedTrackListOfKindIterator iter(Track::Wave, mOutputTracks.get()); - WaveTrack *track = (WaveTrack *) iter.First(); int count = 0; - while (track) { + for( auto track : mOutputTracks->Selected< WaveTrack >() ) { const double trackStart = track->GetStartTime(); const double repair_t0 = std::max(mT0, trackStart); @@ -125,7 +123,6 @@ bool EffectRepair::Process() } } - track = (WaveTrack *) iter.Next(); count++; } diff --git a/src/effects/SimpleMono.cpp b/src/effects/SimpleMono.cpp index 2e91fbda6..26fd7c54e 100644 --- a/src/effects/SimpleMono.cpp +++ b/src/effects/SimpleMono.cpp @@ -32,10 +32,8 @@ bool EffectSimpleMono::Process() this->CopyInputTracks(); // Set up mOutputTracks. bool bGoodResult = true; - SelectedTrackListOfKindIterator iter(Track::Wave, mOutputTracks.get()); - WaveTrack* pOutWaveTrack = (WaveTrack*)(iter.First()); mCurTrackNum = 0; - while (pOutWaveTrack != NULL) + for( auto pOutWaveTrack : mOutputTracks->Selected< WaveTrack >() ) { //Get start and end times from track double trackStart = pOutWaveTrack->GetStartTime(); @@ -66,8 +64,6 @@ bool EffectSimpleMono::Process() } } - //Iterate to the next track - pOutWaveTrack = (WaveTrack*)(iter.Next()); mCurTrackNum++; } diff --git a/src/effects/StereoToMono.cpp b/src/effects/StereoToMono.cpp index 3f44b052b..b80f5f4a8 100644 --- a/src/effects/StereoToMono.cpp +++ b/src/effects/StereoToMono.cpp @@ -75,8 +75,8 @@ bool EffectStereoToMono::Process() this->CopyInputTracks(); // Set up mOutputTracks. bool bGoodResult = true; - SelectedTrackListOfKindIterator iter(Track::Wave, mOutputTracks.get()); - mLeftTrack = (WaveTrack *)iter.First(); + auto trackRange = mOutputTracks->Selected< WaveTrack >(); + mLeftTrack = *trackRange.first; bool refreshIter = false; if(mLeftTrack) @@ -87,13 +87,12 @@ bool EffectStereoToMono::Process() } int count = 0; - while (mLeftTrack) { - if (mLeftTrack->GetKind() == Track::Wave && - mLeftTrack->GetSelected() && - mLeftTrack->GetLinked()) { + while ( trackRange.first != trackRange.second ) { + mLeftTrack = *trackRange.first; + if (mLeftTrack->GetLinked()) { // Assume linked track is wave - mRightTrack = static_cast(iter.Next()); + mRightTrack = * ++ trackRange.first; if ((mLeftTrack->GetRate() == mRightTrack->GetRate())) { auto leftTrackStart = mLeftTrack->TimeToLongSamples(mLeftTrack->GetStartTime()); @@ -116,12 +115,12 @@ bool EffectStereoToMono::Process() } if (refreshIter) { - mLeftTrack = (WaveTrack *)iter.First(); + trackRange = mOutputTracks->Selected< WaveTrack >(); refreshIter = false; } - else { - mLeftTrack = (WaveTrack *)iter.Next(); - } + else + ++trackRange.first; + count++; } diff --git a/src/effects/TruncSilence.cpp b/src/effects/TruncSilence.cpp index 8739a0bb9..cd6b3064e 100644 --- a/src/effects/TruncSilence.cpp +++ b/src/effects/TruncSilence.cpp @@ -405,10 +405,10 @@ bool EffectTruncSilence::ProcessAll() auto trackRange0 = inputTracks()->Selected< const WaveTrack >(); if (FindSilences( silences, inputTracks(), *trackRange0.begin(), *trackRange0.rbegin())) { - TrackListIterator iterOut(mOutputTracks.get()); + auto trackRange = mOutputTracks->Any(); double totalCutLen = 0.0; - Track *const first = iterOut.First(); - if (DoRemoval(silences, 0, 1, first, iterOut.Last(), totalCutLen)) { + if (DoRemoval(silences, 0, 1, + *trackRange.begin(), *trackRange.rbegin(), totalCutLen)) { mT1 -= totalCutLen; return true; } diff --git a/src/effects/TwoPassSimpleMono.cpp b/src/effects/TwoPassSimpleMono.cpp index 71ad6f4e7..dbb7133df 100644 --- a/src/effects/TwoPassSimpleMono.cpp +++ b/src/effects/TwoPassSimpleMono.cpp @@ -47,10 +47,8 @@ bool EffectTwoPassSimpleMono::Process() bool EffectTwoPassSimpleMono::ProcessPass() { //Iterate over each track - SelectedTrackListOfKindIterator iter(Track::Wave, mOutputTracks.get()); - WaveTrack *track = (WaveTrack *) iter.First(); mCurTrackNum = 0; - while (track) { + for( auto track : mOutputTracks->Selected< WaveTrack >() ) { //Get start and end times from track double trackStart = track->GetStartTime(); double trackEnd = track->GetEndTime(); @@ -85,8 +83,6 @@ bool EffectTwoPassSimpleMono::ProcessPass() return false; } - //Iterate to the next track - track = (WaveTrack *) iter.Next(); mCurTrackNum++; } diff --git a/src/effects/nyquist/Nyquist.cpp b/src/effects/nyquist/Nyquist.cpp index f61c3f338..e8f025df3 100644 --- a/src/effects/nyquist/Nyquist.cpp +++ b/src/effects/nyquist/Nyquist.cpp @@ -48,6 +48,8 @@ effects from this one class. #include "../../FileNames.h" #include "../../Internat.h" #include "../../LabelTrack.h" +#include "../../NoteTrack.h" +#include "../../TimeTrack.h" #include "../../prefs/SpectrogramSettings.h" #include "../../Project.h" #include "../../ShuttleGui.h" @@ -544,8 +546,8 @@ bool NyquistEffect::Init() AudacityProject *project = GetActiveProject(); bool bAllowSpectralEditing = true; - SelectedTrackListOfKindIterator sel(Track::Wave, project->GetTracks()); - for (WaveTrack *t = (WaveTrack *) sel.First(); t; t = (WaveTrack *) sel.Next()) { + for ( auto t : + project->GetTracks()->Selected< const WaveTrack >() ) { if (t->GetDisplay() != WaveTrack::Spectrum || !(t->GetSpectrogramSettings().SpectralSelectionEnabled())) { bAllowSpectralEditing = false; @@ -622,7 +624,6 @@ bool NyquistEffect::Process() mProgress->Hide(); } - mOutputTime = 0; mCount = 0; mProgressIn = 0; @@ -636,10 +637,8 @@ bool NyquistEffect::Process() mTrackIndex = 0; - mNumSelectedChannels = 0; - // If in tool mode, then we don't do anything with the track and selection. - bool bOnePassTool = (GetType() == EffectTypeTool); + const bool bOnePassTool = (GetType() == EffectTypeTool); // We must copy all the tracks, because Paste needs label tracks to ensure // correct sync-lock group behavior when the timeline is affected; then we just want @@ -647,16 +646,7 @@ bool NyquistEffect::Process() if ( !bOnePassTool ) CopyInputTracks(true); - SelectedTrackListOfKindIterator sel(Track::Wave, mOutputTracks.get()); - for (WaveTrack *t = (WaveTrack *) sel.First(); t; t = (WaveTrack *) sel.Next()) { - mNumSelectedChannels++; - if (mT1 >= mT0) { - if (t->GetLinked()) { - mNumSelectedChannels++; - sel.Next(); - } - } - } + mNumSelectedChannels = mOutputTracks->Selected< const WaveTrack >().size(); mDebugOutput.Clear(); if (!mHelpFile.IsEmpty() && !mHelpFileExists) { @@ -720,8 +710,6 @@ bool NyquistEffect::Process() mProps += wxString::Format(wxT("(putprop '*PROJECT* %d 'PROJECTS)\n"), (int) gAudacityProjects.size()); mProps += wxString::Format(wxT("(putprop '*PROJECT* \"%s\" 'NAME)\n"), project->GetName()); - TrackListIterator all(project->GetTracks()); - Track *t; int numTracks = 0; int numWave = 0; int numLabel = 0; @@ -729,29 +717,21 @@ bool NyquistEffect::Process() int numTime = 0; wxString waveTrackList = wxT(""); // track positions of selected audio tracks. - for (t = all.First(); t; t = all.Next()) { - switch (t->GetKind()) - { - case Track::Wave: + auto countRange = project->GetTracks()->Leaders(); + for (auto t : countRange) { + t->TypeSwitch( [&](const WaveTrack *) { numWave++; - if (t->GetSelected()) { + if (t->GetSelected()) waveTrackList += wxString::Format(wxT("%d "), 1 + numTracks); - } - break; - case Track::Label: numLabel++; break; -#if defined(USE_MIDI) - case Track::Note: numMidi++; break; -#endif - case Track::Time: numTime++; break; - default: break; - } - - numTracks++; - if (t->GetLinked()) - { - all.Next(); + }); + numTracks++; } + numLabel = countRange.Filter().size(); + #if defined(USE_MIDI) + numMidi = countRange.Filter().size(); + #endif + numTime = countRange.Filter().size(); } // We use Internat::ToString() rather than "%g" here because we @@ -789,8 +769,7 @@ bool NyquistEffect::Process() Effect::MessageBox(message, wxOK | wxCENTRE | wxICON_EXCLAMATION, _("Nyquist Error")); } - SelectedTrackListOfKindIterator iter(Track::Wave, mOutputTracks.get()); - mCurTrack[0] = (WaveTrack *) iter.First(); + auto trackRange = mOutputTracks->Selected< WaveTrack >(); // Keep track of whether the current track is first selected in its sync-lock group // (we have no idea what the length of the returned audio will be, so we have @@ -798,19 +777,21 @@ bool NyquistEffect::Process() mFirstInGroup = true; Track *gtLast = NULL; - while (mCurTrack[0] || bOnePassTool) { + for (auto &iter = trackRange.first, &end = trackRange.second; + bOnePassTool || iter != end; ++iter) { + mCurTrack[0] = *iter; mCurNumChannels = 1; - if ((mT1 >= mT0)||bOnePassTool) { + if ( (mT1 >= mT0) || bOnePassTool ) { if (bOnePassTool) { - - } else { + } + else { if (mCurTrack[0]->GetLinked()) { mCurNumChannels = 2; - mCurTrack[1] = (WaveTrack *)iter.Next(); + mCurTrack[1] = * ++ iter; if (mCurTrack[1]->GetRate() != mCurTrack[0]->GetRate()) { Effect::MessageBox(_("Sorry, cannot apply effect on stereo tracks where the tracks don't match."), - wxOK | wxCENTRE); + wxOK | wxCENTRE); success = false; goto finish; } @@ -840,6 +821,7 @@ bool NyquistEffect::Process() mCurLen = std::min(mCurLen, mMaxLen); } + mProgressIn = 0.0; mProgressOut = 0.0; @@ -914,7 +896,6 @@ bool NyquistEffect::Process() mProgressTot += mProgressIn + mProgressOut; } - mCurTrack[0] = (WaveTrack *) iter.Next(); mCount += mCurNumChannels; } @@ -1112,22 +1093,9 @@ bool NyquistEffect::ProcessOne() //NOTE: Audacity 2.1.3 True if spectral selection is enabled regardless of track view. cmd += wxString::Format(wxT("(putprop '*TRACK* %s 'SPECTRAL-EDIT-ENABLED)\n"), spectralEditp); - double startTime = 0.0; - double endTime = 0.0; - - if (mCurTrack[0]->GetLinked()) { - startTime = std::min(mCurTrack[0]->GetStartTime(), mCurTrack[0]->GetLink()->GetStartTime()); - } - else { - startTime = mCurTrack[0]->GetStartTime(); - } - - if (mCurTrack[0]->GetLinked()) { - endTime = std::max(mCurTrack[0]->GetEndTime(), mCurTrack[0]->GetLink()->GetEndTime()); - } - else { - endTime = mCurTrack[0]->GetEndTime(); - } + auto channels = TrackList::Channels( mCurTrack[0] ); + double startTime = channels.min( &Track::GetStartTime ); + double endTime = channels.max( &Track::GetEndTime ); cmd += wxString::Format(wxT("(putprop '*TRACK* (float %s) 'START-TIME)\n"), Internat::ToString(startTime)); @@ -1415,16 +1383,7 @@ bool NyquistEffect::ProcessOne() mProjectChanged = true; unsigned int numLabels = nyx_get_num_labels(); unsigned int l; - LabelTrack *ltrack = NULL; - - TrackListIterator iter(mOutputTracks.get()); - for (Track *t = iter.First(); t; t = iter.Next()) { - if (t->GetKind() == Track::Label) { - ltrack = (LabelTrack *)t; - break; - } - } - + auto ltrack = * mOutputTracks->Any< LabelTrack >().begin(); if (!ltrack) { ltrack = static_cast(AddToOutputTracks(mFactory->NewLabelTrack())); } @@ -1675,12 +1634,10 @@ double NyquistEffect::GetCtrlValue(const wxString &s) * be determined. * AudacityProject *project = GetActiveProject(); - double rate = INT_MAX; if (project && s.IsSameAs(wxT("half-srate"), false)) { - SelectedTrackListOfKindIterator sel(Track::Wave, project->GetTracks()); - for (WaveTrack *t = (WaveTrack *) sel.First(); t; t = (WaveTrack *) sel.Next()) { - rate = std::min(t->GetRate(), rate); - } + auto rate = + project->GetTracks()->Selected< const WaveTrack >() + .min( &WaveTrack::GetRate ); return (rate / 2.0); } */