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)
{
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++;
}
}

View File

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

View File

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

View File

@ -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<WaveTrack*>(dest.get())->SetDisplay(WaveTrack::NoDisplay);
mTracks->Add(std::move(dest));
}
src = (WaveTrack *) iter.Next();
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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<WaveTrack*>(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++;
}

View File

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

View File

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

View File

@ -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<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
@ -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<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();
}
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<LabelTrack*>(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);
}
*/