From 2e11844f6a36d4d5218d154db3fb9dfe0996f8c0 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Sat, 31 Dec 2016 04:33:35 -0500 Subject: [PATCH] Effect::inputTracks() now gives only const access --- src/effects/Amplify.cpp | 6 ++--- src/effects/AutoDuck.cpp | 5 +--- src/effects/ChangePitch.cpp | 3 +-- src/effects/Compressor.cpp | 11 +++------ src/effects/Effect.h | 2 +- src/effects/Equalization.cpp | 3 +-- src/effects/FindClipping.cpp | 21 ++++++----------- src/effects/ScienFilter.cpp | 32 +++++++++++-------------- src/effects/TruncSilence.cpp | 42 +++++++++++++++------------------ src/effects/TruncSilence.h | 3 ++- src/effects/vamp/VampEffect.cpp | 23 ++++++------------ 11 files changed, 58 insertions(+), 93 deletions(-) diff --git a/src/effects/Amplify.cpp b/src/effects/Amplify.cpp index f09abe374..b71dce940 100644 --- a/src/effects/Amplify.cpp +++ b/src/effects/Amplify.cpp @@ -180,11 +180,9 @@ bool EffectAmplify::Init() { mPeak = 0.0; - SelectedTrackListOfKindIterator iter(Track::Wave, inputTracks()); - - for (Track *t = iter.First(); t; t = iter.Next()) + for (auto t : inputTracks()->Selected< const WaveTrack >()) { - auto pair = ((WaveTrack *)t)->GetMinMax(mT0, mT1); // may throw + auto pair = t->GetMinMax(mT0, mT1); // may throw const float min = pair.first, max = pair.second; float newpeak = (fabs(min) > fabs(max) ? fabs(min) : fabs(max)); diff --git a/src/effects/AutoDuck.cpp b/src/effects/AutoDuck.cpp index cf6bcc988..c6ec25f7a 100644 --- a/src/effects/AutoDuck.cpp +++ b/src/effects/AutoDuck.cpp @@ -209,13 +209,10 @@ bool EffectAutoDuck::Init() { mControlTrack = NULL; - TrackListIterator iter(inputTracks()); - Track *t = iter.First(); - bool lastWasSelectedWaveTrack = false; const WaveTrack *controlTrackCandidate = NULL; - while(t) + for (auto t : inputTracks()->Any()) { if (lastWasSelectedWaveTrack && !t->GetSelected()) { // This could be the control track, so remember it diff --git a/src/effects/ChangePitch.cpp b/src/effects/ChangePitch.cpp index 9a3df3978..dee3f4f5c 100644 --- a/src/effects/ChangePitch.cpp +++ b/src/effects/ChangePitch.cpp @@ -409,8 +409,7 @@ void EffectChangePitch::DeduceFrequencies() { // As a neat trick, attempt to get the frequency of the note at the // beginning of the selection. - SelectedTrackListOfKindIterator iter(Track::Wave, inputTracks()); - WaveTrack *track = (WaveTrack *) iter.First(); + auto track = *( inputTracks()->Selected< const WaveTrack >() ).first; if (track) { double rate = track->GetRate(); diff --git a/src/effects/Compressor.cpp b/src/effects/Compressor.cpp index 5a15ed157..84a5d0245 100644 --- a/src/effects/Compressor.cpp +++ b/src/effects/Compressor.cpp @@ -362,14 +362,9 @@ bool EffectCompressor::InitPass1() DisableSecondPass(); // Find the maximum block length required for any track - size_t maxlen = 0; - SelectedTrackListOfKindIterator iter(Track::Wave, inputTracks()); - WaveTrack *track = (WaveTrack *) iter.First(); - while (track) { - maxlen = std::max(maxlen, track->GetMaxBlockSize()); - //Iterate to the next track - track = (WaveTrack *) iter.Next(); - } + size_t maxlen = inputTracks()->Selected< const WaveTrack >().max( + &WaveTrack::GetMaxBlockSize + ); mFollow1.reset(); mFollow2.reset(); // Allocate buffers for the envelope diff --git a/src/effects/Effect.h b/src/effects/Effect.h index 69173c105..9ce5aa98e 100644 --- a/src/effects/Effect.h +++ b/src/effects/Effect.h @@ -459,7 +459,7 @@ protected: double mSampleRate; SelectedRegion *mpSelectedRegion{}; TrackFactory *mFactory; - TrackList *inputTracks() const { return mTracks; } + const TrackList *inputTracks() const { return mTracks; } std::shared_ptr mOutputTracks; // used only if CopyInputTracks() is called. double mT0; double mT1; diff --git a/src/effects/Equalization.cpp b/src/effects/Equalization.cpp index d9159f957..d316f420e 100644 --- a/src/effects/Equalization.cpp +++ b/src/effects/Equalization.cpp @@ -588,8 +588,7 @@ void EffectEqualization::PopulateOrExchange(ShuttleGui & S) LoadCurves(); - TrackListOfKindIterator iter(Track::Wave, inputTracks()); - WaveTrack *t = (WaveTrack *) iter.First(); + const auto t = *inputTracks()->Any< const WaveTrack >().first; mHiFreq = (t ? t->GetRate() : GetActiveProject()->GetRate()) / 2.0; mLoFreq = loFreqI; diff --git a/src/effects/FindClipping.cpp b/src/effects/FindClipping.cpp index 23eb4fec4..3c758b9ba 100644 --- a/src/effects/FindClipping.cpp +++ b/src/effects/FindClipping.cpp @@ -108,26 +108,20 @@ bool EffectFindClipping::Process() Maybe modifiedTrack; const wxString name{ _("Clipping") }; - LabelTrack *lt = NULL; - TrackListOfKindIterator iter(Track::Label, inputTracks()); - for (Track *t = iter.First(); t; t = iter.Next()) { - if (t->GetName() == name) { - lt = (LabelTrack *)t; - break; - } - } + auto clt = *inputTracks()->Any< const LabelTrack >().find_if( + [&]( const Track *track ){ return track->GetName() == name; } ); - if (!lt) + LabelTrack *lt{}; + if (!clt) addedTrack = (AddAnalysisTrack(name)), lt = addedTrack->get(); else - modifiedTrack.create(ModifyAnalysisTrack(lt, name)), lt = modifiedTrack->get(); + modifiedTrack.create(ModifyAnalysisTrack(clt, name)), + lt = modifiedTrack->get(); int count = 0; // JC: Only process selected tracks. - SelectedTrackListOfKindIterator waves(Track::Wave, inputTracks()); - WaveTrack *t = (WaveTrack *) waves.First(); - while (t) { + for (auto t : inputTracks()->Selected< const WaveTrack >()) { double trackStart = t->GetStartTime(); double trackEnd = t->GetEndTime(); double t0 = mT0 < trackStart ? trackStart : mT0; @@ -144,7 +138,6 @@ bool EffectFindClipping::Process() } count++; - t = (WaveTrack *) waves.Next(); } // No cancellation, so commit the addition of the track. diff --git a/src/effects/ScienFilter.cpp b/src/effects/ScienFilter.cpp index e274d40d1..c2d5e0e2b 100644 --- a/src/effects/ScienFilter.cpp +++ b/src/effects/ScienFilter.cpp @@ -336,30 +336,26 @@ bool EffectScienFilter::Init() int selcount = 0; double rate = 0.0; - TrackListOfKindIterator iter(Track::Wave, inputTracks()); - WaveTrack *t = (WaveTrack *) iter.First(); + auto trackRange = inputTracks()->Selected< const WaveTrack >(); + auto t = *trackRange.begin(); mNyquist = (t ? t->GetRate() : GetActiveProject()->GetRate()) / 2.0; - while (t) + for (auto t : trackRange) { - if (t->GetSelected()) + if (selcount == 0) { - if (selcount == 0) - { - rate = t->GetRate(); - } - else - { - if (t->GetRate() != rate) - { - Effect::MessageBox(_("To apply a filter, all selected tracks must have the same sample rate.")); - return false; - } - } - selcount++; + rate = t->GetRate(); } - t = (WaveTrack *) iter.Next(); + else + { + if (t->GetRate() != rate) + { + Effect::MessageBox(_("To apply a filter, all selected tracks must have the same sample rate.")); + return false; + } + } + selcount++; } return true; diff --git a/src/effects/TruncSilence.cpp b/src/effects/TruncSilence.cpp index ec3ca642c..3a8f3adcc 100644 --- a/src/effects/TruncSilence.cpp +++ b/src/effects/TruncSilence.cpp @@ -243,12 +243,9 @@ double EffectTruncSilence::CalcPreviewInputLength(double /* previewLength */) // Start with the whole selection silent silences.push_back(Region(mT0, mT1)); - SelectedTrackListOfKindIterator iter(Track::Wave, inputTracks()); int whichTrack = 0; - for (Track *t = iter.First(); t; t = iter.Next()) { - WaveTrack *const wt = static_cast(t); - + for (auto wt : inputTracks()->Selected< const WaveTrack >()) { RegionList trackSilences; auto index = wt->TimeToLongSamples(mT0); @@ -334,17 +331,17 @@ bool EffectTruncSilence::ProcessIndependently() // Check if it's permissible { - for (auto track : inputTracks()->SelectedLeaders< WaveTrack >() ) { + for (auto track : inputTracks()->SelectedLeaders< const WaveTrack >() ) { if (syncLock) { - Track *const link = track->GetLink(); - SyncLockedTracksIterator syncIter(inputTracks()); - for (Track *track2 = syncIter.StartWith(track); track2; track2 = syncIter.Next()) { - if (track2->GetKind() == Track::Wave && - !(track2 == track || track2 == link) && - track2->GetSelected()) { - ::Effect::MessageBox(_("When truncating independently, there may only be one selected audio track in each Sync-Locked Track Group.")); - return false; - } + auto channels = TrackList::Channels(track); + auto otherTracks = + TrackList::SyncLockGroup(track).Filter() + + &Track::IsSelected + - [&](const Track *pTrack){ + return channels.contains(pTrack); }; + if (otherTracks) { + ::Effect::MessageBox(_("When truncating independently, there may only be one selected audio track in each Sync-Locked Track Group.")); + return false; } } @@ -405,8 +402,9 @@ bool EffectTruncSilence::ProcessAll() // This list should always be kept in order. RegionList silences; - SelectedTrackListOfKindIterator iter(Track::Wave, inputTracks()); - if (FindSilences(silences, inputTracks(), iter.First(), iter.Last())) { + auto trackRange0 = inputTracks()->Selected< const WaveTrack >(); + if (FindSilences( + silences, inputTracks(), *trackRange0.begin(), *trackRange0.rbegin())) { TrackListIterator iterOut(mOutputTracks.get()); double totalCutLen = 0.0; Track *const first = iterOut.First(); @@ -420,20 +418,18 @@ bool EffectTruncSilence::ProcessAll() } bool EffectTruncSilence::FindSilences - (RegionList &silences, TrackList *list, Track *firstTrack, Track *lastTrack) + (RegionList &silences, const TrackList *list, + const Track *firstTrack, const Track *lastTrack) { // Start with the whole selection silent silences.push_back(Region(mT0, mT1)); // Remove non-silent regions in each track - SelectedTrackListOfKindIterator iter(Track::Wave, list); int whichTrack = 0; - bool lastSeen = false; - for (Track *t = iter.StartWith(firstTrack); !lastSeen && t; t = iter.Next()) + for (auto wt : + list->Selected< const WaveTrack >() + .StartingWith( firstTrack ).EndingAfter( lastTrack ) ) { - lastSeen = (t == lastTrack); - WaveTrack *const wt = static_cast(t); - // Smallest silent region to detect in frames auto minSilenceFrames = sampleCount(std::max(mInitialAllowedSilence, DEF_MinTruncMs) * wt->GetRate()); diff --git a/src/effects/TruncSilence.h b/src/effects/TruncSilence.h index dbac468a6..35cc4fc24 100644 --- a/src/effects/TruncSilence.h +++ b/src/effects/TruncSilence.h @@ -90,7 +90,8 @@ private: bool ProcessIndependently(); bool ProcessAll(); bool FindSilences - (RegionList &silences, TrackList *list, Track *firstTrack, Track *lastTrack); + (RegionList &silences, const TrackList *list, + const Track *firstTrack, const Track *lastTrack); bool DoRemoval (const RegionList &silences, unsigned iGroup, unsigned nGroups, Track *firstTrack, Track *lastTrack, double &totalCutLen); diff --git a/src/effects/vamp/VampEffect.cpp b/src/effects/vamp/VampEffect.cpp index 6b87178b2..bb6e95b12 100644 --- a/src/effects/vamp/VampEffect.cpp +++ b/src/effects/vamp/VampEffect.cpp @@ -297,12 +297,9 @@ bool VampEffect::SetAutomationParameters(CommandParameters & parms) bool VampEffect::Init() { - TrackListOfKindIterator iter(Track::Wave, inputTracks()); - WaveTrack *left = (WaveTrack *)iter.First(); - mRate = 0.0; - while (left) + for (auto left : inputTracks()->Leaders< const WaveTrack >() ) { if (mRate == 0.0) { @@ -311,16 +308,16 @@ bool VampEffect::Init() if (left->GetLinked()) { - WaveTrack *right = (WaveTrack *)iter.Next(); + auto right = static_cast( left->GetLink() ); + // PRL: Track rate might not match individual clip rates. + // So is this check not adequate? if (left->GetRate() != right->GetRate()) { Effect::MessageBox(_("Sorry, Vamp Plug-ins cannot be run on stereo tracks where the individual channels of the track do not match.")); return false; } } - - left = (WaveTrack *)iter.Next(); } if (mRate <= 0.0) @@ -348,12 +345,8 @@ bool VampEffect::Process() return false; } - TrackListOfKindIterator iter(Track::Wave, inputTracks()); - int count = 0; - WaveTrack *left = (WaveTrack *)iter.First(); - bool multiple = false; unsigned prevTrackChannels = 0; @@ -368,18 +361,18 @@ bool VampEffect::Process() std::vector> addedTracks; - while (left) + for (auto left : inputTracks()->Leaders< const WaveTrack >() ) { sampleCount lstart, rstart = 0; sampleCount len; GetSamples(left, &lstart, &len); - WaveTrack *right = NULL; unsigned channels = 1; + const WaveTrack *right{}; if (left->GetLinked()) { - right = (WaveTrack *)iter.Next(); + right = static_cast< const WaveTrack* >( left->GetLink() ); channels = 2; GetSamples(right, &rstart, &len); } @@ -519,8 +512,6 @@ bool VampEffect::Process() AddFeatures(ltrack, features); prevTrackChannels = channels; - - left = (WaveTrack *)iter.Next(); } // All completed without cancellation, so commit the addition of tracks now