1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-09-17 16:50:26 +02:00

TrackFactory functions return std::unique_ptr, although some callers...

... release() them for now.
This commit is contained in:
Paul Licameli 2016-03-02 14:59:31 -05:00
parent f42a953752
commit 5ef4dd46a5
31 changed files with 91 additions and 135 deletions

View File

@ -344,7 +344,7 @@ void BenchmarkDialog::OnRun( wxCommandEvent & WXUNUSED(event))
ZoomInfo zoomInfo(0.0, ZoomInfo::GetDefaultZoom()); ZoomInfo zoomInfo(0.0, ZoomInfo::GetDefaultZoom());
DirManager *d = new DirManager(); DirManager *d = new DirManager();
WaveTrack *const t = TrackFactory{ d, &zoomInfo }.NewWaveTrack(int16Sample); const auto t = TrackFactory{ d, &zoomInfo }.NewWaveTrack(int16Sample);
Track *tmp = NULL; Track *tmp = NULL;
t->SetRate(1); t->SetRate(1);
@ -533,8 +533,6 @@ void BenchmarkDialog::OnRun( wxCommandEvent & WXUNUSED(event))
if (tmp) if (tmp)
delete tmp; delete tmp;
delete t;
delete[]small1; delete[]small1;
delete[]small2; delete[]small2;
delete[]block; delete[]block;

View File

@ -319,7 +319,7 @@ bool LabelDialog::TransferDataFromWindow()
wxString name = mTrackNames[tndx + 1].AfterFirst(wxT('-')).Mid(1); wxString name = mTrackNames[tndx + 1].AfterFirst(wxT('-')).Mid(1);
// Create the NEW track and add to track list // Create the NEW track and add to track list
LabelTrack *newTrack = mFactory.NewLabelTrack(); LabelTrack *newTrack = mFactory.NewLabelTrack().release();
newTrack->SetName(name); newTrack->SetName(name);
mTracks->Add(newTrack); mTracks->Add(newTrack);
tndx++; tndx++;
@ -564,14 +564,13 @@ void LabelDialog::OnImport(wxCommandEvent & WXUNUSED(event))
else { else {
// Create a temporary label track and load the labels // Create a temporary label track and load the labels
// into it // into it
LabelTrack *lt = mFactory.NewLabelTrack(); auto lt = mFactory.NewLabelTrack();
lt->Import(f); lt->Import(f);
// Add the labesls to our collection // Add the labesls to our collection
AddLabels(lt); AddLabels(lt.get());
// Done with the temporary track // Done with the temporary track
delete lt;
} }
// Repopulate the grid // Repopulate the grid
@ -632,7 +631,7 @@ void LabelDialog::OnExport(wxCommandEvent & WXUNUSED(event))
} }
// Transfer our collection to a temporary label track // Transfer our collection to a temporary label track
LabelTrack *lt = mFactory.NewLabelTrack(); auto lt = mFactory.NewLabelTrack();
int i; int i;
for (i = 0; i < cnt; i++) { for (i = 0; i < cnt; i++) {
@ -643,7 +642,6 @@ void LabelDialog::OnExport(wxCommandEvent & WXUNUSED(event))
// Export them and clean // Export them and clean
lt->Export(f); lt->Export(f);
delete lt;
#ifdef __WXMAC__ #ifdef __WXMAC__
f.Write(wxTextFileType_Mac); f.Write(wxTextFileType_Mac);

View File

@ -88,9 +88,9 @@ int LabelTrack::mTextHeight;
int LabelTrack::mFontHeight=-1; int LabelTrack::mFontHeight=-1;
LabelTrack *TrackFactory::NewLabelTrack() LabelTrack::Holder TrackFactory::NewLabelTrack()
{ {
return new LabelTrack(mDirManager); return std::make_unique<LabelTrack>(mDirManager);
} }
LabelTrack::LabelTrack(DirManager * projDirManager): LabelTrack::LabelTrack(DirManager * projDirManager):

View File

@ -3358,7 +3358,7 @@ bool AudacityProject::OnEffect(const PluginID & ID, int flags)
// No tracks were selected... // No tracks were selected...
if (type == EffectTypeGenerate) { if (type == EffectTypeGenerate) {
// Create a NEW track for the generated audio... // Create a NEW track for the generated audio...
newTrack = mTrackFactory->NewWaveTrack(); newTrack = mTrackFactory->NewWaveTrack().release();
mTracks->Add(newTrack); mTracks->Add(newTrack);
newTrack->SetSelected(true); newTrack->SetSelected(true);
} }
@ -4152,17 +4152,14 @@ void AudacityProject::OnPaste()
((WaveTrack *)n)->ClearAndPaste(t0, t1, (WaveTrack *)c, true, true); ((WaveTrack *)n)->ClearAndPaste(t0, t1, (WaveTrack *)c, true, true);
} }
else { else {
WaveTrack *tmp; auto tmp = mTrackFactory->NewWaveTrack( ((WaveTrack*)n)->GetSampleFormat(), ((WaveTrack*)n)->GetRate());
tmp = mTrackFactory->NewWaveTrack( ((WaveTrack*)n)->GetSampleFormat(), ((WaveTrack*)n)->GetRate());
bool bResult = tmp->InsertSilence(0.0, msClipT1 - msClipT0); // MJS: Is this correct? bool bResult = tmp->InsertSilence(0.0, msClipT1 - msClipT0); // MJS: Is this correct?
wxASSERT(bResult); // TO DO: Actually handle this. wxASSERT(bResult); // TO DO: Actually handle this.
wxUnusedVar(bResult); wxUnusedVar(bResult);
tmp->Flush(); tmp->Flush();
bPastedSomething |= bPastedSomething |=
((WaveTrack *)n)->ClearAndPaste(t0, t1, tmp, true, true); ((WaveTrack *)n)->ClearAndPaste(t0, t1, tmp.get(), true, true);
delete tmp;
} }
} }
else if (n->GetKind() == Track::Label && n->GetSelected()) else if (n->GetKind() == Track::Label && n->GetSelected())
@ -4267,19 +4264,19 @@ bool AudacityProject::HandlePasteNothingSelected()
case Track::Wave: case Track::Wave:
{ {
WaveTrack *w = (WaveTrack *)pClip; WaveTrack *w = (WaveTrack *)pClip;
pNewTrack = mTrackFactory->NewWaveTrack(w->GetSampleFormat(), w->GetRate()); pNewTrack = mTrackFactory->NewWaveTrack(w->GetSampleFormat(), w->GetRate()).release();
} }
break; break;
#ifdef USE_MIDI #ifdef USE_MIDI
case Track::Note: case Track::Note:
pNewTrack = mTrackFactory->NewNoteTrack(); pNewTrack = mTrackFactory->NewNoteTrack().release();
break; break;
#endif // USE_MIDI #endif // USE_MIDI
case Track::Label: case Track::Label:
pNewTrack = mTrackFactory->NewLabelTrack(); pNewTrack = mTrackFactory->NewLabelTrack().release();
break; break;
case Track::Time: case Track::Time:
pNewTrack = mTrackFactory->NewTimeTrack(); pNewTrack = mTrackFactory->NewTimeTrack().release();
break; break;
default: default:
pClip = iterClip.Next(); pClip = iterClip.Next();
@ -4358,7 +4355,7 @@ void AudacityProject::OnPasteNewLabel()
// If no match found, add one // If no match found, add one
if (!t) { if (!t) {
t = GetTrackFactory()->NewLabelTrack(); t = GetTrackFactory()->NewLabelTrack().release();
mTracks->Add(t); mTracks->Add(t);
} }
@ -5495,7 +5492,7 @@ void AudacityProject::OnImportLabels()
return; return;
} }
LabelTrack *newTrack = GetTrackFactory()->NewLabelTrack(); LabelTrack *newTrack = GetTrackFactory()->NewLabelTrack().release();
wxString sTrackName; wxString sTrackName;
wxFileName::SplitPath(fileName, NULL, NULL, &sTrackName, NULL); wxFileName::SplitPath(fileName, NULL, NULL, &sTrackName, NULL);
newTrack->SetName(sTrackName); newTrack->SetName(sTrackName);
@ -5538,7 +5535,7 @@ void AudacityProject::OnImportMIDI()
void AudacityProject::DoImportMIDI(const wxString &fileName) void AudacityProject::DoImportMIDI(const wxString &fileName)
{ {
NoteTrack *newTrack = GetTrackFactory()->NewNoteTrack(); NoteTrack *newTrack = GetTrackFactory()->NewNoteTrack().release();
if (::ImportMIDI(fileName, newTrack)) { if (::ImportMIDI(fileName, newTrack)) {
@ -6253,7 +6250,7 @@ void AudacityProject::OnScoreAlign()
void AudacityProject::OnNewWaveTrack() void AudacityProject::OnNewWaveTrack()
{ {
WaveTrack *t = mTrackFactory->NewWaveTrack(mDefaultFormat, mRate); WaveTrack *t = mTrackFactory->NewWaveTrack(mDefaultFormat, mRate).release();
SelectNone(); SelectNone();
mTracks->Add(t); mTracks->Add(t);
@ -6267,7 +6264,7 @@ void AudacityProject::OnNewWaveTrack()
void AudacityProject::OnNewStereoTrack() void AudacityProject::OnNewStereoTrack()
{ {
WaveTrack *t = mTrackFactory->NewWaveTrack(mDefaultFormat, mRate); WaveTrack *t = mTrackFactory->NewWaveTrack(mDefaultFormat, mRate).release();
t->SetChannel(Track::LeftChannel); t->SetChannel(Track::LeftChannel);
SelectNone(); SelectNone();
@ -6275,7 +6272,7 @@ void AudacityProject::OnNewStereoTrack()
t->SetSelected(true); t->SetSelected(true);
t->SetLinked (true); t->SetLinked (true);
t = mTrackFactory->NewWaveTrack(mDefaultFormat, mRate); t = mTrackFactory->NewWaveTrack(mDefaultFormat, mRate).release();
t->SetChannel(Track::RightChannel); t->SetChannel(Track::RightChannel);
mTracks->Add(t); mTracks->Add(t);
@ -6289,7 +6286,7 @@ void AudacityProject::OnNewStereoTrack()
void AudacityProject::OnNewLabelTrack() void AudacityProject::OnNewLabelTrack()
{ {
LabelTrack *t = GetTrackFactory()->NewLabelTrack(); LabelTrack *t = GetTrackFactory()->NewLabelTrack().release();
SelectNone(); SelectNone();
@ -6309,7 +6306,7 @@ void AudacityProject::OnNewTimeTrack()
return; return;
} }
TimeTrack *t = mTrackFactory->NewTimeTrack(); TimeTrack *t = mTrackFactory->NewTimeTrack().release();
SelectNone(); SelectNone();
@ -6385,7 +6382,7 @@ int AudacityProject::DoAddLabel(const SelectedRegion &region, bool preserveFocus
// If none found, start a NEW label track and use it // If none found, start a NEW label track and use it
if (!lt) { if (!lt) {
lt = GetTrackFactory()->NewLabelTrack(); lt = GetTrackFactory()->NewLabelTrack().release();
mTracks->Add(lt); mTracks->Add(lt);
} }

View File

@ -121,7 +121,7 @@ bool MixAndRender(TrackList *tracks, TrackFactory *trackFactory,
oneinput = true; oneinput = true;
// only one input track (either 1 mono or one linked stereo pair) // 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) if (oneinput)
mixLeft->SetName(usefulIter.First()->GetName()); /* set name of output track to be the same as the sole input track */ mixLeft->SetName(usefulIter.First()->GetName()); /* set name of output track to be the same as the sole input track */
else else
@ -132,7 +132,7 @@ bool MixAndRender(TrackList *tracks, TrackFactory *trackFactory,
mixLeft->SetChannel(Track::MonoChannel); mixLeft->SetChannel(Track::MonoChannel);
} }
else { else {
mixRight = trackFactory->NewWaveTrack(format, rate); mixRight = trackFactory->NewWaveTrack(format, rate).release();
if (oneinput) { if (oneinput) {
if (usefulIter.First()->GetLink() != NULL) // we have linked track if (usefulIter.First()->GetLink() != NULL) // we have linked track
mixLeft->SetName(usefulIter.First()->GetLink()->GetName()); /* set name to match input track's right channel!*/ mixLeft->SetName(usefulIter.First()->GetLink()->GetName()); /* set name to match input track's right channel!*/

View File

@ -98,9 +98,9 @@ SONFNS(AutoSave)
NoteTrack *TrackFactory::NewNoteTrack() NoteTrack::Holder TrackFactory::NewNoteTrack()
{ {
return new NoteTrack(mDirManager); return std::make_unique<NoteTrack>(mDirManager);
} }
NoteTrack::NoteTrack(DirManager * projDirManager): NoteTrack::NoteTrack(DirManager * projDirManager):

View File

@ -3147,27 +3147,27 @@ XMLTagHandler *AudacityProject::HandleXMLChild(const wxChar *tag)
} }
if (!wxStrcmp(tag, wxT("wavetrack"))) { if (!wxStrcmp(tag, wxT("wavetrack"))) {
WaveTrack *newTrack = mTrackFactory->NewWaveTrack(); WaveTrack *newTrack = mTrackFactory->NewWaveTrack().release();
mTracks->Add(newTrack); mTracks->Add(newTrack);
return newTrack; return newTrack;
} }
#ifdef USE_MIDI #ifdef USE_MIDI
if (!wxStrcmp(tag, wxT("notetrack"))) { if (!wxStrcmp(tag, wxT("notetrack"))) {
NoteTrack *newTrack = mTrackFactory->NewNoteTrack(); NoteTrack *newTrack = mTrackFactory->NewNoteTrack().release();
mTracks->Add(newTrack); mTracks->Add(newTrack);
return newTrack; return newTrack;
} }
#endif // USE_MIDI #endif // USE_MIDI
if (!wxStrcmp(tag, wxT("labeltrack"))) { if (!wxStrcmp(tag, wxT("labeltrack"))) {
LabelTrack *newTrack = mTrackFactory->NewLabelTrack(); LabelTrack *newTrack = mTrackFactory->NewLabelTrack().release();
mTracks->Add(newTrack); mTracks->Add(newTrack);
return newTrack; return newTrack;
} }
if (!wxStrcmp(tag, wxT("timetrack"))) { if (!wxStrcmp(tag, wxT("timetrack"))) {
TimeTrack *newTrack = mTrackFactory->NewTimeTrack(); TimeTrack *newTrack = mTrackFactory->NewTimeTrack().release();
mTracks->Add(newTrack); mTracks->Add(newTrack);
return newTrack; return newTrack;
} }
@ -3593,7 +3593,7 @@ bool AudacityProject::Save(bool overwrite /* = true */ ,
{ {
numWaveTracks++; numWaveTracks++;
pWaveTrack = (WaveTrack*)pTrack; pWaveTrack = (WaveTrack*)pTrack;
pSavedTrack = mTrackFactory->DuplicateWaveTrack(*pWaveTrack); pSavedTrack = mTrackFactory->DuplicateWaveTrack(*pWaveTrack).release();
pSavedTrackList.Add(pSavedTrack); pSavedTrackList.Add(pSavedTrack);
} }

View File

@ -29,9 +29,9 @@
#define TIMETRACK_MIN 0.01 #define TIMETRACK_MIN 0.01
#define TIMETRACK_MAX 10.0 #define TIMETRACK_MAX 10.0
TimeTrack *TrackFactory::NewTimeTrack() std::unique_ptr<TimeTrack> TrackFactory::NewTimeTrack()
{ {
return new TimeTrack(mDirManager, mZoomInfo); return std::make_unique<TimeTrack>(mDirManager, mZoomInfo);
} }
TimeTrack::TimeTrack(DirManager *projDirManager, const ZoomInfo *zoomInfo): TimeTrack::TimeTrack(DirManager *projDirManager, const ZoomInfo *zoomInfo):

View File

@ -520,13 +520,13 @@ class AUDACITY_DLL_API TrackFactory
public: public:
// These methods are defined in WaveTrack.cpp, NoteTrack.cpp, // These methods are defined in WaveTrack.cpp, NoteTrack.cpp,
// LabelTrack.cpp, and TimeTrack.cpp respectively // LabelTrack.cpp, and TimeTrack.cpp respectively
WaveTrack* DuplicateWaveTrack(WaveTrack &orig); std::unique_ptr<WaveTrack> DuplicateWaveTrack(WaveTrack &orig);
WaveTrack *NewWaveTrack(sampleFormat format = (sampleFormat)0, std::unique_ptr<WaveTrack> NewWaveTrack(sampleFormat format = (sampleFormat)0,
double rate = 0); double rate = 0);
LabelTrack *NewLabelTrack(); std::unique_ptr<LabelTrack> NewLabelTrack();
TimeTrack *NewTimeTrack(); std::unique_ptr<TimeTrack> NewTimeTrack();
#if defined(USE_MIDI) #if defined(USE_MIDI)
NoteTrack *NewNoteTrack(); std::unique_ptr<NoteTrack> NewNoteTrack();
#endif #endif
}; };

View File

@ -63,15 +63,17 @@ using std::max;
bool WaveTrack::mMonoAsVirtualStereo; bool WaveTrack::mMonoAsVirtualStereo;
#endif #endif
WaveTrack* TrackFactory::DuplicateWaveTrack(WaveTrack &orig) WaveTrack::Holder TrackFactory::DuplicateWaveTrack(WaveTrack &orig)
{ {
return (WaveTrack*)(orig.Duplicate().release()); return std::unique_ptr<WaveTrack>
{ static_cast<WaveTrack*>(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<WaveTrack>
{ safenew WaveTrack(mDirManager, format, rate) };
} }
WaveTrack::WaveTrack(DirManager *projDirManager, sampleFormat format, double rate) : WaveTrack::WaveTrack(DirManager *projDirManager, sampleFormat format, double rate) :
@ -1166,16 +1168,15 @@ bool WaveTrack::SyncLockAdjust(double oldT1, double newT1)
if (!p) return false; if (!p) return false;
TrackFactory *f = p->GetTrackFactory(); TrackFactory *f = p->GetTrackFactory();
if (!f) return false; if (!f) return false;
WaveTrack *tmp = f->NewWaveTrack(GetSampleFormat(), GetRate()); auto tmp = f->NewWaveTrack(GetSampleFormat(), GetRate());
bool bResult = tmp->InsertSilence(0.0, newT1 - oldT1); bool bResult = tmp->InsertSilence(0.0, newT1 - oldT1);
wxASSERT(bResult); // TO DO: Actually handle this. wxASSERT(bResult); // TO DO: Actually handle this.
wxUnusedVar(bResult); wxUnusedVar(bResult);
tmp->Flush(); tmp->Flush();
bResult = Paste(oldT1, tmp); bResult = Paste(oldT1, tmp.get());
wxASSERT(bResult); // TO DO: Actually handle this. wxASSERT(bResult); // TO DO: Actually handle this.
wxUnusedVar(bResult); wxUnusedVar(bResult);
delete tmp;
} }
} }
else if (newT1 < oldT1) { else if (newT1 < oldT1) {

View File

@ -475,7 +475,7 @@ bool EffectChangeSpeed::ProcessOne(WaveTrack * track,
// initialization, per examples of Mixer::Mixer and // initialization, per examples of Mixer::Mixer and
// EffectSoundTouch::ProcessOne // EffectSoundTouch::ProcessOne
WaveTrack * outputTrack = mFactory->NewWaveTrack(track->GetSampleFormat(), auto outputTrack = mFactory->NewWaveTrack(track->GetSampleFormat(),
track->GetRate()); track->GetRate());
//Get the length of the selection (as double). len is //Get the length of the selection (as double). len is
@ -552,15 +552,12 @@ bool EffectChangeSpeed::ProcessOne(WaveTrack * track,
if (bResult) if (bResult)
{ {
SetTimeWarper(new LinearTimeWarper(mCurT0, mCurT0, mCurT1, mCurT0 + newLength)); 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) if (newLength > mMaxNewLength)
mMaxNewLength = newLength; mMaxNewLength = newLength;
// Delete the outputTrack now that its data is inserted in place
delete outputTrack;
return bResult; return bResult;
} }

View File

@ -1592,8 +1592,7 @@ bool Effect::ProcessTrack(int count,
int chans = wxMin(mNumAudioOut, mNumChannels); int chans = wxMin(mNumAudioOut, mNumChannels);
WaveTrack *genLeft = NULL; std::unique_ptr<WaveTrack> genLeft, genRight;
WaveTrack *genRight = NULL;
sampleCount genLength = 0; sampleCount genLength = 0;
bool isGenerator = GetType() == EffectTypeGenerate; bool isGenerator = GetType() == EffectTypeGenerate;
bool isProcessor = GetType() == EffectTypeProcess; bool isProcessor = GetType() == EffectTypeProcess;
@ -1719,16 +1718,6 @@ bool Effect::ProcessTrack(int count,
} }
catch(...) catch(...)
{ {
if (genLeft)
{
delete genLeft;
}
if (genRight)
{
delete genRight;
}
return false; return false;
} }
wxASSERT(processed == curBlockSize); wxASSERT(processed == curBlockSize);
@ -1886,14 +1875,12 @@ bool Effect::ProcessTrack(int count,
// Transfer the data from the temporary tracks to the actual ones // Transfer the data from the temporary tracks to the actual ones
genLeft->Flush(); genLeft->Flush();
// mT1 gives us the NEW selection. We want to replace up to GetSel1(). // mT1 gives us the NEW selection. We want to replace up to GetSel1().
left->ClearAndPaste(mT0, p->GetSel1(), genLeft, true, true, &warper); left->ClearAndPaste(mT0, p->GetSel1(), genLeft.get(), true, true, &warper);
delete genLeft;
if (genRight) if (genRight)
{ {
genRight->Flush(); genRight->Flush();
right->ClearAndPaste(mT0, mT1, genRight, true, true, &warper); right->ClearAndPaste(mT0, mT1, genRight.get(), true, true, &warper);
delete genRight;
} }
} }
@ -2135,7 +2122,7 @@ void Effect::AddToOutputTracks(Track *t)
Effect::AddedAnalysisTrack::AddedAnalysisTrack(Effect *pEffect, const wxString &name) Effect::AddedAnalysisTrack::AddedAnalysisTrack(Effect *pEffect, const wxString &name)
: mpEffect(pEffect) : mpEffect(pEffect)
{ {
std::unique_ptr < LabelTrack > pTrack{ pEffect->mFactory->NewLabelTrack() }; LabelTrack::Holder pTrack{ pEffect->mFactory->NewLabelTrack() };
mpTrack = pTrack.get(); mpTrack = pTrack.get();
if (!name.empty()) if (!name.empty())
pTrack->SetName(name); pTrack->SetName(name);

View File

@ -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 // create a NEW WaveTrack to hold all of the output, including 'tails' each end
AudacityProject *p = GetActiveProject(); 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 int L = windowSize - (mM - 1); //Process L samples at a go
sampleCount s = start; sampleCount s = start;
@ -1233,7 +1233,6 @@ bool EffectEqualization::ProcessOne(int count, WaveTrack * t,
delete[] buffer; delete[] buffer;
delete[] window1; delete[] window1;
delete[] window2; delete[] window2;
delete output;
return bLoopSuccess; return bLoopSuccess;
} }

View File

@ -65,7 +65,7 @@ bool Generator::Process()
{ {
AudacityProject *p = GetActiveProject(); AudacityProject *p = GetActiveProject();
// Create a temporary track // Create a temporary track
std::unique_ptr<WaveTrack> tmp( WaveTrack::Holder tmp(
mFactory->NewWaveTrack(track->GetSampleFormat(), mFactory->NewWaveTrack(track->GetSampleFormat(),
track->GetRate()) track->GetRate())
); );

View File

@ -1291,7 +1291,7 @@ bool EffectNoiseReduction::Worker::ProcessOne
StartNewTrack(); StartNewTrack();
std::unique_ptr<WaveTrack> outputTrack( WaveTrack::Holder outputTrack(
mDoProfile ? NULL mDoProfile ? NULL
: factory.NewWaveTrack(track->GetSampleFormat(), track->GetRate())); : factory.NewWaveTrack(track->GetSampleFormat(), track->GetRate()));

View File

@ -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)); double adjust_amount=(double)len/((double)len-((double)stretch_buf_size*2.0));
amount=1.0+(amount-1.0)*adjust_amount; 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()); 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(); outputTrack->Flush();
track->Clear(t0,t1); track->Clear(t0,t1);
bool success = track->Paste(t0,outputTrack); bool success = track->Paste(t0, outputTrack.get());
if (!cancelled && success){ if (!cancelled && success){
m_t1 = mT0 + outputTrack->GetEndTime(); m_t1 = mT0 + outputTrack->GetEndTime();
} }
delete []buffer0; delete []buffer0;
delete outputTrack;
return !cancelled; return !cancelled;
}; };

View File

@ -52,8 +52,6 @@ public:
if(leftBuffer) free(leftBuffer); if(leftBuffer) free(leftBuffer);
if(rightBuffer) free(rightBuffer); if(rightBuffer) free(rightBuffer);
if(SBSMSBuf) free(SBSMSBuf); if(SBSMSBuf) free(SBSMSBuf);
if(outputLeftTrack) delete outputLeftTrack;
if(outputRightTrack) delete outputRightTrack;
if(quality) delete quality; if(quality) delete quality;
if(sbsms) delete sbsms; if(sbsms) delete sbsms;
if(iface) delete iface; if(iface) delete iface;
@ -79,8 +77,8 @@ public:
// Not required by callbacks, but makes for easier cleanup // Not required by callbacks, but makes for easier cleanup
Resampler *resampler; Resampler *resampler;
SBSMSQuality *quality; SBSMSQuality *quality;
WaveTrack *outputLeftTrack; std::unique_ptr<WaveTrack> outputLeftTrack;
WaveTrack *outputRightTrack; std::unique_ptr<WaveTrack> outputRightTrack;
}; };
class SBSMSEffectInterface final : public SBSMSInterfaceSliding { class SBSMSEffectInterface final : public SBSMSInterfaceSliding {
@ -413,7 +411,7 @@ bool EffectSBSMS::Process()
rb.outputRightTrack->Flush(); rb.outputRightTrack->Flush();
bool bResult = bool bResult =
leftTrack->ClearAndPaste(mCurT0, mCurT1, rb.outputLeftTrack, leftTrack->ClearAndPaste(mCurT0, mCurT1, rb.outputLeftTrack.get(),
true, false, GetTimeWarper()); true, false, GetTimeWarper());
wxASSERT(bResult); // TO DO: Actually handle this. wxASSERT(bResult); // TO DO: Actually handle this.
wxUnusedVar(bResult); wxUnusedVar(bResult);
@ -421,7 +419,7 @@ bool EffectSBSMS::Process()
if(rightTrack) if(rightTrack)
{ {
bResult = bResult =
rightTrack->ClearAndPaste(mCurT0, mCurT1, rb.outputRightTrack, rightTrack->ClearAndPaste(mCurT0, mCurT1, rb.outputRightTrack.get(),
true, false, GetTimeWarper()); true, false, GetTimeWarper());
wxASSERT(bResult); // TO DO: Actually handle this. wxASSERT(bResult); // TO DO: Actually handle this.
} }

View File

@ -176,12 +176,11 @@ bool EffectSoundTouch::Process()
bool EffectSoundTouch::ProcessOne(WaveTrack *track, bool EffectSoundTouch::ProcessOne(WaveTrack *track,
sampleCount start, sampleCount end) sampleCount start, sampleCount end)
{ {
WaveTrack *outputTrack;
sampleCount s; sampleCount s;
mSoundTouch->setSampleRate((unsigned int)(track->GetRate()+0.5)); 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 //Get the length of the buffer (as double). len is
//used simple to calculate a progress meter, so it is easier //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 // Take the output track and insert it in place of the original
// sample data // sample data
track->ClearAndPaste(mCurT0, mCurT1, outputTrack, true, false, GetTimeWarper()); track->ClearAndPaste(mCurT0, mCurT1, outputTrack.get(), true, false, GetTimeWarper());
double newLength = outputTrack->GetEndTime(); double newLength = outputTrack->GetEndTime();
m_maxNewLength = wxMax(m_maxNewLength, newLength); 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 because the effect processing succeeded.
return true; return true;
} }
@ -262,9 +258,9 @@ bool EffectSoundTouch::ProcessStereo(WaveTrack* leftTrack, WaveTrack* rightTrack
{ {
mSoundTouch->setSampleRate((unsigned int)(leftTrack->GetRate()+0.5)); mSoundTouch->setSampleRate((unsigned int)(leftTrack->GetRate()+0.5));
WaveTrack* outputLeftTrack = mFactory->NewWaveTrack(leftTrack->GetSampleFormat(), auto outputLeftTrack = mFactory->NewWaveTrack(leftTrack->GetSampleFormat(),
leftTrack->GetRate()); leftTrack->GetRate());
WaveTrack* outputRightTrack = mFactory->NewWaveTrack(rightTrack->GetSampleFormat(), auto outputRightTrack = mFactory->NewWaveTrack(rightTrack->GetSampleFormat(),
rightTrack->GetRate()); rightTrack->GetRate());
//Get the length of the buffer (as double). len is //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 //Get back samples from SoundTouch
unsigned int outputCount = mSoundTouch->numSamples(); unsigned int outputCount = mSoundTouch->numSamples();
if (outputCount > 0) if (outputCount > 0)
this->ProcessStereoResults(outputCount, outputLeftTrack, outputRightTrack); this->ProcessStereoResults(outputCount, outputLeftTrack.get(), outputRightTrack.get());
//Increment sourceSampleCount one blockfull of samples //Increment sourceSampleCount one blockfull of samples
sourceSampleCount += blockSize; sourceSampleCount += blockSize;
@ -336,7 +332,7 @@ bool EffectSoundTouch::ProcessStereo(WaveTrack* leftTrack, WaveTrack* rightTrack
unsigned int outputCount = mSoundTouch->numSamples(); unsigned int outputCount = mSoundTouch->numSamples();
if (outputCount > 0) if (outputCount > 0)
this->ProcessStereoResults(outputCount, outputLeftTrack, outputRightTrack); this->ProcessStereoResults(outputCount, outputLeftTrack.get(), outputRightTrack.get());
// Flush the output WaveTracks (since they're buffered, too) // Flush the output WaveTracks (since they're buffered, too)
outputLeftTrack->Flush(); outputLeftTrack->Flush();
@ -349,8 +345,8 @@ bool EffectSoundTouch::ProcessStereo(WaveTrack* leftTrack, WaveTrack* rightTrack
// Take the output tracks and insert in place of the original // Take the output tracks and insert in place of the original
// sample data. // sample data.
leftTrack->ClearAndPaste(mCurT0, mCurT1, outputLeftTrack, true, false, GetTimeWarper()); leftTrack->ClearAndPaste(mCurT0, mCurT1, outputLeftTrack.get(), true, false, GetTimeWarper());
rightTrack->ClearAndPaste(mCurT0, mCurT1, outputRightTrack, true, false, GetTimeWarper()); rightTrack->ClearAndPaste(mCurT0, mCurT1, outputRightTrack.get(), true, false, GetTimeWarper());
// Track the longest result length // Track the longest result length
double newLength = outputLeftTrack->GetEndTime(); double newLength = outputLeftTrack->GetEndTime();
@ -358,10 +354,6 @@ bool EffectSoundTouch::ProcessStereo(WaveTrack* leftTrack, WaveTrack* rightTrack
newLength = outputRightTrack->GetEndTime(); newLength = outputRightTrack->GetEndTime();
m_maxNewLength = wxMax(m_maxNewLength, newLength); 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 because the effect processing succeeded.
return true; return true;
} }

View File

@ -124,8 +124,6 @@ bool EffectStereoToMono::Process()
count++; count++;
} }
if(mOutTrack)
delete mOutTrack;
this->ReplaceProcessedTracks(bGoodResult); this->ReplaceProcessedTracks(bGoodResult);
return bGoodResult; return bGoodResult;
} }
@ -164,7 +162,7 @@ bool EffectStereoToMono::ProcessOne(int count)
double minStart = wxMin(mLeftTrack->GetStartTime(), mRightTrack->GetStartTime()); double minStart = wxMin(mLeftTrack->GetStartTime(), mRightTrack->GetStartTime());
bResult &= mLeftTrack->Clear(mLeftTrack->GetStartTime(), mLeftTrack->GetEndTime()); bResult &= mLeftTrack->Clear(mLeftTrack->GetStartTime(), mLeftTrack->GetEndTime());
bResult &= mOutTrack->Flush(); bResult &= mOutTrack->Flush();
bResult &= mLeftTrack->Paste(minStart, mOutTrack); bResult &= mLeftTrack->Paste(minStart, mOutTrack.get());
mLeftTrack->SetLinked(false); mLeftTrack->SetLinked(false);
mRightTrack->SetLinked(false); mRightTrack->SetLinked(false);
mLeftTrack->SetChannel(Track::MonoChannel); mLeftTrack->SetChannel(Track::MonoChannel);

View File

@ -53,7 +53,7 @@ private:
sampleCount mEnd; sampleCount mEnd;
WaveTrack *mLeftTrack; WaveTrack *mLeftTrack;
WaveTrack *mRightTrack; WaveTrack *mRightTrack;
WaveTrack *mOutTrack; std::unique_ptr<WaveTrack> mOutTrack;
}; };
#endif #endif

View File

@ -1120,7 +1120,7 @@ bool NyquistEffect::ProcessOne()
} }
if (!ltrack) { if (!ltrack) {
ltrack = mFactory->NewLabelTrack(); ltrack = mFactory->NewLabelTrack().release();
AddToOutputTracks((Track *)ltrack); AddToOutputTracks((Track *)ltrack);
} }
@ -1184,8 +1184,7 @@ bool NyquistEffect::ProcessOne()
if (!success) { if (!success) {
for(i = 0; i < outChannels; i++) { for(i = 0; i < outChannels; i++) {
delete mOutputTrack[i]; mOutputTrack[i].reset();
mOutputTrack[i] = NULL;
} }
return false; return false;
} }
@ -1202,8 +1201,7 @@ bool NyquistEffect::ProcessOne()
wxT("Nyquist"), wxT("Nyquist"),
wxOK | wxCENTRE, mUIParent); wxOK | wxCENTRE, mUIParent);
for (i = 0; i < outChannels; i++) { for (i = 0; i < outChannels; i++) {
delete mOutputTrack[i]; mOutputTrack[i].reset();
mOutputTrack[i] = NULL;
} }
return true; return true;
} }
@ -1213,10 +1211,10 @@ bool NyquistEffect::ProcessOne()
WaveTrack *out; WaveTrack *out;
if (outChannels == mCurNumChannels) { if (outChannels == mCurNumChannels) {
out = mOutputTrack[i]; out = mOutputTrack[i].get();
} }
else { else {
out = mOutputTrack[0]; out = mOutputTrack[0].get();
} }
if (mMergeClips < 0) { if (mMergeClips < 0) {
@ -1246,8 +1244,7 @@ bool NyquistEffect::ProcessOne()
} }
for (i = 0; i < outChannels; i++) { for (i = 0; i < outChannels; i++) {
delete mOutputTrack[i]; mOutputTrack[i].reset();
mOutputTrack[i] = NULL;
} }
mProjectChanged = true; mProjectChanged = true;
return true; return true;

View File

@ -224,7 +224,7 @@ private:
sampleCount mCurBufferStart[2]; sampleCount mCurBufferStart[2];
sampleCount mCurBufferLen[2]; sampleCount mCurBufferLen[2];
WaveTrack *mOutputTrack[2]; std::unique_ptr<WaveTrack> mOutputTrack[2];
wxArrayString mCategories; wxArrayString mCategories;

View File

@ -509,7 +509,7 @@ int FFmpegImportFileHandle::Import(TrackFactory *trackFactory,
int c; int c;
for (c = 0; c < mScs[s]->m_stream->codec->channels; 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) if (mScs[s]->m_stream->codec->channels == 2)
{ {

View File

@ -442,7 +442,7 @@ int FLACImportFileHandle::Import(TrackFactory *trackFactory,
unsigned long c; unsigned long c;
for (c = 0; c < mNumChannels; c++) { for (c = 0; c < mNumChannels; c++) {
mChannels[c] = trackFactory->NewWaveTrack(mFormat, mSampleRate); mChannels[c] = trackFactory->NewWaveTrack(mFormat, mSampleRate).release();
if (mNumChannels == 2) { if (mNumChannels == 2) {
switch (c) { switch (c) {

View File

@ -489,7 +489,7 @@ enum mad_flow output_cb(void *_data,
Read(wxT("/SamplingRate/DefaultProjectSampleFormat"), floatSample); Read(wxT("/SamplingRate/DefaultProjectSampleFormat"), floatSample);
for(chn = 0; chn < channels; chn++) { 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); data->channels[chn]->SetChannel(Track::MonoChannel);
} }

View File

@ -261,7 +261,7 @@ int OggImportFileHandle::Import(TrackFactory *trackFactory, Track ***outTracks,
mChannels[i] = new WaveTrack *[vi->channels]; mChannels[i] = new WaveTrack *[vi->channels];
for (c = 0; c < vi->channels; c++) { 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) { if (vi->channels == 2) {
switch (c) { switch (c) {

View File

@ -342,7 +342,7 @@ int PCMImportFileHandle::Import(TrackFactory *trackFactory,
int c; int c;
for (c = 0; c < mInfo.channels; 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) if (mInfo.channels > 1)
switch (c) { switch (c) {

View File

@ -191,7 +191,7 @@ int ImportRaw(wxWindow *parent, const wxString &fileName,
int c; int c;
for (c = 0; c < numChannels; c++) { for (c = 0; c < numChannels; c++) {
channels[c] = trackFactory->NewWaveTrack(format, rate); channels[c] = trackFactory->NewWaveTrack(format, rate).release();
if (numChannels > 1) if (numChannels > 1)
switch (c) { switch (c) {

View File

@ -882,14 +882,13 @@ void ControlToolBar::OnRecord(wxCommandEvent &evt)
tracksCopy = *trackList; tracksCopy = *trackList;
} }
WaveTrack *newTrack = p->GetTrackFactory()->NewWaveTrack(); auto newTrack = p->GetTrackFactory()->NewWaveTrack();
newTrack->InsertSilence(0.0, t0 - t1); newTrack->InsertSilence(0.0, t0 - t1);
newTrack->Flush(); newTrack->Flush();
wt->Clear(t1, t0); wt->Clear(t1, t0);
bool bResult = wt->Paste(t1, newTrack); bool bResult = wt->Paste(t1, newTrack.get());
wxASSERT(bResult); // TO DO: Actually handle this. wxASSERT(bResult); // TO DO: Actually handle this.
wxUnusedVar(bResult); wxUnusedVar(bResult);
delete newTrack;
} }
newRecordingTracks.push_back(wt); newRecordingTracks.push_back(wt);
} }
@ -921,7 +920,7 @@ void ControlToolBar::OnRecord(wxCommandEvent &evt)
wxString baseTrackName = recordingNameCustom? defaultRecordingTrackName : defaultTrackName; wxString baseTrackName = recordingNameCustom? defaultRecordingTrackName : defaultTrackName;
for (int c = 0; c < recordingChannels; c++) { for (int c = 0; c < recordingChannels; c++) {
WaveTrack *newTrack = p->GetTrackFactory()->NewWaveTrack(); WaveTrack *newTrack = p->GetTrackFactory()->NewWaveTrack().release();
newTrack->SetOffset(t0); newTrack->SetOffset(t0);
wxString nameSuffix = wxString(wxT("")); wxString nameSuffix = wxString(wxT(""));

View File

@ -92,7 +92,6 @@ TranscriptionToolBar::TranscriptionToolBar()
: ToolBar(TranscriptionBarID, _("Transcription"), wxT("Transcription")) : ToolBar(TranscriptionBarID, _("Transcription"), wxT("Transcription"))
{ {
mPlaySpeed = 1.0 * 100.0; mPlaySpeed = 1.0 * 100.0;
mTimeTrack = NULL;
#ifdef EXPERIMENTAL_VOICE_DETECTION #ifdef EXPERIMENTAL_VOICE_DETECTION
mVk = new VoiceKey(); mVk = new VoiceKey();
#endif #endif
@ -103,10 +102,6 @@ TranscriptionToolBar::~TranscriptionToolBar()
#ifdef EXPERIMENTAL_VOICE_DETECTION #ifdef EXPERIMENTAL_VOICE_DETECTION
delete mVk; delete mVk;
#endif #endif
if (mTimeTrack) {
delete mTimeTrack;
mTimeTrack = NULL;
}
} }
void TranscriptionToolBar::Create(wxWindow * parent) void TranscriptionToolBar::Create(wxWindow * parent)
@ -463,7 +458,7 @@ void TranscriptionToolBar::PlayAtSpeed(bool looped, bool cutPreview)
#endif #endif
AudioIOStartStreamOptions options(p->GetDefaultPlayOptions()); AudioIOStartStreamOptions options(p->GetDefaultPlayOptions());
options.playLooped = looped; options.playLooped = looped;
options.timeTrack = mTimeTrack; options.timeTrack = mTimeTrack.get();
p->GetControlToolBar()->PlayPlayRegion p->GetControlToolBar()->PlayPlayRegion
(SelectedRegion(playRegionStart, playRegionEnd), (SelectedRegion(playRegionStart, playRegionEnd),
options, options,

View File

@ -16,6 +16,7 @@
#include "ToolBar.h" #include "ToolBar.h"
#include "../Experimental.h" #include "../Experimental.h"
#include "../MemoryX.h"
#include <wx/brush.h> #include <wx/brush.h>
#include <wx/pen.h> #include <wx/pen.h>
@ -152,7 +153,7 @@ class TranscriptionToolBar final : public ToolBar {
int mBackgroundWidth; int mBackgroundWidth;
int mBackgroundHeight; int mBackgroundHeight;
TimeTrack *mTimeTrack; std::unique_ptr<TimeTrack> mTimeTrack;
public: public: