1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-07-16 00:27:42 +02:00

Effect::inputTracks() now gives only const access

This commit is contained in:
Paul Licameli 2016-12-31 04:33:35 -05:00
parent 1be3187b99
commit 2e11844f6a
11 changed files with 58 additions and 93 deletions

View File

@ -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));

View File

@ -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

View File

@ -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();

View File

@ -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

View File

@ -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<TrackList> mOutputTracks; // used only if CopyInputTracks() is called.
double mT0;
double mT1;

View File

@ -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;

View File

@ -108,26 +108,20 @@ bool EffectFindClipping::Process()
Maybe<ModifiedAnalysisTrack> 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.

View File

@ -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;

View File

@ -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<WaveTrack *>(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<const WaveTrack>()
+ &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<WaveTrack *>(t);
// Smallest silent region to detect in frames
auto minSilenceFrames =
sampleCount(std::max(mInitialAllowedSilence, DEF_MinTruncMs) * wt->GetRate());

View File

@ -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);

View File

@ -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<const WaveTrack*>( 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<std::shared_ptr<Effect::AddedAnalysisTrack>> 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