From 6749d5b6fab13a7aa0df0fc782410a8c278399b4 Mon Sep 17 00:00:00 2001 From: Leland Lucius Date: Fri, 18 Sep 2020 09:24:45 -0500 Subject: [PATCH] Bug 1215 - Incorrect splits produced by Change Tempo with leading whitespace --- src/effects/SBSMSEffect.cpp | 46 +++++++++++++++++++++++++++++++++---- src/effects/SBSMSEffect.h | 2 ++ 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/effects/SBSMSEffect.cpp b/src/effects/SBSMSEffect.cpp index 600b22707..07b9e17d7 100644 --- a/src/effects/SBSMSEffect.cpp +++ b/src/effects/SBSMSEffect.cpp @@ -19,6 +19,7 @@ effect that uses SBSMS to do its processing (TimeScale) #include #include "../LabelTrack.h" +#include "../WaveClip.h" #include "../WaveTrack.h" #include "TimeWarper.h" @@ -426,12 +427,9 @@ bool EffectSBSMS::Process() if(rightTrack) rb.outputRightTrack->Flush(); - leftTrack->ClearAndPaste(mCurT0, mCurT1, rb.outputLeftTrack.get(), - true, false, warper.get()); - + Finalize(leftTrack, rb.outputLeftTrack.get(), warper.get()); if(rightTrack) - rightTrack->ClearAndPaste(mCurT0, mCurT1, rb.outputRightTrack.get(), - true, false, warper.get()); + Finalize(rightTrack, rb.outputRightTrack.get(), warper.get()); } mCurTrackNum++; }, @@ -454,4 +452,42 @@ bool EffectSBSMS::Process() return bGoodResult; } +void EffectSBSMS::Finalize(WaveTrack* orig, WaveTrack* out, const TimeWarper *warper) +{ + // Silenced samples will be inserted in gaps between clips, so capture where these + // gaps are for later deletion + std::vector> gaps; + double last = 0.0; + auto clips = orig->SortedClipArray(); + auto front = clips.front(); + auto back = clips.back(); + for (auto &clip : clips) { + auto st = clip->GetStartTime(); + auto et = clip->GetEndTime(); + + if (st >= mCurT0 || et < mCurT1) { + if (mCurT0 < st && clip == front) { + gaps.push_back(std::make_pair(mCurT0, st)); + } + if (mCurT1 > et && clip == back) { + gaps.push_back(std::make_pair(et, mCurT1)); + } + if (last >= mCurT0) { + gaps.push_back(std::make_pair(last, st)); + } + } + last = et; + } + + // Take the output track and insert it in place of the original sample data + orig->ClearAndPaste(mCurT0, mCurT1, out, true, true, warper); + + // Finally, recreate the gaps + for (auto gap : gaps) { + auto st = orig->LongSamplesToTime(orig->TimeToLongSamples(gap.first)); + auto et = orig->LongSamplesToTime(orig->TimeToLongSamples(gap.second)); + orig->SplitDelete(warper->Warp(st), warper->Warp(et)); + } +} + #endif diff --git a/src/effects/SBSMSEffect.h b/src/effects/SBSMSEffect.h index 784818dfb..dc8f0f22f 100644 --- a/src/effects/SBSMSEffect.h +++ b/src/effects/SBSMSEffect.h @@ -45,6 +45,8 @@ protected: private: bool ProcessLabelTrack(LabelTrack *track); + void Finalize(WaveTrack* orig, WaveTrack* out, const TimeWarper *warper); + double rateStart, rateEnd, pitchStart, pitchEnd; bool bLinkRatePitch, bRateReferenceInput, bPitchReferenceInput; SlideType rateSlideType;