Track cut and copy functions return a unique_ptr argument...
... Because they are factory functions.
This commit is contained in:
parent
5ef4dd46a5
commit
3015a9c8d9
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 ®ion = 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() );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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) {
|
||||
|
|
11
src/Track.h
11
src/Track.h
|
@ -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
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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 */;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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())
|
||||
|
|
Loading…
Reference in New Issue