From 3605d73d1233ff044cbe1897f73e2d3d71afcb3b Mon Sep 17 00:00:00 2001 From: Leland Lucius Date: Fri, 18 Sep 2020 09:00:50 -0500 Subject: [PATCH] Bug 2534 - Change Speed merges selected clip with adjacent clips --- src/effects/ChangeSpeed.cpp | 38 +++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/src/effects/ChangeSpeed.cpp b/src/effects/ChangeSpeed.cpp index 1833b6cae..7df513d5b 100644 --- a/src/effects/ChangeSpeed.cpp +++ b/src/effects/ChangeSpeed.cpp @@ -32,6 +32,7 @@ #include "../widgets/valnum.h" #include "TimeWarper.h" +#include "../WaveClip.h" #include "../WaveTrack.h" enum @@ -551,9 +552,42 @@ bool EffectChangeSpeed::ProcessOne(WaveTrack * track, double newLength = outputTrack->GetEndTime(); if (bResult) { + // 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 = track->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; + } + LinearTimeWarper warper { mCurT0, mCurT0, mCurT1, mCurT0 + newLength }; - track->ClearAndPaste( - mCurT0, mCurT1, outputTrack.get(), true, false, &warper); + + // Take the output track and insert it in place of the original sample data + track->ClearAndPaste(mCurT0, mCurT1, outputTrack.get(), true, true, &warper); + + // Finally, recreate the gaps + for (auto gap : gaps) { + auto st = track->LongSamplesToTime(track->TimeToLongSamples(gap.first)); + auto et = track->LongSamplesToTime(track->TimeToLongSamples(gap.second)); + track->SplitDelete(warper.Warp(st), warper.Warp(et)); + } } if (newLength > mMaxNewLength)