Track cut and copy functions return a unique_ptr argument...

... Because they are factory functions.
This commit is contained in:
Paul Licameli 2016-03-02 15:36:44 -05:00
parent 5ef4dd46a5
commit 3015a9c8d9
15 changed files with 144 additions and 153 deletions

View File

@ -345,7 +345,6 @@ void BenchmarkDialog::OnRun( wxCommandEvent & WXUNUSED(event))
ZoomInfo zoomInfo(0.0, ZoomInfo::GetDefaultZoom());
DirManager *d = new DirManager();
const auto t = TrackFactory{ d, &zoomInfo }.NewWaveTrack(int16Sample);
Track *tmp = NULL;
t->SetRate(1);
@ -418,7 +417,7 @@ void BenchmarkDialog::OnRun( wxCommandEvent & WXUNUSED(event))
if (mEditDetail)
Printf(wxT("Cut: %d - %d \n"), x0 * chunkSize, (x0 + xlen) * chunkSize);
t->Cut(double (x0 * chunkSize), double ((x0 + xlen) * chunkSize), &tmp);
auto tmp = t->Cut(double (x0 * chunkSize), double ((x0 + xlen) * chunkSize));
if (!tmp) {
Printf(wxT("Trial %d\n"), z);
Printf(wxT("Cut (%d, %d) failed.\n"), (x0 * chunkSize),
@ -432,7 +431,7 @@ void BenchmarkDialog::OnRun( wxCommandEvent & WXUNUSED(event))
if (mEditDetail)
Printf(wxT("Paste: %d\n"), y0 * chunkSize);
if (!t->Paste((double)(y0 * chunkSize), tmp))
if (!t->Paste((double)(y0 * chunkSize), tmp.get()))
{
Printf(wxT("Trial %d\nFailed on Paste.\n"), z);
goto fail;
@ -530,9 +529,6 @@ void BenchmarkDialog::OnRun( wxCommandEvent & WXUNUSED(event))
Printf(wxT("TEST FAILED!!!\n"));
success:
if (tmp)
delete tmp;
delete[]small1;
delete[]small2;
delete[]block;

View File

@ -2398,33 +2398,36 @@ bool LabelTrack::Save(wxTextFile * out, bool overwrite)
}
#endif
bool LabelTrack::Cut(double t0, double t1, Track **dest)
Track::Holder LabelTrack::Cut(double t0, double t1)
{
if (!Copy(t0, t1, dest))
return false;
auto tmp = Copy(t0, t1);
if (!tmp)
return{};
if (!Clear(t0, t1))
return false;
return{};
return true;
return std::move(tmp);
}
#if 0
bool LabelTrack::SplitCut(double t0, double t1, Track ** dest)
Track::Holder LabelTrack::SplitCut(double t0, double t1)
{
// SplitCut() == Copy() + SplitDelete()
if (!Copy(t0, t1, dest))
return false;
Track::Holder tmp = Copy(t0, t1);
if (!tmp)
return {};
if (!SplitDelete(t0, t1))
return false;
return {};
return true;
return std::move(tmp);
}
#endif
bool LabelTrack::Copy(double t0, double t1, Track ** dest) const
Track::Holder LabelTrack::Copy(double t0, double t1) const
{
*dest = new LabelTrack(GetDirManager());
auto tmp = std::make_unique<LabelTrack>(GetDirManager());
const auto lt = static_cast<LabelTrack*>(tmp.get());
int len = mLabels.Count();
for (int i = 0; i < len; i++) {
@ -2437,14 +2440,14 @@ bool LabelTrack::Copy(double t0, double t1, Track ** dest) const
label.getT0() - t0,
label.getT1() - t0,
label.title);
((LabelTrack *) (*dest))->mLabels.Add(l);
lt->mLabels.Add(l);
}
else if (relation == LabelStruct::WITHIN_LABEL) {
const LabelStruct &label = *mLabels[i];
LabelStruct *l =
new LabelStruct(label.selectedRegion, 0, t1-t0,
label.title);
((LabelTrack *) (*dest))->mLabels.Add(l);
lt->mLabels.Add(l);
}
else if (relation == LabelStruct::BEGINS_IN_LABEL) {
const LabelStruct &label = *mLabels[i];
@ -2453,7 +2456,7 @@ bool LabelTrack::Copy(double t0, double t1, Track ** dest) const
0,
label.getT1() - t0,
label.title);
((LabelTrack *) (*dest))->mLabels.Add(l);
lt->mLabels.Add(l);
}
else if (relation == LabelStruct::ENDS_IN_LABEL) {
const LabelStruct &label = *mLabels[i];
@ -2462,12 +2465,12 @@ bool LabelTrack::Copy(double t0, double t1, Track ** dest) const
label.getT0() - t0,
t1 - t0,
label.title);
((LabelTrack *) (*dest))->mLabels.Add(l);
lt->mLabels.Add(l);
}
}
((LabelTrack *) (*dest))->mClipLen = (t1 - t0);
lt->mClipLen = (t1 - t0);
return true;
return std::move(tmp);
}

View File

@ -153,12 +153,12 @@ class AUDACITY_DLL_API LabelTrack final : public Track
bool Save(wxTextFile * out, bool overwrite) override;
#endif
bool Cut (double t0, double t1, Track ** dest) override;
Track::Holder Cut (double t0, double t1) override;
// JKC Do not add the const modifier to Copy(), Clear()
// or Paste() because then it
// is no longer recognised as a virtual function matching the
// one in Track.
bool Copy (double t0, double t1, Track ** dest) const override;
Track::Holder Copy (double t0, double t1) const override;
bool Clear(double t0, double t1) override;
bool Paste(double t, const Track * src) override;
bool Repeat(double t0, double t1, int n);
@ -224,7 +224,7 @@ class AUDACITY_DLL_API LabelTrack final : public Track
bool PasteOver(double t, const Track *src);
// PRL: These functions were not used because they were not overrides! Was that right?
//bool SplitCut(double b, double e, Track **dest) /* not override */;
//Track::Holder SplitCut(double b, double e) /* not override */;
//bool SplitDelete(double b, double e) /* not override */;
void ShiftLabelsOnInsert(double length, double pt);

View File

@ -3815,7 +3815,6 @@ void AudacityProject::OnCut()
{
TrackListIterator iter(mTracks);
Track *n = iter.First();
Track *dest;
// This doesn't handle cutting labels, it handles
// cutting the _text_ inside of labels, i.e. if you're
@ -3837,22 +3836,22 @@ void AudacityProject::OnCut()
n = iter.First();
while (n) {
if (n->GetSelected()) {
dest = NULL;
Track::Holder dest;
#if defined(USE_MIDI)
if (n->GetKind() == Track::Note)
// Since portsmf has a built-in cut operator, we use that instead
n->Cut(mViewInfo.selectedRegion.t0(),
mViewInfo.selectedRegion.t1(), &dest);
dest = n->Cut(mViewInfo.selectedRegion.t0(),
mViewInfo.selectedRegion.t1());
else
#endif
n->Copy(mViewInfo.selectedRegion.t0(),
mViewInfo.selectedRegion.t1(), &dest);
dest = n->Copy(mViewInfo.selectedRegion.t0(),
mViewInfo.selectedRegion.t1());
if (dest) {
dest->SetChannel(n->GetChannel());
dest->SetLinked(n->GetLinked());
dest->SetName(n->GetName());
msClipboard->Add(dest);
msClipboard->Add(dest.release());
}
}
n = iter.Next();
@ -3904,21 +3903,21 @@ void AudacityProject::OnSplitCut()
{
TrackListIterator iter(mTracks);
Track *n = iter.First();
Track *dest;
ClearClipboard();
while (n) {
if (n->GetSelected()) {
dest = NULL;
Track::Holder dest;
if (n->GetKind() == Track::Wave)
{
((WaveTrack*)n)->SplitCut(
dest = ((WaveTrack*)n)->SplitCut(
mViewInfo.selectedRegion.t0(),
mViewInfo.selectedRegion.t1(), &dest);
} else
mViewInfo.selectedRegion.t1());
}
else
{
n->Copy(mViewInfo.selectedRegion.t0(),
mViewInfo.selectedRegion.t1(), &dest);
dest = n->Copy(mViewInfo.selectedRegion.t0(),
mViewInfo.selectedRegion.t1());
n->Silence(mViewInfo.selectedRegion.t0(),
mViewInfo.selectedRegion.t1());
}
@ -3926,7 +3925,7 @@ void AudacityProject::OnSplitCut()
dest->SetChannel(n->GetChannel());
dest->SetLinked(n->GetLinked());
dest->SetName(n->GetName());
msClipboard->Add(dest);
msClipboard->Add(dest.release());
}
}
n = iter.Next();
@ -3948,7 +3947,6 @@ void AudacityProject::OnCopy()
TrackListIterator iter(mTracks);
Track *n = iter.First();
Track *dest;
while (n) {
if (n->GetSelected()) {
@ -3966,14 +3964,13 @@ void AudacityProject::OnCopy()
n = iter.First();
while (n) {
if (n->GetSelected()) {
dest = NULL;
n->Copy(mViewInfo.selectedRegion.t0(),
mViewInfo.selectedRegion.t1(), &dest);
auto dest = n->Copy(mViewInfo.selectedRegion.t0(),
mViewInfo.selectedRegion.t1());
if (dest) {
dest->SetChannel(n->GetChannel());
dest->SetLinked(n->GetLinked());
dest->SetName(n->GetName());
msClipboard->Add(dest);
msClipboard->Add(dest.release());
}
}
n = iter.Next();
@ -4560,13 +4557,12 @@ void AudacityProject::OnDuplicate()
while (n) {
if (n->GetSelected()) {
Track *dest = NULL;
n->Copy(mViewInfo.selectedRegion.t0(),
mViewInfo.selectedRegion.t1(), &dest);
auto dest = n->Copy(mViewInfo.selectedRegion.t0(),
mViewInfo.selectedRegion.t1());
if (dest) {
dest->Init(*n);
dest->SetOffset(wxMax(mViewInfo.selectedRegion.t0(), n->GetOffset()));
mTracks->Add(dest);
mTracks->Add(dest.release());
}
}
@ -4820,22 +4816,23 @@ void AudacityProject::OnSplitNew()
for (Track *n = iter.First(); n; n = iter.Next()) {
if (n->GetSelected()) {
Track *dest = NULL;
Track::Holder dest;
double newt0 = 0, newt1 = 0;
double offset = n->GetOffset();
if (n->GetKind() == Track::Wave) {
const auto wt = static_cast<WaveTrack*>(n);
// Clips must be aligned to sample positions or the NEW clip will not fit in the gap where it came from
offset = ((WaveTrack*)n)->LongSamplesToTime(((WaveTrack*)n)->TimeToLongSamples(offset));
newt0 = ((WaveTrack*)n)->LongSamplesToTime(((WaveTrack*)n)->TimeToLongSamples(mViewInfo.selectedRegion.t0()));
newt1 = ((WaveTrack*)n)->LongSamplesToTime(((WaveTrack*)n)->TimeToLongSamples(mViewInfo.selectedRegion.t1()));
((WaveTrack*)n)->SplitCut(newt0, newt1, &dest);
offset = wt->LongSamplesToTime(wt->TimeToLongSamples(offset));
newt0 = wt->LongSamplesToTime(wt->TimeToLongSamples(mViewInfo.selectedRegion.t0()));
newt1 = wt->LongSamplesToTime(wt->TimeToLongSamples(mViewInfo.selectedRegion.t1()));
dest = wt->SplitCut(newt0, newt1);
}
#if 0
// LL: For now, just skip all non-wave tracks since the other do not
// yet support proper splitting.
else {
n->Cut(mViewInfo.selectedRegion.t0(),
mViewInfo.selectedRegion.t1(), &dest);
dest = n->Cut(mViewInfo.selectedRegion.t0(),
mViewInfo.selectedRegion.t1());
}
#endif
if (dest) {
@ -4843,7 +4840,7 @@ void AudacityProject::OnSplitNew()
dest->SetLinked(n->GetLinked());
dest->SetName(n->GetName());
dest->SetOffset(wxMax(newt0, offset));
mTracks->Add(dest);
mTracks->Add(dest.release());
}
}

View File

@ -443,15 +443,13 @@ int NoteTrack::GetVisibleChannels()
return mVisibleChannels;
}
bool NoteTrack::Cut(double t0, double t1, Track **dest){
//dest goes onto clipboard
*dest = NULL; // This is redundant
Track::Holder NoteTrack::Cut(double t0, double t1)
{
if (t1 <= t0)
return false;
return{};
double len = t1-t0;
NoteTrack *newTrack = new NoteTrack(mDirManager);
auto newTrack = std::make_unique<NoteTrack>(mDirManager);
newTrack->Init(*this);
@ -463,20 +461,16 @@ bool NoteTrack::Cut(double t0, double t1, Track **dest){
//(mBottomNote, mDirManager, mLastMidiPosition,
// mSerializationBuffer, mSerializationLength, mVisibleChannels)
*dest = newTrack;
return true;
return std::move(newTrack);
}
bool NoteTrack::Copy(double t0, double t1, Track **dest) const {
//dest goes onto clipboard
*dest = NULL; // This is redundant and matches WaveTrack::Copy
Track::Holder NoteTrack::Copy(double t0, double t1) const
{
if (t1 <= t0)
return false;
return{};
double len = t1-t0;
NoteTrack *newTrack = new NoteTrack(mDirManager);
auto newTrack = std::make_unique<NoteTrack>(mDirManager);
newTrack->Init(*this);
@ -488,9 +482,7 @@ bool NoteTrack::Copy(double t0, double t1, Track **dest) const {
//(mBottomNote, mDirManager, mLastMidiPosition,
// mSerializationBuffer, mSerializationLength, mVisibleChannels)
*dest = newTrack;
return true;
return std::move(newTrack);
}
bool NoteTrack::Trim(double t0, double t1)

View File

@ -90,8 +90,8 @@ class AUDACITY_DLL_API NoteTrack final : public Track {
// }
// High-level editing
bool Cut (double t0, double t1, Track **dest) override;
bool Copy (double t0, double t1, Track **dest) const override;
Track::Holder Cut (double t0, double t1) override;
Track::Holder Copy (double t0, double t1) const override;
bool Trim (double t0, double t1) /* not override */;
bool Clear(double t0, double t1) override;
bool Paste(double t, const Track *src) override;

View File

@ -4595,20 +4595,18 @@ void AudacityProject::EditClipboardByLabel( EditDestFunction action )
if( n->GetKind() == Track::Wave && ( allTracks || n->GetSelected() ) )
{
WaveTrack *wt = ( WaveTrack* )n;
WaveTrack *merged = NULL;
Track::Holder merged;
for( int i = ( int )regions.size() - 1; i >= 0; i-- )
{
Track *dest = NULL;
const Region &region = regions.at(i);
( wt->*action )( region.start, region.end,
&dest );
auto dest = ( wt->*action )( region.start, region.end );
if( dest )
{
dest->SetChannel( wt->GetChannel() );
dest->SetLinked( wt->GetLinked() );
dest->SetName( wt->GetName() );
if( !merged )
merged = ( WaveTrack* )dest;
merged = std::move(dest);
else
{
// Paste to the beginning; unless this is the first region,
@ -4617,10 +4615,9 @@ void AudacityProject::EditClipboardByLabel( EditDestFunction action )
merged->Offset(
regions.at(i + 1).start - region.end);
bool bResult = merged->Paste( 0.0 , dest );
bool bResult = merged->Paste( 0.0 , dest.get() );
wxASSERT(bResult); // TO DO: Actually handle this.
wxUnusedVar(bResult);
delete dest;
}
}
else // nothing copied but there is a 'region', so the 'region' must be a 'point label' so offset
@ -4630,7 +4627,7 @@ void AudacityProject::EditClipboardByLabel( EditDestFunction action )
regions.at(i + 1).start - region.end);
}
if( merged )
msClipboard->Add( merged );
msClipboard->Add( merged.release() );
}
}

View File

@ -31,6 +31,7 @@
#include "toolbars/SelectionBarListener.h"
#include "toolbars/SpectralSelectionBarListener.h"
#include "MemoryX.h"
#include <wx/defs.h>
#include <wx/event.h>
#include <wx/log.h>
@ -93,6 +94,8 @@ class LWSlider;
class UndoManager;
enum class UndoPush : unsigned char;
class Track;
AudacityProject *CreateNewAudacityProject();
AUDACITY_DLL_API AudacityProject *GetActiveProject();
void RedrawAllProjects();
@ -331,7 +334,7 @@ class AUDACITY_DLL_API AudacityProject final : public wxFrame,
typedef bool (WaveTrack::* EditFunction)(double, double);
typedef bool (WaveTrack::* EditDestFunction)(double, double, Track**);
typedef std::unique_ptr<Track> (WaveTrack::* EditDestFunction)(double, double);
void EditByLabel(EditFunction action, bool bSyncLockedTracks);
void EditClipboardByLabel(EditDestFunction action );

View File

@ -307,16 +307,12 @@ bool Track::SyncLockAdjust(double oldT1, double newT1)
if (oldT1 > GetEndTime())
return true;
Track *tmp;
bool ret;
auto tmp = Cut(oldT1, GetEndTime());
if (!tmp) return false;
ret = Cut(oldT1, GetEndTime(), &tmp);
if (!ret) return false;
bool ret = Paste(newT1, tmp.get());
wxASSERT(ret); // TODO: handle this.
ret = Paste(newT1, tmp);
wxASSERT(ret);
delete tmp;
return ret;
}
else if (newT1 < oldT1) {

View File

@ -202,9 +202,16 @@ class AUDACITY_DLL_API Track /* not final */ : public XMLTagHandler
// separate from the Track.
DirManager* GetDirManager() const { return mDirManager; }
virtual bool Cut (double WXUNUSED(t0), double WXUNUSED(t1), Track ** WXUNUSED(dest)) {return false;}
virtual bool Copy (double WXUNUSED(t0), double WXUNUSED(t1), Track ** WXUNUSED(dest)) const {return false;}
// Create a new track and modify this track (or return null for failure)
virtual Holder Cut(double WXUNUSED(t0), double WXUNUSED(t1)) { return{}; }
// Create a new track and don't modify this track (or return null for failure)
virtual Holder Copy(double WXUNUSED(t0), double WXUNUSED(t1)) const { return{}; }
// Return true for success
virtual bool Clear(double WXUNUSED(t0), double WXUNUSED(t1)) {return false;}
// Return true for success
virtual bool Paste(double WXUNUSED(t), const Track * WXUNUSED(src)) {return false;}
// This can be used to adjust a sync-lock selected track when the selection

View File

@ -531,38 +531,51 @@ bool WaveTrack::IsEmpty(double t0, double t1)
return true;
}
bool WaveTrack::Cut(double t0, double t1, Track **dest)
Track::Holder WaveTrack::Cut(double t0, double t1)
{
if (t1 < t0)
return false;
return{};
if (!Copy(t0, t1, dest))
return false;
auto tmp = Copy(t0, t1);
return Clear(t0, t1);
if (!tmp)
return{};
if (!Clear(t0, t1))
return{};
return std::move(tmp);
}
bool WaveTrack::SplitCut(double t0, double t1, Track **dest)
Track::Holder WaveTrack::SplitCut(double t0, double t1)
{
if (t1 < t0)
return false;
return{};
// SplitCut is the same as 'Copy', then 'SplitDelete'
if (!Copy(t0, t1, dest))
return false;
return SplitDelete(t0, t1);
auto tmp = Copy(t0, t1);
if (!tmp)
return{};
if (!SplitDelete(t0, t1))
return{};
return std::move(tmp);
}
#if 0
bool WaveTrack::CutAndAddCutLine(double t0, double t1, Track **dest)
Track::Holder WaveTrack::CutAndAddCutLine(double t0, double t1)
{
if (t1 < t0)
return false;
return {};
// Cut is the same as 'Copy', then 'Delete'
if (!Copy(t0, t1, dest))
return false;
return ClearAndAddCutLine(t0, t1);
auto tmp = Copy(t0, t1);
if (!tmp)
return {};
if (!ClearAndAddCutLine(t0, t1))
return {};
return std::move(tmp);
}
#endif
@ -625,14 +638,14 @@ bool WaveTrack::Trim (double t0, double t1)
bool WaveTrack::Copy(double t0, double t1, Track **dest) const
Track::Holder WaveTrack::Copy(double t0, double t1) const
{
*dest = NULL;
if (t1 <= t0)
return false;
return{};
WaveTrack *newTrack = new WaveTrack(mDirManager);
WaveTrack *newTrack;
Track::Holder result
{ newTrack = safenew WaveTrack{ mDirManager } };
newTrack->Init(*this);
@ -710,14 +723,12 @@ bool WaveTrack::Copy(double t0, double t1, Track **dest) const
}
}
*dest = newTrack;
return true;
return std::move(result);
}
bool WaveTrack::CopyNonconst(double t0, double t1, Track **dest)
Track::Holder WaveTrack::CopyNonconst(double t0, double t1)
{
return Copy(t0, t1, dest);
return Copy(t0, t1);
}
bool WaveTrack::Clear(double t0, double t1)
@ -1150,13 +1161,11 @@ bool WaveTrack::SyncLockAdjust(double oldT1, double newT1)
bool clipsCanMove = true;
gPrefs->Read(wxT("/GUI/EditClipCanMove"), &clipsCanMove);
if (clipsCanMove) {
Track *tmp = NULL;
ret = Cut (oldT1, GetEndTime() + 1.0/GetRate(), &tmp);
auto tmp = Cut (oldT1, GetEndTime() + 1.0/GetRate());
if (!ret) return false;
ret = Paste(newT1, tmp);
ret = Paste(newT1, tmp.get());
wxASSERT(ret);
delete tmp;
}
return ret;
@ -1240,12 +1249,10 @@ bool WaveTrack::Paste(double t0, const Track *src)
// We need to insert multiple clips, so split the current clip and
// move everything to the right, then try to paste again
if (!IsEmpty(t0, GetEndTime())) {
Track *tmp = NULL;
Cut(t0, GetEndTime()+1.0/mRate, &tmp);
bool bResult = Paste(t0 + insertDuration, tmp);
auto tmp = Cut(t0, GetEndTime()+1.0/mRate);
bool bResult = Paste(t0 + insertDuration, tmp.get());
wxASSERT(bResult); // TO DO: Actually handle this.
wxUnusedVar(bResult);
delete tmp;
}
} else
{

View File

@ -156,9 +156,9 @@ class AUDACITY_DLL_API WaveTrack final : public Track {
// High-level editing
//
bool Cut(double t0, double t1, Track **dest) override;
bool Copy(double t0, double t1, Track **dest) const override;
bool CopyNonconst(double t0, double t1, Track **dest) /* not override */;
Track::Holder Cut(double t0, double t1) override;
Track::Holder Copy(double t0, double t1) const override;
Track::Holder CopyNonconst(double t0, double t1) /* not override */;
bool Clear(double t0, double t1) override;
bool Paste(double t0, const Track *src) override;
bool ClearAndPaste(double t0, double t1,
@ -172,10 +172,10 @@ class AUDACITY_DLL_API WaveTrack final : public Track {
bool SplitAt(double t) /* not override */;
bool Split(double t0, double t1) /* not override */;
// bool CutAndAddCutLine(double t0, double t1, Track **dest) /* not override */;
// Track::Holder CutAndAddCutLine(double t0, double t1) /* not override */;
bool ClearAndAddCutLine(double t0, double t1) /* not override */;
bool SplitCut(double t0, double t1, Track **dest) /* not override */;
Track::Holder SplitCut(double t0, double t1) /* not override */;
bool SplitDelete(double t0, double t1) /* not override */;
bool Join(double t0, double t1) /* not override */;
bool Disjoin(double t0, double t1) /* not override */;

View File

@ -2160,12 +2160,10 @@ Effect::ModifiedAnalysisTrack::ModifiedAnalysisTrack
: mpEffect(pEffect)
, mpOrigTrack(pOrigTrack)
{
Track *newTrack{};
// copy LabelTrack here, so it can be undone on cancel
pOrigTrack->Copy(pOrigTrack->GetStartTime(), pOrigTrack->GetEndTime(), &newTrack);
auto newTrack = pOrigTrack->Copy(pOrigTrack->GetStartTime(), pOrigTrack->GetEndTime());
mpTrack = static_cast<LabelTrack*>(newTrack);
mpTrack = static_cast<LabelTrack*>(newTrack.get());
// Why doesn't LabelTrack::Copy complete the job? :
mpTrack->SetOffset(pOrigTrack->GetStartTime());
@ -2174,7 +2172,7 @@ Effect::ModifiedAnalysisTrack::ModifiedAnalysisTrack
// mpOrigTrack came from mTracks which we own but expose as const to subclasses
// So it's okay that we cast it back to const
pEffect->mTracks->Replace(const_cast<LabelTrack*>(mpOrigTrack), mpTrack, false);
pEffect->mTracks->Replace(const_cast<LabelTrack*>(mpOrigTrack), newTrack.release(), false);
}
Effect::ModifiedAnalysisTrack::ModifiedAnalysisTrack(ModifiedAnalysisTrack &&that)
@ -2595,13 +2593,12 @@ void Effect::Preview(bool dryOnly)
WaveTrack *src = (WaveTrack *) iter.First();
while (src)
{
WaveTrack *dest;
if (src->GetSelected() || mPreviewWithNotSelected) {
src->Copy(mT0, t1, (Track **) &dest);
auto dest = src->Copy(mT0, t1);
dest->InsertSilence(0.0, mT0);
dest->SetSelected(src->GetSelected());
dest->SetDisplay(WaveTrack::NoDisplay);
mTracks->Add(dest);
static_cast<WaveTrack*>(dest.get())->SetDisplay(WaveTrack::NoDisplay);
mTracks->Add(dest.release());
}
src = (WaveTrack *) iter.Next();
}

View File

@ -1208,14 +1208,13 @@ bool EffectEqualization::ProcessOne(int count, WaveTrack * t,
//now go thru and replace the old clips with NEW
for(unsigned int i=0;i<clipStartEndTimes.size();i++)
{
Track *toClipOutput;
//remove the old audio and get the NEW
t->Clear(clipStartEndTimes[i].first,clipStartEndTimes[i].second);
output->Copy(clipStartEndTimes[i].first-startT+offsetT0,clipStartEndTimes[i].second-startT+offsetT0, &toClipOutput);
auto toClipOutput = output->Copy(clipStartEndTimes[i].first-startT+offsetT0,clipStartEndTimes[i].second-startT+offsetT0);
if(toClipOutput)
{
//put the processed audio in
bool bResult = t->Paste(clipStartEndTimes[i].first, toClipOutput);
bool bResult = t->Paste(clipStartEndTimes[i].first, toClipOutput.get());
wxASSERT(bResult); // TO DO: Actually handle this.
wxUnusedVar(bResult);
//if the clip was only partially selected, the Paste will have created a split line. Join is needed to take care of this
@ -1225,7 +1224,6 @@ bool EffectEqualization::ProcessOne(int count, WaveTrack * t,
!(clipRealStartEndTimes[i].first <= startT &&
clipRealStartEndTimes[i].second >= startT+lenT) )
t->Join(clipRealStartEndTimes[i].first,clipRealStartEndTimes[i].second);
delete toClipOutput;
}
}
}

View File

@ -136,11 +136,10 @@ bool EffectRepeat::Process()
continue;
}
Track *dest;
track->Copy(mT0, mT1, &dest);
auto dest = track->Copy(mT0, mT1);
for(int j=0; j<repeatCount; j++)
{
if (!track->Paste(tc, dest) ||
if (!track->Paste(tc, dest.get()) ||
TrackProgress(nTrack, j / repeatCount)) // TrackProgress returns true on Cancel.
{
bGoodResult = false;
@ -150,7 +149,6 @@ bool EffectRepeat::Process()
}
if (tc > maxDestLen)
maxDestLen = tc;
delete dest;
nTrack++;
}
else if (t->IsSyncLockSelected())