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

Rewrite many iterations over tracks and channels in src/effects

This commit is contained in:
Paul Licameli 2018-09-11 13:07:32 -04:00
parent b94e8fec96
commit aee4005044
15 changed files with 113 additions and 231 deletions

View File

@ -389,19 +389,15 @@ bool EffectAutoDuck::Process()
if (!cancel) if (!cancel)
{ {
CopyInputTracks(); // Set up mOutputTracks. CopyInputTracks(); // Set up mOutputTracks.
SelectedTrackListOfKindIterator iter(Track::Wave, mOutputTracks.get());
Track *iterTrack = iter.First();
int trackNum = 0; int trackNum = 0;
while (iterTrack) for( auto iterTrack : mOutputTracks->Selected< WaveTrack >() )
{ {
WaveTrack* t = (WaveTrack*)iterTrack;
for (size_t i = 0; i < regions.size(); i++) for (size_t i = 0; i < regions.size(); i++)
{ {
const AutoDuckRegion& region = regions[i]; const AutoDuckRegion& region = regions[i];
if (ApplyDuckFade(trackNum, t, region.t0, region.t1)) if (ApplyDuckFade(trackNum, iterTrack, region.t0, region.t1))
{ {
cancel = true; cancel = true;
break; break;
@ -411,7 +407,6 @@ bool EffectAutoDuck::Process()
if (cancel) if (cancel)
break; break;
iterTrack = iter.Next();
trackNum++; trackNum++;
} }
} }

View File

@ -172,10 +172,8 @@ bool EffectClickRemoval::Process()
bool bGoodResult = true; bool bGoodResult = true;
mbDidSomething = false; mbDidSomething = false;
SelectedTrackListOfKindIterator iter(Track::Wave, mOutputTracks.get());
WaveTrack *track = (WaveTrack *) iter.First();
int count = 0; int count = 0;
while (track) { for( auto track : mOutputTracks->Selected< WaveTrack >() ) {
double trackStart = track->GetStartTime(); double trackStart = track->GetStartTime();
double trackEnd = track->GetEndTime(); double trackEnd = track->GetEndTime();
double t0 = mT0 < trackStart? trackStart: mT0; double t0 = mT0 < trackStart? trackStart: mT0;
@ -193,7 +191,6 @@ bool EffectClickRemoval::Process()
} }
} }
track = (WaveTrack *) iter.Next();
count++; count++;
} }
if (bGoodResult && !mbDidSomething) // Processing successful, but ineffective. if (bGoodResult && !mbDidSomething) // Processing successful, but ineffective.

View File

@ -43,24 +43,26 @@
bool ContrastDialog::GetDB(float &dB) bool ContrastDialog::GetDB(float &dB)
{ {
float rms = float(0.0); float rms = float(0.0);
int numberSelecteTracks = 0;
// For stereo tracks: sqrt((mean(L)+mean(R))/2) // For stereo tracks: sqrt((mean(L)+mean(R))/2)
bool isStereo = false;
double meanSq = 0.0; double meanSq = 0.0;
AudacityProject *p = GetActiveProject(); AudacityProject *p = GetActiveProject();
SelectedTrackListOfKindIterator iter(Track::Wave, p->GetTracks()); auto range =
WaveTrack *t = (WaveTrack *) iter.First(); p->GetTracks()->SelectedLeaders< const WaveTrack >();
while (t) { auto numberSelectedTracks = range.size();
numberSelecteTracks++; if (numberSelectedTracks > 1) {
if (numberSelecteTracks > 1 && !isStereo) { AudacityMessageDialog m(NULL, _("You can only measure one track at a time."), _("Error"), wxOK);
AudacityMessageDialog m(NULL, _("You can only measure one track at a time."), _("Error"), wxOK); m.ShowModal();
m.ShowModal(); return false;
return false; }
} if(numberSelectedTracks == 0) {
isStereo = t->GetLinked(); wxMessageDialog m(NULL, _("Please select an audio track."), _("Error"), wxOK);
m.ShowModal();
return false;
}
for ( auto t : TrackList::Channels( *range.begin() ) ) {
wxASSERT(mT0 <= mT1); wxASSERT(mT0 <= mT1);
// Ignore whitespace beyond ends of track. // Ignore whitespace beyond ends of track.
@ -87,19 +89,13 @@ bool ContrastDialog::GetDB(float &dB)
} }
// Don't throw in this analysis dialog // Don't throw in this analysis dialog
rms = ((WaveTrack *)t)->GetRMS(mT0, mT1, false); rms = t->GetRMS(mT0, mT1, false);
meanSq += rms * rms; meanSq += rms * rms;
t = (WaveTrack *) iter.Next();
} }
// TODO: This works for stereo, provided the audio clips are in both channels. // TODO: This works for stereo, provided the audio clips are in both channels.
// We should really count gaps between clips as silence. // 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 // Gives warning C4056, Overflow in floating-point constant arithmetic
// -INFINITY is intentional here. // -INFINITY is intentional here.
// Looks like we are stuck with this warning, as // Looks like we are stuck with this warning, as
@ -344,9 +340,8 @@ void ContrastDialog::OnClose(wxCommandEvent & WXUNUSED(event))
void ContrastDialog::OnGetForeground(wxCommandEvent & /*event*/) void ContrastDialog::OnGetForeground(wxCommandEvent & /*event*/)
{ {
AudacityProject *p = GetActiveProject(); 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()); mForegroundStartT->SetValue(p->mViewInfo.selectedRegion.t0());
mForegroundEndT->SetValue(p->mViewInfo.selectedRegion.t1()); mForegroundEndT->SetValue(p->mViewInfo.selectedRegion.t1());
} }
@ -360,9 +355,8 @@ void ContrastDialog::OnGetForeground(wxCommandEvent & /*event*/)
void ContrastDialog::OnGetBackground(wxCommandEvent & /*event*/) void ContrastDialog::OnGetBackground(wxCommandEvent & /*event*/)
{ {
AudacityProject *p = GetActiveProject(); 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()); mBackgroundStartT->SetValue(p->mViewInfo.selectedRegion.t0());
mBackgroundEndT->SetValue(p->mViewInfo.selectedRegion.t1()); mBackgroundEndT->SetValue(p->mViewInfo.selectedRegion.t1());
} }

View File

@ -2262,25 +2262,8 @@ void Effect::ReplaceProcessedTracks(const bool bGoodResult)
void Effect::CountWaveTracks() void Effect::CountWaveTracks()
{ {
mNumTracks = 0; mNumTracks = mTracks->Selected< const WaveTrack >().size();
mNumGroups = 0; mNumGroups = mTracks->SelectedLeaders< const WaveTrack >().size();
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();
}
} }
double Effect::CalcPreviewInputLength(double previewLength) double Effect::CalcPreviewInputLength(double previewLength)
@ -2574,17 +2557,13 @@ void Effect::Preview(bool dryOnly)
} }
} }
else { else {
TrackListOfKindIterator iter(Track::Wave, saveTracks); for (auto src : saveTracks->Any< const WaveTrack >()) {
WaveTrack *src = (WaveTrack *) iter.First();
while (src)
{
if (src->GetSelected() || mPreviewWithNotSelected) { if (src->GetSelected() || mPreviewWithNotSelected) {
auto dest = src->Copy(mT0, t1); auto dest = src->Copy(mT0, t1);
dest->SetSelected(src->GetSelected()); dest->SetSelected(src->GetSelected());
static_cast<WaveTrack*>(dest.get())->SetDisplay(WaveTrack::NoDisplay); static_cast<WaveTrack*>(dest.get())->SetDisplay(WaveTrack::NoDisplay);
mTracks->Add(std::move(dest)); mTracks->Add(std::move(dest));
} }
src = (WaveTrack *) iter.Next();
} }
} }

View File

@ -471,23 +471,20 @@ bool EffectEqualization::Init()
{ {
int selcount = 0; int selcount = 0;
double rate = 0.0; double rate = 0.0;
TrackListIterator iter(GetActiveProject()->GetTracks());
Track *t = iter.First(); auto trackRange =
while (t) { GetActiveProject()->GetTracks()->Selected< const WaveTrack >();
if (t->GetSelected() && t->GetKind() == Track::Wave) { if (trackRange) {
WaveTrack *track = (WaveTrack *)t; rate = (*(trackRange.first++)) -> GetRate();
if (selcount==0) { ++selcount;
rate = track->GetRate();
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 { ++selcount;
if (track->GetRate() != rate) {
Effect::MessageBox(_("To apply Equalization, all selected tracks must have the same sample rate."));
return(false);
}
}
selcount++;
} }
t = iter.Next();
} }
mHiFreq = rate / 2.0; mHiFreq = rate / 2.0;
@ -532,10 +529,8 @@ bool EffectEqualization::Process()
this->CopyInputTracks(); // Set up mOutputTracks. this->CopyInputTracks(); // Set up mOutputTracks.
bool bGoodResult = true; bool bGoodResult = true;
SelectedTrackListOfKindIterator iter(Track::Wave, mOutputTracks.get());
WaveTrack *track = (WaveTrack *) iter.First();
int count = 0; int count = 0;
while (track) { for( auto track : mOutputTracks->Selected< WaveTrack >() ) {
double trackStart = track->GetStartTime(); double trackStart = track->GetStartTime();
double trackEnd = track->GetEndTime(); double trackEnd = track->GetEndTime();
double t0 = mT0 < trackStart? trackStart: mT0; double t0 = mT0 < trackStart? trackStart: mT0;
@ -553,7 +548,6 @@ bool EffectEqualization::Process()
} }
} }
track = (WaveTrack *) iter.Next();
count++; count++;
} }

View File

@ -296,10 +296,9 @@ bool EffectEqualization48x::Process(EffectEqualization* effectEqualization)
mEffectEqualization->mM=(mEffectEqualization->mM&(~15))+1; mEffectEqualization->mM=(mEffectEqualization->mM&(~15))+1;
AllocateBuffersWorkers(sMathPath&MATH_FUNCTION_THREADED); AllocateBuffersWorkers(sMathPath&MATH_FUNCTION_THREADED);
auto cleanup = finally( [&] { FreeBuffersWorkers(); } ); auto cleanup = finally( [&] { FreeBuffersWorkers(); } );
SelectedTrackListOfKindIterator iter(Track::Wave, mEffectEqualization->mOutputTracks.get());
WaveTrack *track = (WaveTrack *) iter.First();
int count = 0; int count = 0;
while (track) { for( auto track :
mEffectEqualization->mOutputTracks->Selected< WaveTrack >() {
double trackStart = track->GetStartTime(); double trackStart = track->GetStartTime();
double trackEnd = track->GetEndTime(); double trackEnd = track->GetEndTime();
double t0 = mEffectEqualization->mT0 < trackStart? trackStart: mEffectEqualization->mT0; double t0 = mEffectEqualization->mT0 < trackStart? trackStart: mEffectEqualization->mT0;
@ -313,7 +312,6 @@ bool EffectEqualization48x::Process(EffectEqualization* effectEqualization)
if( bBreakLoop ) if( bBreakLoop )
break; break;
} }
track = (WaveTrack *) iter.Next();
count++; count++;
} }
@ -340,10 +338,7 @@ bool EffectEqualization48x::TrackCompare()
TrackList SecondOutputTracks; TrackList SecondOutputTracks;
//iterate over tracks of type trackType (All types if Track::All) for (auto aTrack : mEffectEqualization->mTracks->Any< WaveTrack >()) {
TrackListOfKindIterator aIt(mEffectEqualization->mOutputTracksType, mEffectEqualization->mTracks);
for (Track *aTrack = aIt.First(); aTrack; aTrack = aIt.Next()) {
// Include selected tracks, plus sync-lock selected tracks for Track::All. // Include selected tracks, plus sync-lock selected tracks for Track::All.
if (aTrack->GetSelected() || if (aTrack->GetSelected() ||
@ -357,15 +352,12 @@ bool EffectEqualization48x::TrackCompare()
} }
} }
for(int i=0;i<2;i++) { for(int i = 0; i < 2; i++) {
SelectedTrackListOfKindIterator iter
(Track::Wave, i
? mEffectEqualization->mOutputTracks.get()
: &SecondOutputTracks);
i?sMathPath=sMathPath:sMathPath=0; i?sMathPath=sMathPath:sMathPath=0;
WaveTrack *track = (WaveTrack *) iter.First();
int count = 0; int count = 0;
while (track) { for( auto track :
( i ? mEffectEqualization->mOutputTracks.get()
: &SecondOutputTracks ) -> Selected< WaveTrack >() {
double trackStart = track->GetStartTime(); double trackStart = track->GetStartTime();
double trackEnd = track->GetEndTime(); double trackEnd = track->GetEndTime();
double t0 = mEffectEqualization->mT0 < trackStart? trackStart: mEffectEqualization->mT0; double t0 = mEffectEqualization->mT0 < trackStart? trackStart: mEffectEqualization->mT0;
@ -379,16 +371,14 @@ bool EffectEqualization48x::TrackCompare()
if( bBreakLoop ) if( bBreakLoop )
break; break;
} }
track = (WaveTrack *) iter.Next();
count++; count++;
} }
} }
SelectedTrackListOfKindIterator
iter(Track::Wave, mEffectEqualization->mOutputTracks.get()); auto iter2 = (SecondOutputTracks.Selected< const WaveTrack >()).first;
SelectedTrackListOfKindIterator iter2(Track::Wave, &SecondOutputTracks); auto track2 = *iter2;
WaveTrack *track = (WaveTrack *) iter.First(); for ( auto track :
WaveTrack *track2 = (WaveTrack *) iter2.First(); mEffectEqualization->mOutputTracks->Selected< const WaveTrack >() {
while (track) {
double trackStart = track->GetStartTime(); double trackStart = track->GetStartTime();
double trackEnd = track->GetEndTime(); double trackEnd = track->GetEndTime();
double t0 = mEffectEqualization->mT0 < trackStart? trackStart: mEffectEqualization->mT0; double t0 = mEffectEqualization->mT0 < trackStart? trackStart: mEffectEqualization->mT0;
@ -400,8 +390,7 @@ bool EffectEqualization48x::TrackCompare()
auto len = end - start; auto len = end - start;
DeltaTrack(track, track2, start, len); DeltaTrack(track, track2, start, len);
} }
track = (WaveTrack *) iter.Next(); track2 = * ++iter2;
track2 = (WaveTrack *) iter2.Next();
} }
mEffectEqualization->ReplaceProcessedTracks(!bBreakLoop); mEffectEqualization->ReplaceProcessedTracks(!bBreakLoop);
return bBreakLoop; // return !bBreakLoop ? return bBreakLoop; // return !bBreakLoop ?
@ -447,12 +436,10 @@ bool EffectEqualization48x::Benchmark(EffectEqualization* effectEqualization)
mEffectEqualization->mM=(mEffectEqualization->mM&(~15))+1; mEffectEqualization->mM=(mEffectEqualization->mM&(~15))+1;
AllocateBuffersWorkers(MATH_FUNCTION_THREADED); AllocateBuffersWorkers(MATH_FUNCTION_THREADED);
auto cleanup = finally( [&] { FreeBuffersWorkers(); } ); auto cleanup = finally( [&] { FreeBuffersWorkers(); } );
SelectedTrackListOfKindIterator
iter(Track::Wave, mEffectEqualization->mOutputTracks.get());
long times[] = { 0,0,0,0,0 }; long times[] = { 0,0,0,0,0 };
wxStopWatch timer; wxStopWatch timer;
mBenching=true; mBenching = true;
for(int i=0;i<5 && !bBreakLoop;i++) { for(int i = 0; i < 5 && !bBreakLoop; i++) {
int localMathPath; int localMathPath;
switch(i) { switch(i) {
case 0: localMathPath=MATH_FUNCTION_SSE|MATH_FUNCTION_THREADED; case 0: localMathPath=MATH_FUNCTION_SSE|MATH_FUNCTION_THREADED;
@ -471,11 +458,11 @@ bool EffectEqualization48x::Benchmark(EffectEqualization* effectEqualization)
break; break;
default: localMathPath=-1; default: localMathPath=-1;
} }
if(localMathPath>=0) { if(localMathPath >= 0) {
timer.Start(); timer.Start();
WaveTrack *track = (WaveTrack *) iter.First();
int count = 0; int count = 0;
while (track) { for (auto track :
mEffectEqualization->mOutputTracks->Selected< WaveTrack >() {
double trackStart = track->GetStartTime(); double trackStart = track->GetStartTime();
double trackEnd = track->GetEndTime(); double trackEnd = track->GetEndTime();
double t0 = mEffectEqualization->mT0 < trackStart? trackStart: mEffectEqualization->mT0; double t0 = mEffectEqualization->mT0 < trackStart? trackStart: mEffectEqualization->mT0;
@ -489,7 +476,6 @@ bool EffectEqualization48x::Benchmark(EffectEqualization* effectEqualization)
if( bBreakLoop ) if( bBreakLoop )
break; break;
} }
track = (WaveTrack *) iter.Next();
count++; count++;
} }
times[i]=timer.Time(); times[i]=timer.Time();

View File

@ -264,7 +264,7 @@ public:
bool Process(EffectNoiseReduction &effect, bool Process(EffectNoiseReduction &effect,
Statistics &statistics, TrackFactory &factory, Statistics &statistics, TrackFactory &factory,
SelectedTrackListOfKindIterator &iter, double mT0, double mT1); TrackList &tracks, double mT0, double mT1);
private: private:
bool ProcessOne(EffectNoiseReduction &effect, bool ProcessOne(EffectNoiseReduction &effect,
@ -606,8 +606,7 @@ bool EffectNoiseReduction::Process()
this->CopyInputTracks(); // Set up mOutputTracks. this->CopyInputTracks(); // Set up mOutputTracks.
SelectedTrackListOfKindIterator iter(Track::Wave, mOutputTracks.get()); auto track = * (mOutputTracks->Selected< const WaveTrack >()).begin();
WaveTrack *track = (WaveTrack *) iter.First();
if (!track) if (!track)
return false; return false;
@ -633,7 +632,8 @@ bool EffectNoiseReduction::Process()
, mF0, mF1 , mF0, mF1
#endif #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 (mSettings->mDoProfile) {
if (bGoodResult) if (bGoodResult)
mSettings->mDoProfile = false; // So that "repeat last effect" will reduce noise mSettings->mDoProfile = false; // So that "repeat last effect" will reduce noise
@ -650,11 +650,10 @@ EffectNoiseReduction::Worker::~Worker()
bool EffectNoiseReduction::Worker::Process bool EffectNoiseReduction::Worker::Process
(EffectNoiseReduction &effect, Statistics &statistics, TrackFactory &factory, (EffectNoiseReduction &effect, Statistics &statistics, TrackFactory &factory,
SelectedTrackListOfKindIterator &iter, double inT0, double inT1) TrackList &tracks, double inT0, double inT1)
{ {
int count = 0; int count = 0;
WaveTrack *track = (WaveTrack *) iter.First(); for ( auto track : tracks.Selected< WaveTrack >() ) {
while (track) {
if (track->GetRate() != mSampleRate) { if (track->GetRate() != mSampleRate) {
if (mDoProfile) if (mDoProfile)
effect.Effect::MessageBox(_("All noise profile data must have the same sample rate.")); 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)) count, track, start, len))
return false; return false;
} }
track = (WaveTrack *) iter.Next();
++count; ++count;
} }

View File

@ -208,10 +208,8 @@ bool EffectNoiseRemoval::Process()
this->CopyInputTracks(); // Set up mOutputTracks. this->CopyInputTracks(); // Set up mOutputTracks.
bool bGoodResult = true; bool bGoodResult = true;
SelectedTrackListOfKindIterator iter(Track::Wave, mOutputTracks.get());
WaveTrack *track = (WaveTrack *) iter.First();
int count = 0; int count = 0;
while (track) { for( auto track : mOutputTracks->Selected< WaveTrack >() ) {
double trackStart = track->GetStartTime(); double trackStart = track->GetStartTime();
double trackEnd = track->GetEndTime(); double trackEnd = track->GetEndTime();
double t0 = mT0 < trackStart? trackStart: mT0; double t0 = mT0 < trackStart? trackStart: mT0;
@ -227,7 +225,6 @@ bool EffectNoiseRemoval::Process()
break; break;
} }
} }
track = (WaveTrack *) iter.Next();
count++; count++;
} }

View File

@ -164,11 +164,9 @@ double EffectPaulstretch::CalcPreviewInputLength(double previewLength)
bool EffectPaulstretch::Process() bool EffectPaulstretch::Process()
{ {
CopyInputTracks(); CopyInputTracks();
SelectedTrackListOfKindIterator iter(Track::Wave, mOutputTracks.get());
WaveTrack *track = (WaveTrack *) iter.First();
m_t1=mT1; m_t1=mT1;
int count=0; int count=0;
while (track) { for( auto track : mOutputTracks->Selected< WaveTrack >() ) {
double trackStart = track->GetStartTime(); double trackStart = track->GetStartTime();
double trackEnd = track->GetEndTime(); double trackEnd = track->GetEndTime();
double t0 = mT0 < trackStart? trackStart: mT0; double t0 = mT0 < trackStart? trackStart: mT0;
@ -179,7 +177,6 @@ bool EffectPaulstretch::Process()
return false; return false;
} }
track = (WaveTrack *) iter.Next();
count++; count++;
} }
mT1=m_t1; mT1=m_t1;

View File

@ -74,10 +74,8 @@ bool EffectRepair::Process()
this->CopyInputTracks(); // Set up mOutputTracks. //v This may be too much copying for EffectRepair. this->CopyInputTracks(); // Set up mOutputTracks. //v This may be too much copying for EffectRepair.
bool bGoodResult = true; bool bGoodResult = true;
SelectedTrackListOfKindIterator iter(Track::Wave, mOutputTracks.get());
WaveTrack *track = (WaveTrack *) iter.First();
int count = 0; int count = 0;
while (track) { for( auto track : mOutputTracks->Selected< WaveTrack >() ) {
const const
double trackStart = track->GetStartTime(); double trackStart = track->GetStartTime();
const double repair_t0 = std::max(mT0, trackStart); const double repair_t0 = std::max(mT0, trackStart);
@ -125,7 +123,6 @@ bool EffectRepair::Process()
} }
} }
track = (WaveTrack *) iter.Next();
count++; count++;
} }

View File

@ -32,10 +32,8 @@ bool EffectSimpleMono::Process()
this->CopyInputTracks(); // Set up mOutputTracks. this->CopyInputTracks(); // Set up mOutputTracks.
bool bGoodResult = true; bool bGoodResult = true;
SelectedTrackListOfKindIterator iter(Track::Wave, mOutputTracks.get());
WaveTrack* pOutWaveTrack = (WaveTrack*)(iter.First());
mCurTrackNum = 0; mCurTrackNum = 0;
while (pOutWaveTrack != NULL) for( auto pOutWaveTrack : mOutputTracks->Selected< WaveTrack >() )
{ {
//Get start and end times from track //Get start and end times from track
double trackStart = pOutWaveTrack->GetStartTime(); double trackStart = pOutWaveTrack->GetStartTime();
@ -66,8 +64,6 @@ bool EffectSimpleMono::Process()
} }
} }
//Iterate to the next track
pOutWaveTrack = (WaveTrack*)(iter.Next());
mCurTrackNum++; mCurTrackNum++;
} }

View File

@ -75,8 +75,8 @@ bool EffectStereoToMono::Process()
this->CopyInputTracks(); // Set up mOutputTracks. this->CopyInputTracks(); // Set up mOutputTracks.
bool bGoodResult = true; bool bGoodResult = true;
SelectedTrackListOfKindIterator iter(Track::Wave, mOutputTracks.get()); auto trackRange = mOutputTracks->Selected< WaveTrack >();
mLeftTrack = (WaveTrack *)iter.First(); mLeftTrack = *trackRange.first;
bool refreshIter = false; bool refreshIter = false;
if(mLeftTrack) if(mLeftTrack)
@ -87,13 +87,12 @@ bool EffectStereoToMono::Process()
} }
int count = 0; int count = 0;
while (mLeftTrack) { while ( trackRange.first != trackRange.second ) {
if (mLeftTrack->GetKind() == Track::Wave && mLeftTrack = *trackRange.first;
mLeftTrack->GetSelected() && if (mLeftTrack->GetLinked()) {
mLeftTrack->GetLinked()) {
// Assume linked track is wave // Assume linked track is wave
mRightTrack = static_cast<WaveTrack*>(iter.Next()); mRightTrack = * ++ trackRange.first;
if ((mLeftTrack->GetRate() == mRightTrack->GetRate())) { if ((mLeftTrack->GetRate() == mRightTrack->GetRate())) {
auto leftTrackStart = mLeftTrack->TimeToLongSamples(mLeftTrack->GetStartTime()); auto leftTrackStart = mLeftTrack->TimeToLongSamples(mLeftTrack->GetStartTime());
@ -116,12 +115,12 @@ bool EffectStereoToMono::Process()
} }
if (refreshIter) { if (refreshIter) {
mLeftTrack = (WaveTrack *)iter.First(); trackRange = mOutputTracks->Selected< WaveTrack >();
refreshIter = false; refreshIter = false;
} }
else { else
mLeftTrack = (WaveTrack *)iter.Next(); ++trackRange.first;
}
count++; count++;
} }

View File

@ -405,10 +405,10 @@ bool EffectTruncSilence::ProcessAll()
auto trackRange0 = inputTracks()->Selected< const WaveTrack >(); auto trackRange0 = inputTracks()->Selected< const WaveTrack >();
if (FindSilences( if (FindSilences(
silences, inputTracks(), *trackRange0.begin(), *trackRange0.rbegin())) { silences, inputTracks(), *trackRange0.begin(), *trackRange0.rbegin())) {
TrackListIterator iterOut(mOutputTracks.get()); auto trackRange = mOutputTracks->Any();
double totalCutLen = 0.0; double totalCutLen = 0.0;
Track *const first = iterOut.First(); if (DoRemoval(silences, 0, 1,
if (DoRemoval(silences, 0, 1, first, iterOut.Last(), totalCutLen)) { *trackRange.begin(), *trackRange.rbegin(), totalCutLen)) {
mT1 -= totalCutLen; mT1 -= totalCutLen;
return true; return true;
} }

View File

@ -47,10 +47,8 @@ bool EffectTwoPassSimpleMono::Process()
bool EffectTwoPassSimpleMono::ProcessPass() bool EffectTwoPassSimpleMono::ProcessPass()
{ {
//Iterate over each track //Iterate over each track
SelectedTrackListOfKindIterator iter(Track::Wave, mOutputTracks.get());
WaveTrack *track = (WaveTrack *) iter.First();
mCurTrackNum = 0; mCurTrackNum = 0;
while (track) { for( auto track : mOutputTracks->Selected< WaveTrack >() ) {
//Get start and end times from track //Get start and end times from track
double trackStart = track->GetStartTime(); double trackStart = track->GetStartTime();
double trackEnd = track->GetEndTime(); double trackEnd = track->GetEndTime();
@ -85,8 +83,6 @@ bool EffectTwoPassSimpleMono::ProcessPass()
return false; return false;
} }
//Iterate to the next track
track = (WaveTrack *) iter.Next();
mCurTrackNum++; mCurTrackNum++;
} }

View File

@ -48,6 +48,8 @@ effects from this one class.
#include "../../FileNames.h" #include "../../FileNames.h"
#include "../../Internat.h" #include "../../Internat.h"
#include "../../LabelTrack.h" #include "../../LabelTrack.h"
#include "../../NoteTrack.h"
#include "../../TimeTrack.h"
#include "../../prefs/SpectrogramSettings.h" #include "../../prefs/SpectrogramSettings.h"
#include "../../Project.h" #include "../../Project.h"
#include "../../ShuttleGui.h" #include "../../ShuttleGui.h"
@ -544,8 +546,8 @@ bool NyquistEffect::Init()
AudacityProject *project = GetActiveProject(); AudacityProject *project = GetActiveProject();
bool bAllowSpectralEditing = true; bool bAllowSpectralEditing = true;
SelectedTrackListOfKindIterator sel(Track::Wave, project->GetTracks()); for ( auto t :
for (WaveTrack *t = (WaveTrack *) sel.First(); t; t = (WaveTrack *) sel.Next()) { project->GetTracks()->Selected< const WaveTrack >() ) {
if (t->GetDisplay() != WaveTrack::Spectrum || if (t->GetDisplay() != WaveTrack::Spectrum ||
!(t->GetSpectrogramSettings().SpectralSelectionEnabled())) { !(t->GetSpectrogramSettings().SpectralSelectionEnabled())) {
bAllowSpectralEditing = false; bAllowSpectralEditing = false;
@ -622,7 +624,6 @@ bool NyquistEffect::Process()
mProgress->Hide(); mProgress->Hide();
} }
mOutputTime = 0; mOutputTime = 0;
mCount = 0; mCount = 0;
mProgressIn = 0; mProgressIn = 0;
@ -636,10 +637,8 @@ bool NyquistEffect::Process()
mTrackIndex = 0; mTrackIndex = 0;
mNumSelectedChannels = 0;
// If in tool mode, then we don't do anything with the track and selection. // 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 // 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 // correct sync-lock group behavior when the timeline is affected; then we just want
@ -647,16 +646,7 @@ bool NyquistEffect::Process()
if ( !bOnePassTool ) if ( !bOnePassTool )
CopyInputTracks(true); CopyInputTracks(true);
SelectedTrackListOfKindIterator sel(Track::Wave, mOutputTracks.get()); mNumSelectedChannels = mOutputTracks->Selected< const WaveTrack >().size();
for (WaveTrack *t = (WaveTrack *) sel.First(); t; t = (WaveTrack *) sel.Next()) {
mNumSelectedChannels++;
if (mT1 >= mT0) {
if (t->GetLinked()) {
mNumSelectedChannels++;
sel.Next();
}
}
}
mDebugOutput.Clear(); mDebugOutput.Clear();
if (!mHelpFile.IsEmpty() && !mHelpFileExists) { 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* %d 'PROJECTS)\n"), (int) gAudacityProjects.size());
mProps += wxString::Format(wxT("(putprop '*PROJECT* \"%s\" 'NAME)\n"), project->GetName()); mProps += wxString::Format(wxT("(putprop '*PROJECT* \"%s\" 'NAME)\n"), project->GetName());
TrackListIterator all(project->GetTracks());
Track *t;
int numTracks = 0; int numTracks = 0;
int numWave = 0; int numWave = 0;
int numLabel = 0; int numLabel = 0;
@ -729,29 +717,21 @@ bool NyquistEffect::Process()
int numTime = 0; int numTime = 0;
wxString waveTrackList = wxT(""); // track positions of selected audio tracks. wxString waveTrackList = wxT(""); // track positions of selected audio tracks.
for (t = all.First(); t; t = all.Next())
{ {
switch (t->GetKind()) auto countRange = project->GetTracks()->Leaders();
{ for (auto t : countRange) {
case Track::Wave: t->TypeSwitch( [&](const WaveTrack *) {
numWave++; numWave++;
if (t->GetSelected()) { if (t->GetSelected())
waveTrackList += wxString::Format(wxT("%d "), 1 + numTracks); waveTrackList += wxString::Format(wxT("%d "), 1 + numTracks);
} });
break; numTracks++;
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();
} }
numLabel = countRange.Filter<const LabelTrack>().size();
#if defined(USE_MIDI)
numMidi = countRange.Filter<const NoteTrack>().size();
#endif
numTime = countRange.Filter<const TimeTrack>().size();
} }
// We use Internat::ToString() rather than "%g" here because we // 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")); Effect::MessageBox(message, wxOK | wxCENTRE | wxICON_EXCLAMATION, _("Nyquist Error"));
} }
SelectedTrackListOfKindIterator iter(Track::Wave, mOutputTracks.get()); auto trackRange = mOutputTracks->Selected< WaveTrack >();
mCurTrack[0] = (WaveTrack *) iter.First();
// Keep track of whether the current track is first selected in its sync-lock group // 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 // (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; mFirstInGroup = true;
Track *gtLast = NULL; Track *gtLast = NULL;
while (mCurTrack[0] || bOnePassTool) { for (auto &iter = trackRange.first, &end = trackRange.second;
bOnePassTool || iter != end; ++iter) {
mCurTrack[0] = *iter;
mCurNumChannels = 1; mCurNumChannels = 1;
if ((mT1 >= mT0)||bOnePassTool) { if ( (mT1 >= mT0) || bOnePassTool ) {
if (bOnePassTool) { if (bOnePassTool) {
}
} else { else {
if (mCurTrack[0]->GetLinked()) { if (mCurTrack[0]->GetLinked()) {
mCurNumChannels = 2; mCurNumChannels = 2;
mCurTrack[1] = (WaveTrack *)iter.Next(); mCurTrack[1] = * ++ iter;
if (mCurTrack[1]->GetRate() != mCurTrack[0]->GetRate()) { if (mCurTrack[1]->GetRate() != mCurTrack[0]->GetRate()) {
Effect::MessageBox(_("Sorry, cannot apply effect on stereo tracks where the tracks don't match."), Effect::MessageBox(_("Sorry, cannot apply effect on stereo tracks where the tracks don't match."),
wxOK | wxCENTRE); wxOK | wxCENTRE);
success = false; success = false;
goto finish; goto finish;
} }
@ -840,6 +821,7 @@ bool NyquistEffect::Process()
mCurLen = std::min(mCurLen, mMaxLen); mCurLen = std::min(mCurLen, mMaxLen);
} }
mProgressIn = 0.0; mProgressIn = 0.0;
mProgressOut = 0.0; mProgressOut = 0.0;
@ -914,7 +896,6 @@ bool NyquistEffect::Process()
mProgressTot += mProgressIn + mProgressOut; mProgressTot += mProgressIn + mProgressOut;
} }
mCurTrack[0] = (WaveTrack *) iter.Next();
mCount += mCurNumChannels; mCount += mCurNumChannels;
} }
@ -1112,22 +1093,9 @@ bool NyquistEffect::ProcessOne()
//NOTE: Audacity 2.1.3 True if spectral selection is enabled regardless of track view. //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); cmd += wxString::Format(wxT("(putprop '*TRACK* %s 'SPECTRAL-EDIT-ENABLED)\n"), spectralEditp);
double startTime = 0.0; auto channels = TrackList::Channels( mCurTrack[0] );
double endTime = 0.0; double startTime = channels.min( &Track::GetStartTime );
double endTime = channels.max( &Track::GetEndTime );
if (mCurTrack[0]->GetLinked()) {
startTime = std::min<double>(mCurTrack[0]->GetStartTime(), mCurTrack[0]->GetLink()->GetStartTime());
}
else {
startTime = mCurTrack[0]->GetStartTime();
}
if (mCurTrack[0]->GetLinked()) {
endTime = std::max<double>(mCurTrack[0]->GetEndTime(), mCurTrack[0]->GetLink()->GetEndTime());
}
else {
endTime = mCurTrack[0]->GetEndTime();
}
cmd += wxString::Format(wxT("(putprop '*TRACK* (float %s) 'START-TIME)\n"), cmd += wxString::Format(wxT("(putprop '*TRACK* (float %s) 'START-TIME)\n"),
Internat::ToString(startTime)); Internat::ToString(startTime));
@ -1415,16 +1383,7 @@ bool NyquistEffect::ProcessOne()
mProjectChanged = true; mProjectChanged = true;
unsigned int numLabels = nyx_get_num_labels(); unsigned int numLabels = nyx_get_num_labels();
unsigned int l; unsigned int l;
LabelTrack *ltrack = NULL; auto ltrack = * mOutputTracks->Any< LabelTrack >().begin();
TrackListIterator iter(mOutputTracks.get());
for (Track *t = iter.First(); t; t = iter.Next()) {
if (t->GetKind() == Track::Label) {
ltrack = (LabelTrack *)t;
break;
}
}
if (!ltrack) { if (!ltrack) {
ltrack = static_cast<LabelTrack*>(AddToOutputTracks(mFactory->NewLabelTrack())); ltrack = static_cast<LabelTrack*>(AddToOutputTracks(mFactory->NewLabelTrack()));
} }
@ -1675,12 +1634,10 @@ double NyquistEffect::GetCtrlValue(const wxString &s)
* be determined. * be determined.
* *
AudacityProject *project = GetActiveProject(); AudacityProject *project = GetActiveProject();
double rate = INT_MAX;
if (project && s.IsSameAs(wxT("half-srate"), false)) { if (project && s.IsSameAs(wxT("half-srate"), false)) {
SelectedTrackListOfKindIterator sel(Track::Wave, project->GetTracks()); auto rate =
for (WaveTrack *t = (WaveTrack *) sel.First(); t; t = (WaveTrack *) sel.Next()) { project->GetTracks()->Selected< const WaveTrack >()
rate = std::min(t->GetRate(), rate); .min( &WaveTrack::GetRate );
}
return (rate / 2.0); return (rate / 2.0);
} }
*/ */