From 5ef4dd46a5114e0adea9bb3c291aa1dd519bfa02 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Wed, 2 Mar 2016 14:59:31 -0500 Subject: [PATCH] TrackFactory functions return std::unique_ptr, although some callers... ... release() them for now. --- src/Benchmark.cpp | 4 +-- src/LabelDialog.cpp | 10 +++----- src/LabelTrack.cpp | 4 +-- src/Menus.cpp | 35 ++++++++++++--------------- src/Mix.cpp | 4 +-- src/NoteTrack.cpp | 4 +-- src/Project.cpp | 10 ++++---- src/TimeTrack.cpp | 4 +-- src/Track.h | 10 ++++---- src/WaveTrack.cpp | 15 ++++++------ src/effects/ChangeSpeed.cpp | 7 ++---- src/effects/Effect.cpp | 21 +++------------- src/effects/Equalization.cpp | 3 +-- src/effects/Generator.cpp | 2 +- src/effects/NoiseReduction.cpp | 2 +- src/effects/Paulstretch.cpp | 5 ++-- src/effects/SBSMSEffect.cpp | 10 +++----- src/effects/SoundTouchEffect.cpp | 24 ++++++------------ src/effects/StereoToMono.cpp | 4 +-- src/effects/StereoToMono.h | 2 +- src/effects/nyquist/Nyquist.cpp | 15 +++++------- src/effects/nyquist/Nyquist.h | 2 +- src/import/ImportFFmpeg.cpp | 2 +- src/import/ImportFLAC.cpp | 2 +- src/import/ImportMP3.cpp | 2 +- src/import/ImportOGG.cpp | 2 +- src/import/ImportPCM.cpp | 2 +- src/import/ImportRaw.cpp | 2 +- src/toolbars/ControlToolBar.cpp | 7 +++--- src/toolbars/TranscriptionToolBar.cpp | 7 +----- src/toolbars/TranscriptionToolBar.h | 3 ++- 31 files changed, 91 insertions(+), 135 deletions(-) diff --git a/src/Benchmark.cpp b/src/Benchmark.cpp index bd173ddb3..962c6a210 100644 --- a/src/Benchmark.cpp +++ b/src/Benchmark.cpp @@ -344,7 +344,7 @@ void BenchmarkDialog::OnRun( wxCommandEvent & WXUNUSED(event)) ZoomInfo zoomInfo(0.0, ZoomInfo::GetDefaultZoom()); DirManager *d = new DirManager(); - WaveTrack *const t = TrackFactory{ d, &zoomInfo }.NewWaveTrack(int16Sample); + const auto t = TrackFactory{ d, &zoomInfo }.NewWaveTrack(int16Sample); Track *tmp = NULL; t->SetRate(1); @@ -533,8 +533,6 @@ void BenchmarkDialog::OnRun( wxCommandEvent & WXUNUSED(event)) if (tmp) delete tmp; - delete t; - delete[]small1; delete[]small2; delete[]block; diff --git a/src/LabelDialog.cpp b/src/LabelDialog.cpp index 47a98d0e6..9b5be8729 100644 --- a/src/LabelDialog.cpp +++ b/src/LabelDialog.cpp @@ -319,7 +319,7 @@ bool LabelDialog::TransferDataFromWindow() wxString name = mTrackNames[tndx + 1].AfterFirst(wxT('-')).Mid(1); // Create the NEW track and add to track list - LabelTrack *newTrack = mFactory.NewLabelTrack(); + LabelTrack *newTrack = mFactory.NewLabelTrack().release(); newTrack->SetName(name); mTracks->Add(newTrack); tndx++; @@ -564,14 +564,13 @@ void LabelDialog::OnImport(wxCommandEvent & WXUNUSED(event)) else { // Create a temporary label track and load the labels // into it - LabelTrack *lt = mFactory.NewLabelTrack(); + auto lt = mFactory.NewLabelTrack(); lt->Import(f); // Add the labesls to our collection - AddLabels(lt); + AddLabels(lt.get()); // Done with the temporary track - delete lt; } // Repopulate the grid @@ -632,7 +631,7 @@ void LabelDialog::OnExport(wxCommandEvent & WXUNUSED(event)) } // Transfer our collection to a temporary label track - LabelTrack *lt = mFactory.NewLabelTrack(); + auto lt = mFactory.NewLabelTrack(); int i; for (i = 0; i < cnt; i++) { @@ -643,7 +642,6 @@ void LabelDialog::OnExport(wxCommandEvent & WXUNUSED(event)) // Export them and clean lt->Export(f); - delete lt; #ifdef __WXMAC__ f.Write(wxTextFileType_Mac); diff --git a/src/LabelTrack.cpp b/src/LabelTrack.cpp index e24f256e7..cd12ec7c7 100644 --- a/src/LabelTrack.cpp +++ b/src/LabelTrack.cpp @@ -88,9 +88,9 @@ int LabelTrack::mTextHeight; int LabelTrack::mFontHeight=-1; -LabelTrack *TrackFactory::NewLabelTrack() +LabelTrack::Holder TrackFactory::NewLabelTrack() { - return new LabelTrack(mDirManager); + return std::make_unique(mDirManager); } LabelTrack::LabelTrack(DirManager * projDirManager): diff --git a/src/Menus.cpp b/src/Menus.cpp index 08799e6d3..ce9de823e 100644 --- a/src/Menus.cpp +++ b/src/Menus.cpp @@ -3358,7 +3358,7 @@ bool AudacityProject::OnEffect(const PluginID & ID, int flags) // No tracks were selected... if (type == EffectTypeGenerate) { // Create a NEW track for the generated audio... - newTrack = mTrackFactory->NewWaveTrack(); + newTrack = mTrackFactory->NewWaveTrack().release(); mTracks->Add(newTrack); newTrack->SetSelected(true); } @@ -4152,17 +4152,14 @@ void AudacityProject::OnPaste() ((WaveTrack *)n)->ClearAndPaste(t0, t1, (WaveTrack *)c, true, true); } else { - WaveTrack *tmp; - tmp = mTrackFactory->NewWaveTrack( ((WaveTrack*)n)->GetSampleFormat(), ((WaveTrack*)n)->GetRate()); + auto tmp = mTrackFactory->NewWaveTrack( ((WaveTrack*)n)->GetSampleFormat(), ((WaveTrack*)n)->GetRate()); bool bResult = tmp->InsertSilence(0.0, msClipT1 - msClipT0); // MJS: Is this correct? wxASSERT(bResult); // TO DO: Actually handle this. wxUnusedVar(bResult); tmp->Flush(); bPastedSomething |= - ((WaveTrack *)n)->ClearAndPaste(t0, t1, tmp, true, true); - - delete tmp; + ((WaveTrack *)n)->ClearAndPaste(t0, t1, tmp.get(), true, true); } } else if (n->GetKind() == Track::Label && n->GetSelected()) @@ -4267,19 +4264,19 @@ bool AudacityProject::HandlePasteNothingSelected() case Track::Wave: { WaveTrack *w = (WaveTrack *)pClip; - pNewTrack = mTrackFactory->NewWaveTrack(w->GetSampleFormat(), w->GetRate()); + pNewTrack = mTrackFactory->NewWaveTrack(w->GetSampleFormat(), w->GetRate()).release(); } break; #ifdef USE_MIDI case Track::Note: - pNewTrack = mTrackFactory->NewNoteTrack(); + pNewTrack = mTrackFactory->NewNoteTrack().release(); break; #endif // USE_MIDI case Track::Label: - pNewTrack = mTrackFactory->NewLabelTrack(); + pNewTrack = mTrackFactory->NewLabelTrack().release(); break; case Track::Time: - pNewTrack = mTrackFactory->NewTimeTrack(); + pNewTrack = mTrackFactory->NewTimeTrack().release(); break; default: pClip = iterClip.Next(); @@ -4358,7 +4355,7 @@ void AudacityProject::OnPasteNewLabel() // If no match found, add one if (!t) { - t = GetTrackFactory()->NewLabelTrack(); + t = GetTrackFactory()->NewLabelTrack().release(); mTracks->Add(t); } @@ -5495,7 +5492,7 @@ void AudacityProject::OnImportLabels() return; } - LabelTrack *newTrack = GetTrackFactory()->NewLabelTrack(); + LabelTrack *newTrack = GetTrackFactory()->NewLabelTrack().release(); wxString sTrackName; wxFileName::SplitPath(fileName, NULL, NULL, &sTrackName, NULL); newTrack->SetName(sTrackName); @@ -5538,7 +5535,7 @@ void AudacityProject::OnImportMIDI() void AudacityProject::DoImportMIDI(const wxString &fileName) { - NoteTrack *newTrack = GetTrackFactory()->NewNoteTrack(); + NoteTrack *newTrack = GetTrackFactory()->NewNoteTrack().release(); if (::ImportMIDI(fileName, newTrack)) { @@ -6253,7 +6250,7 @@ void AudacityProject::OnScoreAlign() void AudacityProject::OnNewWaveTrack() { - WaveTrack *t = mTrackFactory->NewWaveTrack(mDefaultFormat, mRate); + WaveTrack *t = mTrackFactory->NewWaveTrack(mDefaultFormat, mRate).release(); SelectNone(); mTracks->Add(t); @@ -6267,7 +6264,7 @@ void AudacityProject::OnNewWaveTrack() void AudacityProject::OnNewStereoTrack() { - WaveTrack *t = mTrackFactory->NewWaveTrack(mDefaultFormat, mRate); + WaveTrack *t = mTrackFactory->NewWaveTrack(mDefaultFormat, mRate).release(); t->SetChannel(Track::LeftChannel); SelectNone(); @@ -6275,7 +6272,7 @@ void AudacityProject::OnNewStereoTrack() t->SetSelected(true); t->SetLinked (true); - t = mTrackFactory->NewWaveTrack(mDefaultFormat, mRate); + t = mTrackFactory->NewWaveTrack(mDefaultFormat, mRate).release(); t->SetChannel(Track::RightChannel); mTracks->Add(t); @@ -6289,7 +6286,7 @@ void AudacityProject::OnNewStereoTrack() void AudacityProject::OnNewLabelTrack() { - LabelTrack *t = GetTrackFactory()->NewLabelTrack(); + LabelTrack *t = GetTrackFactory()->NewLabelTrack().release(); SelectNone(); @@ -6309,7 +6306,7 @@ void AudacityProject::OnNewTimeTrack() return; } - TimeTrack *t = mTrackFactory->NewTimeTrack(); + TimeTrack *t = mTrackFactory->NewTimeTrack().release(); SelectNone(); @@ -6385,7 +6382,7 @@ int AudacityProject::DoAddLabel(const SelectedRegion ®ion, bool preserveFocus // If none found, start a NEW label track and use it if (!lt) { - lt = GetTrackFactory()->NewLabelTrack(); + lt = GetTrackFactory()->NewLabelTrack().release(); mTracks->Add(lt); } diff --git a/src/Mix.cpp b/src/Mix.cpp index 24b0295f5..b4d1d578e 100644 --- a/src/Mix.cpp +++ b/src/Mix.cpp @@ -121,7 +121,7 @@ bool MixAndRender(TrackList *tracks, TrackFactory *trackFactory, oneinput = true; // only one input track (either 1 mono or one linked stereo pair) - WaveTrack *mixLeft = trackFactory->NewWaveTrack(format, rate); + WaveTrack *mixLeft = trackFactory->NewWaveTrack(format, rate).release(); if (oneinput) mixLeft->SetName(usefulIter.First()->GetName()); /* set name of output track to be the same as the sole input track */ else @@ -132,7 +132,7 @@ bool MixAndRender(TrackList *tracks, TrackFactory *trackFactory, mixLeft->SetChannel(Track::MonoChannel); } else { - mixRight = trackFactory->NewWaveTrack(format, rate); + mixRight = trackFactory->NewWaveTrack(format, rate).release(); if (oneinput) { if (usefulIter.First()->GetLink() != NULL) // we have linked track mixLeft->SetName(usefulIter.First()->GetLink()->GetName()); /* set name to match input track's right channel!*/ diff --git a/src/NoteTrack.cpp b/src/NoteTrack.cpp index 29408d1b8..d69401b3e 100644 --- a/src/NoteTrack.cpp +++ b/src/NoteTrack.cpp @@ -98,9 +98,9 @@ SONFNS(AutoSave) -NoteTrack *TrackFactory::NewNoteTrack() +NoteTrack::Holder TrackFactory::NewNoteTrack() { - return new NoteTrack(mDirManager); + return std::make_unique(mDirManager); } NoteTrack::NoteTrack(DirManager * projDirManager): diff --git a/src/Project.cpp b/src/Project.cpp index 9c82a0693..083932b3f 100644 --- a/src/Project.cpp +++ b/src/Project.cpp @@ -3147,27 +3147,27 @@ XMLTagHandler *AudacityProject::HandleXMLChild(const wxChar *tag) } if (!wxStrcmp(tag, wxT("wavetrack"))) { - WaveTrack *newTrack = mTrackFactory->NewWaveTrack(); + WaveTrack *newTrack = mTrackFactory->NewWaveTrack().release(); mTracks->Add(newTrack); return newTrack; } #ifdef USE_MIDI if (!wxStrcmp(tag, wxT("notetrack"))) { - NoteTrack *newTrack = mTrackFactory->NewNoteTrack(); + NoteTrack *newTrack = mTrackFactory->NewNoteTrack().release(); mTracks->Add(newTrack); return newTrack; } #endif // USE_MIDI if (!wxStrcmp(tag, wxT("labeltrack"))) { - LabelTrack *newTrack = mTrackFactory->NewLabelTrack(); + LabelTrack *newTrack = mTrackFactory->NewLabelTrack().release(); mTracks->Add(newTrack); return newTrack; } if (!wxStrcmp(tag, wxT("timetrack"))) { - TimeTrack *newTrack = mTrackFactory->NewTimeTrack(); + TimeTrack *newTrack = mTrackFactory->NewTimeTrack().release(); mTracks->Add(newTrack); return newTrack; } @@ -3593,7 +3593,7 @@ bool AudacityProject::Save(bool overwrite /* = true */ , { numWaveTracks++; pWaveTrack = (WaveTrack*)pTrack; - pSavedTrack = mTrackFactory->DuplicateWaveTrack(*pWaveTrack); + pSavedTrack = mTrackFactory->DuplicateWaveTrack(*pWaveTrack).release(); pSavedTrackList.Add(pSavedTrack); } diff --git a/src/TimeTrack.cpp b/src/TimeTrack.cpp index 8749afdbf..67ff5483f 100644 --- a/src/TimeTrack.cpp +++ b/src/TimeTrack.cpp @@ -29,9 +29,9 @@ #define TIMETRACK_MIN 0.01 #define TIMETRACK_MAX 10.0 -TimeTrack *TrackFactory::NewTimeTrack() +std::unique_ptr TrackFactory::NewTimeTrack() { - return new TimeTrack(mDirManager, mZoomInfo); + return std::make_unique(mDirManager, mZoomInfo); } TimeTrack::TimeTrack(DirManager *projDirManager, const ZoomInfo *zoomInfo): diff --git a/src/Track.h b/src/Track.h index 4a0bfa0b7..1bc6f634d 100644 --- a/src/Track.h +++ b/src/Track.h @@ -520,13 +520,13 @@ class AUDACITY_DLL_API TrackFactory public: // These methods are defined in WaveTrack.cpp, NoteTrack.cpp, // LabelTrack.cpp, and TimeTrack.cpp respectively - WaveTrack* DuplicateWaveTrack(WaveTrack &orig); - WaveTrack *NewWaveTrack(sampleFormat format = (sampleFormat)0, + std::unique_ptr DuplicateWaveTrack(WaveTrack &orig); + std::unique_ptr NewWaveTrack(sampleFormat format = (sampleFormat)0, double rate = 0); - LabelTrack *NewLabelTrack(); - TimeTrack *NewTimeTrack(); + std::unique_ptr NewLabelTrack(); + std::unique_ptr NewTimeTrack(); #if defined(USE_MIDI) - NoteTrack *NewNoteTrack(); + std::unique_ptr NewNoteTrack(); #endif }; diff --git a/src/WaveTrack.cpp b/src/WaveTrack.cpp index f95992e29..d0be49c95 100644 --- a/src/WaveTrack.cpp +++ b/src/WaveTrack.cpp @@ -63,15 +63,17 @@ using std::max; bool WaveTrack::mMonoAsVirtualStereo; #endif -WaveTrack* TrackFactory::DuplicateWaveTrack(WaveTrack &orig) +WaveTrack::Holder TrackFactory::DuplicateWaveTrack(WaveTrack &orig) { - return (WaveTrack*)(orig.Duplicate().release()); + return std::unique_ptr + { static_cast(orig.Duplicate().release()) }; } -WaveTrack *TrackFactory::NewWaveTrack(sampleFormat format, double rate) +WaveTrack::Holder TrackFactory::NewWaveTrack(sampleFormat format, double rate) { - return new WaveTrack(mDirManager, format, rate); + return std::unique_ptr + { safenew WaveTrack(mDirManager, format, rate) }; } WaveTrack::WaveTrack(DirManager *projDirManager, sampleFormat format, double rate) : @@ -1166,16 +1168,15 @@ bool WaveTrack::SyncLockAdjust(double oldT1, double newT1) if (!p) return false; TrackFactory *f = p->GetTrackFactory(); if (!f) return false; - WaveTrack *tmp = f->NewWaveTrack(GetSampleFormat(), GetRate()); + auto tmp = f->NewWaveTrack(GetSampleFormat(), GetRate()); bool bResult = tmp->InsertSilence(0.0, newT1 - oldT1); wxASSERT(bResult); // TO DO: Actually handle this. wxUnusedVar(bResult); tmp->Flush(); - bResult = Paste(oldT1, tmp); + bResult = Paste(oldT1, tmp.get()); wxASSERT(bResult); // TO DO: Actually handle this. wxUnusedVar(bResult); - delete tmp; } } else if (newT1 < oldT1) { diff --git a/src/effects/ChangeSpeed.cpp b/src/effects/ChangeSpeed.cpp index 2fdcb68b4..87db245c8 100644 --- a/src/effects/ChangeSpeed.cpp +++ b/src/effects/ChangeSpeed.cpp @@ -475,7 +475,7 @@ bool EffectChangeSpeed::ProcessOne(WaveTrack * track, // initialization, per examples of Mixer::Mixer and // EffectSoundTouch::ProcessOne - WaveTrack * outputTrack = mFactory->NewWaveTrack(track->GetSampleFormat(), + auto outputTrack = mFactory->NewWaveTrack(track->GetSampleFormat(), track->GetRate()); //Get the length of the selection (as double). len is @@ -552,15 +552,12 @@ bool EffectChangeSpeed::ProcessOne(WaveTrack * track, if (bResult) { SetTimeWarper(new LinearTimeWarper(mCurT0, mCurT0, mCurT1, mCurT0 + newLength)); - bResult = track->ClearAndPaste(mCurT0, mCurT1, outputTrack, true, false, GetTimeWarper()); + bResult = track->ClearAndPaste(mCurT0, mCurT1, outputTrack.get(), true, false, GetTimeWarper()); } if (newLength > mMaxNewLength) mMaxNewLength = newLength; - // Delete the outputTrack now that its data is inserted in place - delete outputTrack; - return bResult; } diff --git a/src/effects/Effect.cpp b/src/effects/Effect.cpp index 770444abb..39f124e93 100644 --- a/src/effects/Effect.cpp +++ b/src/effects/Effect.cpp @@ -1592,8 +1592,7 @@ bool Effect::ProcessTrack(int count, int chans = wxMin(mNumAudioOut, mNumChannels); - WaveTrack *genLeft = NULL; - WaveTrack *genRight = NULL; + std::unique_ptr genLeft, genRight; sampleCount genLength = 0; bool isGenerator = GetType() == EffectTypeGenerate; bool isProcessor = GetType() == EffectTypeProcess; @@ -1719,16 +1718,6 @@ bool Effect::ProcessTrack(int count, } catch(...) { - if (genLeft) - { - delete genLeft; - } - - if (genRight) - { - delete genRight; - } - return false; } wxASSERT(processed == curBlockSize); @@ -1886,14 +1875,12 @@ bool Effect::ProcessTrack(int count, // Transfer the data from the temporary tracks to the actual ones genLeft->Flush(); // mT1 gives us the NEW selection. We want to replace up to GetSel1(). - left->ClearAndPaste(mT0, p->GetSel1(), genLeft, true, true, &warper); - delete genLeft; + left->ClearAndPaste(mT0, p->GetSel1(), genLeft.get(), true, true, &warper); if (genRight) { genRight->Flush(); - right->ClearAndPaste(mT0, mT1, genRight, true, true, &warper); - delete genRight; + right->ClearAndPaste(mT0, mT1, genRight.get(), true, true, &warper); } } @@ -2135,7 +2122,7 @@ void Effect::AddToOutputTracks(Track *t) Effect::AddedAnalysisTrack::AddedAnalysisTrack(Effect *pEffect, const wxString &name) : mpEffect(pEffect) { - std::unique_ptr < LabelTrack > pTrack{ pEffect->mFactory->NewLabelTrack() }; + LabelTrack::Holder pTrack{ pEffect->mFactory->NewLabelTrack() }; mpTrack = pTrack.get(); if (!name.empty()) pTrack->SetName(name); diff --git a/src/effects/Equalization.cpp b/src/effects/Equalization.cpp index 427a786a3..8771eb188 100644 --- a/src/effects/Equalization.cpp +++ b/src/effects/Equalization.cpp @@ -1076,7 +1076,7 @@ bool EffectEqualization::ProcessOne(int count, WaveTrack * t, { // create a NEW WaveTrack to hold all of the output, including 'tails' each end AudacityProject *p = GetActiveProject(); - WaveTrack *output = p->GetTrackFactory()->NewWaveTrack(floatSample, t->GetRate()); + auto output = p->GetTrackFactory()->NewWaveTrack(floatSample, t->GetRate()); int L = windowSize - (mM - 1); //Process L samples at a go sampleCount s = start; @@ -1233,7 +1233,6 @@ bool EffectEqualization::ProcessOne(int count, WaveTrack * t, delete[] buffer; delete[] window1; delete[] window2; - delete output; return bLoopSuccess; } diff --git a/src/effects/Generator.cpp b/src/effects/Generator.cpp index b3ee5fa1a..29b271d65 100644 --- a/src/effects/Generator.cpp +++ b/src/effects/Generator.cpp @@ -65,7 +65,7 @@ bool Generator::Process() { AudacityProject *p = GetActiveProject(); // Create a temporary track - std::unique_ptr tmp( + WaveTrack::Holder tmp( mFactory->NewWaveTrack(track->GetSampleFormat(), track->GetRate()) ); diff --git a/src/effects/NoiseReduction.cpp b/src/effects/NoiseReduction.cpp index 6fc1b643a..ce816ba9b 100644 --- a/src/effects/NoiseReduction.cpp +++ b/src/effects/NoiseReduction.cpp @@ -1291,7 +1291,7 @@ bool EffectNoiseReduction::Worker::ProcessOne StartNewTrack(); - std::unique_ptr outputTrack( + WaveTrack::Holder outputTrack( mDoProfile ? NULL : factory.NewWaveTrack(track->GetSampleFormat(), track->GetRate())); diff --git a/src/effects/Paulstretch.cpp b/src/effects/Paulstretch.cpp index 5c2fac157..384da80ef 100644 --- a/src/effects/Paulstretch.cpp +++ b/src/effects/Paulstretch.cpp @@ -288,7 +288,7 @@ bool EffectPaulstretch::ProcessOne(WaveTrack *track,double t0,double t1,int coun double adjust_amount=(double)len/((double)len-((double)stretch_buf_size*2.0)); amount=1.0+(amount-1.0)*adjust_amount; - WaveTrack * outputTrack = mFactory->NewWaveTrack(track->GetSampleFormat(),track->GetRate()); + auto outputTrack = mFactory->NewWaveTrack(track->GetSampleFormat(),track->GetRate()); PaulStretch stretch(amount,stretch_buf_size,track->GetRate()); @@ -347,14 +347,13 @@ bool EffectPaulstretch::ProcessOne(WaveTrack *track,double t0,double t1,int coun outputTrack->Flush(); track->Clear(t0,t1); - bool success = track->Paste(t0,outputTrack); + bool success = track->Paste(t0, outputTrack.get()); if (!cancelled && success){ m_t1 = mT0 + outputTrack->GetEndTime(); } delete []buffer0; - delete outputTrack; return !cancelled; }; diff --git a/src/effects/SBSMSEffect.cpp b/src/effects/SBSMSEffect.cpp index fe9c813a9..49fb0dc6f 100644 --- a/src/effects/SBSMSEffect.cpp +++ b/src/effects/SBSMSEffect.cpp @@ -52,8 +52,6 @@ public: if(leftBuffer) free(leftBuffer); if(rightBuffer) free(rightBuffer); if(SBSMSBuf) free(SBSMSBuf); - if(outputLeftTrack) delete outputLeftTrack; - if(outputRightTrack) delete outputRightTrack; if(quality) delete quality; if(sbsms) delete sbsms; if(iface) delete iface; @@ -79,8 +77,8 @@ public: // Not required by callbacks, but makes for easier cleanup Resampler *resampler; SBSMSQuality *quality; - WaveTrack *outputLeftTrack; - WaveTrack *outputRightTrack; + std::unique_ptr outputLeftTrack; + std::unique_ptr outputRightTrack; }; class SBSMSEffectInterface final : public SBSMSInterfaceSliding { @@ -413,7 +411,7 @@ bool EffectSBSMS::Process() rb.outputRightTrack->Flush(); bool bResult = - leftTrack->ClearAndPaste(mCurT0, mCurT1, rb.outputLeftTrack, + leftTrack->ClearAndPaste(mCurT0, mCurT1, rb.outputLeftTrack.get(), true, false, GetTimeWarper()); wxASSERT(bResult); // TO DO: Actually handle this. wxUnusedVar(bResult); @@ -421,7 +419,7 @@ bool EffectSBSMS::Process() if(rightTrack) { bResult = - rightTrack->ClearAndPaste(mCurT0, mCurT1, rb.outputRightTrack, + rightTrack->ClearAndPaste(mCurT0, mCurT1, rb.outputRightTrack.get(), true, false, GetTimeWarper()); wxASSERT(bResult); // TO DO: Actually handle this. } diff --git a/src/effects/SoundTouchEffect.cpp b/src/effects/SoundTouchEffect.cpp index a1acaca87..d064fddb1 100644 --- a/src/effects/SoundTouchEffect.cpp +++ b/src/effects/SoundTouchEffect.cpp @@ -176,12 +176,11 @@ bool EffectSoundTouch::Process() bool EffectSoundTouch::ProcessOne(WaveTrack *track, sampleCount start, sampleCount end) { - WaveTrack *outputTrack; sampleCount s; mSoundTouch->setSampleRate((unsigned int)(track->GetRate()+0.5)); - outputTrack = mFactory->NewWaveTrack(track->GetSampleFormat(), track->GetRate()); + auto outputTrack = mFactory->NewWaveTrack(track->GetSampleFormat(), track->GetRate()); //Get the length of the buffer (as double). len is //used simple to calculate a progress meter, so it is easier @@ -245,14 +244,11 @@ bool EffectSoundTouch::ProcessOne(WaveTrack *track, // Take the output track and insert it in place of the original // sample data - track->ClearAndPaste(mCurT0, mCurT1, outputTrack, true, false, GetTimeWarper()); + track->ClearAndPaste(mCurT0, mCurT1, outputTrack.get(), true, false, GetTimeWarper()); double newLength = outputTrack->GetEndTime(); m_maxNewLength = wxMax(m_maxNewLength, newLength); - // Delete the outputTrack now that its data is inserted in place - delete outputTrack; - //Return true because the effect processing succeeded. return true; } @@ -262,9 +258,9 @@ bool EffectSoundTouch::ProcessStereo(WaveTrack* leftTrack, WaveTrack* rightTrack { mSoundTouch->setSampleRate((unsigned int)(leftTrack->GetRate()+0.5)); - WaveTrack* outputLeftTrack = mFactory->NewWaveTrack(leftTrack->GetSampleFormat(), + auto outputLeftTrack = mFactory->NewWaveTrack(leftTrack->GetSampleFormat(), leftTrack->GetRate()); - WaveTrack* outputRightTrack = mFactory->NewWaveTrack(rightTrack->GetSampleFormat(), + auto outputRightTrack = mFactory->NewWaveTrack(rightTrack->GetSampleFormat(), rightTrack->GetRate()); //Get the length of the buffer (as double). len is @@ -310,7 +306,7 @@ bool EffectSoundTouch::ProcessStereo(WaveTrack* leftTrack, WaveTrack* rightTrack //Get back samples from SoundTouch unsigned int outputCount = mSoundTouch->numSamples(); if (outputCount > 0) - this->ProcessStereoResults(outputCount, outputLeftTrack, outputRightTrack); + this->ProcessStereoResults(outputCount, outputLeftTrack.get(), outputRightTrack.get()); //Increment sourceSampleCount one blockfull of samples sourceSampleCount += blockSize; @@ -336,7 +332,7 @@ bool EffectSoundTouch::ProcessStereo(WaveTrack* leftTrack, WaveTrack* rightTrack unsigned int outputCount = mSoundTouch->numSamples(); if (outputCount > 0) - this->ProcessStereoResults(outputCount, outputLeftTrack, outputRightTrack); + this->ProcessStereoResults(outputCount, outputLeftTrack.get(), outputRightTrack.get()); // Flush the output WaveTracks (since they're buffered, too) outputLeftTrack->Flush(); @@ -349,8 +345,8 @@ bool EffectSoundTouch::ProcessStereo(WaveTrack* leftTrack, WaveTrack* rightTrack // Take the output tracks and insert in place of the original // sample data. - leftTrack->ClearAndPaste(mCurT0, mCurT1, outputLeftTrack, true, false, GetTimeWarper()); - rightTrack->ClearAndPaste(mCurT0, mCurT1, outputRightTrack, true, false, GetTimeWarper()); + leftTrack->ClearAndPaste(mCurT0, mCurT1, outputLeftTrack.get(), true, false, GetTimeWarper()); + rightTrack->ClearAndPaste(mCurT0, mCurT1, outputRightTrack.get(), true, false, GetTimeWarper()); // Track the longest result length double newLength = outputLeftTrack->GetEndTime(); @@ -358,10 +354,6 @@ bool EffectSoundTouch::ProcessStereo(WaveTrack* leftTrack, WaveTrack* rightTrack newLength = outputRightTrack->GetEndTime(); m_maxNewLength = wxMax(m_maxNewLength, newLength); - // Delete the outputTracks now that their data are inserted in place. - delete outputLeftTrack; - delete outputRightTrack; - //Return true because the effect processing succeeded. return true; } diff --git a/src/effects/StereoToMono.cpp b/src/effects/StereoToMono.cpp index 8d419e15e..a99aba2bd 100644 --- a/src/effects/StereoToMono.cpp +++ b/src/effects/StereoToMono.cpp @@ -124,8 +124,6 @@ bool EffectStereoToMono::Process() count++; } - if(mOutTrack) - delete mOutTrack; this->ReplaceProcessedTracks(bGoodResult); return bGoodResult; } @@ -164,7 +162,7 @@ bool EffectStereoToMono::ProcessOne(int count) double minStart = wxMin(mLeftTrack->GetStartTime(), mRightTrack->GetStartTime()); bResult &= mLeftTrack->Clear(mLeftTrack->GetStartTime(), mLeftTrack->GetEndTime()); bResult &= mOutTrack->Flush(); - bResult &= mLeftTrack->Paste(minStart, mOutTrack); + bResult &= mLeftTrack->Paste(minStart, mOutTrack.get()); mLeftTrack->SetLinked(false); mRightTrack->SetLinked(false); mLeftTrack->SetChannel(Track::MonoChannel); diff --git a/src/effects/StereoToMono.h b/src/effects/StereoToMono.h index e7b9b5007..6c0a34ea2 100644 --- a/src/effects/StereoToMono.h +++ b/src/effects/StereoToMono.h @@ -53,7 +53,7 @@ private: sampleCount mEnd; WaveTrack *mLeftTrack; WaveTrack *mRightTrack; - WaveTrack *mOutTrack; + std::unique_ptr mOutTrack; }; #endif diff --git a/src/effects/nyquist/Nyquist.cpp b/src/effects/nyquist/Nyquist.cpp index 2695b0533..234a0ff74 100644 --- a/src/effects/nyquist/Nyquist.cpp +++ b/src/effects/nyquist/Nyquist.cpp @@ -1120,7 +1120,7 @@ bool NyquistEffect::ProcessOne() } if (!ltrack) { - ltrack = mFactory->NewLabelTrack(); + ltrack = mFactory->NewLabelTrack().release(); AddToOutputTracks((Track *)ltrack); } @@ -1184,8 +1184,7 @@ bool NyquistEffect::ProcessOne() if (!success) { for(i = 0; i < outChannels; i++) { - delete mOutputTrack[i]; - mOutputTrack[i] = NULL; + mOutputTrack[i].reset(); } return false; } @@ -1202,8 +1201,7 @@ bool NyquistEffect::ProcessOne() wxT("Nyquist"), wxOK | wxCENTRE, mUIParent); for (i = 0; i < outChannels; i++) { - delete mOutputTrack[i]; - mOutputTrack[i] = NULL; + mOutputTrack[i].reset(); } return true; } @@ -1213,10 +1211,10 @@ bool NyquistEffect::ProcessOne() WaveTrack *out; if (outChannels == mCurNumChannels) { - out = mOutputTrack[i]; + out = mOutputTrack[i].get(); } else { - out = mOutputTrack[0]; + out = mOutputTrack[0].get(); } if (mMergeClips < 0) { @@ -1246,8 +1244,7 @@ bool NyquistEffect::ProcessOne() } for (i = 0; i < outChannels; i++) { - delete mOutputTrack[i]; - mOutputTrack[i] = NULL; + mOutputTrack[i].reset(); } mProjectChanged = true; return true; diff --git a/src/effects/nyquist/Nyquist.h b/src/effects/nyquist/Nyquist.h index 963217e7a..7c8f45e74 100644 --- a/src/effects/nyquist/Nyquist.h +++ b/src/effects/nyquist/Nyquist.h @@ -224,7 +224,7 @@ private: sampleCount mCurBufferStart[2]; sampleCount mCurBufferLen[2]; - WaveTrack *mOutputTrack[2]; + std::unique_ptr mOutputTrack[2]; wxArrayString mCategories; diff --git a/src/import/ImportFFmpeg.cpp b/src/import/ImportFFmpeg.cpp index 50ad9b4c8..5e3f174ac 100644 --- a/src/import/ImportFFmpeg.cpp +++ b/src/import/ImportFFmpeg.cpp @@ -509,7 +509,7 @@ int FFmpegImportFileHandle::Import(TrackFactory *trackFactory, int c; for (c = 0; c < mScs[s]->m_stream->codec->channels; c++) { - mChannels[s][c] = trackFactory->NewWaveTrack(mScs[s]->m_osamplefmt, mScs[s]->m_stream->codec->sample_rate); + mChannels[s][c] = trackFactory->NewWaveTrack(mScs[s]->m_osamplefmt, mScs[s]->m_stream->codec->sample_rate).release(); if (mScs[s]->m_stream->codec->channels == 2) { diff --git a/src/import/ImportFLAC.cpp b/src/import/ImportFLAC.cpp index b09de45a1..d418bdc7c 100644 --- a/src/import/ImportFLAC.cpp +++ b/src/import/ImportFLAC.cpp @@ -442,7 +442,7 @@ int FLACImportFileHandle::Import(TrackFactory *trackFactory, unsigned long c; for (c = 0; c < mNumChannels; c++) { - mChannels[c] = trackFactory->NewWaveTrack(mFormat, mSampleRate); + mChannels[c] = trackFactory->NewWaveTrack(mFormat, mSampleRate).release(); if (mNumChannels == 2) { switch (c) { diff --git a/src/import/ImportMP3.cpp b/src/import/ImportMP3.cpp index 034fbdb95..fd33139cc 100644 --- a/src/import/ImportMP3.cpp +++ b/src/import/ImportMP3.cpp @@ -489,7 +489,7 @@ enum mad_flow output_cb(void *_data, Read(wxT("/SamplingRate/DefaultProjectSampleFormat"), floatSample); for(chn = 0; chn < channels; chn++) { - data->channels[chn] = data->trackFactory->NewWaveTrack(format, samplerate); + data->channels[chn] = data->trackFactory->NewWaveTrack(format, samplerate).release(); data->channels[chn]->SetChannel(Track::MonoChannel); } diff --git a/src/import/ImportOGG.cpp b/src/import/ImportOGG.cpp index a90919e6d..e61698d6b 100644 --- a/src/import/ImportOGG.cpp +++ b/src/import/ImportOGG.cpp @@ -261,7 +261,7 @@ int OggImportFileHandle::Import(TrackFactory *trackFactory, Track ***outTracks, mChannels[i] = new WaveTrack *[vi->channels]; for (c = 0; c < vi->channels; c++) { - mChannels[i][c] = trackFactory->NewWaveTrack(mFormat, vi->rate); + mChannels[i][c] = trackFactory->NewWaveTrack(mFormat, vi->rate).release(); if (vi->channels == 2) { switch (c) { diff --git a/src/import/ImportPCM.cpp b/src/import/ImportPCM.cpp index 335684724..5962bbcee 100644 --- a/src/import/ImportPCM.cpp +++ b/src/import/ImportPCM.cpp @@ -342,7 +342,7 @@ int PCMImportFileHandle::Import(TrackFactory *trackFactory, int c; for (c = 0; c < mInfo.channels; c++) { - channels[c] = trackFactory->NewWaveTrack(mFormat, mInfo.samplerate); + channels[c] = trackFactory->NewWaveTrack(mFormat, mInfo.samplerate).release(); if (mInfo.channels > 1) switch (c) { diff --git a/src/import/ImportRaw.cpp b/src/import/ImportRaw.cpp index b164c01c8..9e3b0dfd8 100644 --- a/src/import/ImportRaw.cpp +++ b/src/import/ImportRaw.cpp @@ -191,7 +191,7 @@ int ImportRaw(wxWindow *parent, const wxString &fileName, int c; for (c = 0; c < numChannels; c++) { - channels[c] = trackFactory->NewWaveTrack(format, rate); + channels[c] = trackFactory->NewWaveTrack(format, rate).release(); if (numChannels > 1) switch (c) { diff --git a/src/toolbars/ControlToolBar.cpp b/src/toolbars/ControlToolBar.cpp index 130785904..54132a9e1 100644 --- a/src/toolbars/ControlToolBar.cpp +++ b/src/toolbars/ControlToolBar.cpp @@ -882,14 +882,13 @@ void ControlToolBar::OnRecord(wxCommandEvent &evt) tracksCopy = *trackList; } - WaveTrack *newTrack = p->GetTrackFactory()->NewWaveTrack(); + auto newTrack = p->GetTrackFactory()->NewWaveTrack(); newTrack->InsertSilence(0.0, t0 - t1); newTrack->Flush(); wt->Clear(t1, t0); - bool bResult = wt->Paste(t1, newTrack); + bool bResult = wt->Paste(t1, newTrack.get()); wxASSERT(bResult); // TO DO: Actually handle this. wxUnusedVar(bResult); - delete newTrack; } newRecordingTracks.push_back(wt); } @@ -921,7 +920,7 @@ void ControlToolBar::OnRecord(wxCommandEvent &evt) wxString baseTrackName = recordingNameCustom? defaultRecordingTrackName : defaultTrackName; for (int c = 0; c < recordingChannels; c++) { - WaveTrack *newTrack = p->GetTrackFactory()->NewWaveTrack(); + WaveTrack *newTrack = p->GetTrackFactory()->NewWaveTrack().release(); newTrack->SetOffset(t0); wxString nameSuffix = wxString(wxT("")); diff --git a/src/toolbars/TranscriptionToolBar.cpp b/src/toolbars/TranscriptionToolBar.cpp index c3d7c47f8..4f5daadba 100644 --- a/src/toolbars/TranscriptionToolBar.cpp +++ b/src/toolbars/TranscriptionToolBar.cpp @@ -92,7 +92,6 @@ TranscriptionToolBar::TranscriptionToolBar() : ToolBar(TranscriptionBarID, _("Transcription"), wxT("Transcription")) { mPlaySpeed = 1.0 * 100.0; - mTimeTrack = NULL; #ifdef EXPERIMENTAL_VOICE_DETECTION mVk = new VoiceKey(); #endif @@ -103,10 +102,6 @@ TranscriptionToolBar::~TranscriptionToolBar() #ifdef EXPERIMENTAL_VOICE_DETECTION delete mVk; #endif - if (mTimeTrack) { - delete mTimeTrack; - mTimeTrack = NULL; - } } void TranscriptionToolBar::Create(wxWindow * parent) @@ -463,7 +458,7 @@ void TranscriptionToolBar::PlayAtSpeed(bool looped, bool cutPreview) #endif AudioIOStartStreamOptions options(p->GetDefaultPlayOptions()); options.playLooped = looped; - options.timeTrack = mTimeTrack; + options.timeTrack = mTimeTrack.get(); p->GetControlToolBar()->PlayPlayRegion (SelectedRegion(playRegionStart, playRegionEnd), options, diff --git a/src/toolbars/TranscriptionToolBar.h b/src/toolbars/TranscriptionToolBar.h index 425e0d079..734b37cce 100644 --- a/src/toolbars/TranscriptionToolBar.h +++ b/src/toolbars/TranscriptionToolBar.h @@ -16,6 +16,7 @@ #include "ToolBar.h" #include "../Experimental.h" +#include "../MemoryX.h" #include #include @@ -152,7 +153,7 @@ class TranscriptionToolBar final : public ToolBar { int mBackgroundWidth; int mBackgroundHeight; - TimeTrack *mTimeTrack; + std::unique_ptr mTimeTrack; public: