1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-16 08:09:32 +02:00

Bug 2754 - Change Tempo & Pitch and Sliding Stretch with selected audio in negative time crash Audacity on windows (error on Mac)

This commit is contained in:
James Crook 2021-05-15 11:35:39 +01:00
parent cf666c9bfc
commit d0ff48f3bd
4 changed files with 22 additions and 16 deletions

View File

@ -994,6 +994,9 @@ bool WaveTrack::AddClip(const std::shared_ptr<WaveClip> &clip)
void WaveTrack::HandleClear(double t0, double t1, void WaveTrack::HandleClear(double t0, double t1,
bool addCutLines, bool split) bool addCutLines, bool split)
{ {
// For debugging, use an ASSERT so that we stop
// closer to the problem.
wxASSERT( t1 >= t0 );
if (t1 < t0) if (t1 < t0)
THROW_INCONSISTENCY_EXCEPTION; THROW_INCONSISTENCY_EXCEPTION;

View File

@ -555,7 +555,7 @@ bool EffectChangeSpeed::ProcessOne(WaveTrack * track,
// Silenced samples will be inserted in gaps between clips, so capture where these // Silenced samples will be inserted in gaps between clips, so capture where these
// gaps are for later deletion // gaps are for later deletion
std::vector<std::pair<double, double>> gaps; std::vector<std::pair<double, double>> gaps;
double last = 0.0; double last = mCurT0;
auto clips = track->SortedClipArray(); auto clips = track->SortedClipArray();
auto front = clips.front(); auto front = clips.front();
auto back = clips.back(); auto back = clips.back();
@ -567,12 +567,13 @@ bool EffectChangeSpeed::ProcessOne(WaveTrack * track,
if (mCurT0 < st && clip == front) { if (mCurT0 < st && clip == front) {
gaps.push_back(std::make_pair(mCurT0, st)); gaps.push_back(std::make_pair(mCurT0, st));
} }
if (mCurT1 > et && clip == back) { else if (last < st && mCurT0 <= last ) {
gaps.push_back(std::make_pair(et, mCurT1));
}
if (last >= mCurT0) {
gaps.push_back(std::make_pair(last, st)); gaps.push_back(std::make_pair(last, st));
} }
if (et < mCurT1 && clip == back) {
gaps.push_back(std::make_pair(et, mCurT1));
}
} }
last = et; last = et;
} }

View File

@ -432,7 +432,7 @@ void EffectSBSMS::Finalize(WaveTrack* orig, WaveTrack* out, const TimeWarper *wa
// Silenced samples will be inserted in gaps between clips, so capture where these // Silenced samples will be inserted in gaps between clips, so capture where these
// gaps are for later deletion // gaps are for later deletion
std::vector<std::pair<double, double>> gaps; std::vector<std::pair<double, double>> gaps;
double last = 0.0; double last = mCurT0;
auto clips = orig->SortedClipArray(); auto clips = orig->SortedClipArray();
auto front = clips.front(); auto front = clips.front();
auto back = clips.back(); auto back = clips.back();
@ -444,12 +444,13 @@ void EffectSBSMS::Finalize(WaveTrack* orig, WaveTrack* out, const TimeWarper *wa
if (mCurT0 < st && clip == front) { if (mCurT0 < st && clip == front) {
gaps.push_back(std::make_pair(mCurT0, st)); gaps.push_back(std::make_pair(mCurT0, st));
} }
if (mCurT1 > et && clip == back) { else if (last < st && mCurT0 <= last ) {
gaps.push_back(std::make_pair(et, mCurT1));
}
if (last >= mCurT0) {
gaps.push_back(std::make_pair(last, st)); gaps.push_back(std::make_pair(last, st));
} }
if (et < mCurT1 && clip == back) {
gaps.push_back(std::make_pair(et, mCurT1));
}
} }
last = et; last = et;
} }

View File

@ -403,7 +403,7 @@ void EffectSoundTouch::Finalize(WaveTrack* orig, WaveTrack* out, const TimeWarpe
// Silenced samples will be inserted in gaps between clips, so capture where these // Silenced samples will be inserted in gaps between clips, so capture where these
// gaps are for later deletion // gaps are for later deletion
std::vector<std::pair<double, double>> gaps; std::vector<std::pair<double, double>> gaps;
double last = 0.0; double last = mCurT0;
auto clips = orig->SortedClipArray(); auto clips = orig->SortedClipArray();
auto front = clips.front(); auto front = clips.front();
auto back = clips.back(); auto back = clips.back();
@ -415,12 +415,13 @@ void EffectSoundTouch::Finalize(WaveTrack* orig, WaveTrack* out, const TimeWarpe
if (mCurT0 < st && clip == front) { if (mCurT0 < st && clip == front) {
gaps.push_back(std::make_pair(mCurT0, st)); gaps.push_back(std::make_pair(mCurT0, st));
} }
if (mCurT1 > et && clip == back) { else if (last < st && mCurT0 <= last ) {
gaps.push_back(std::make_pair(et, mCurT1));
}
if (last >= mCurT0) {
gaps.push_back(std::make_pair(last, st)); gaps.push_back(std::make_pair(last, st));
} }
if (et < mCurT1 && clip == back) {
gaps.push_back(std::make_pair(et, mCurT1));
}
} }
last = et; last = et;
} }