1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-11-08 14:13:57 +01:00

Fix for bug 955 from Clayton Otey

This commit is contained in:
Steve Daulton
2016-01-26 18:19:19 +00:00
parent f7fba31319
commit 954bb0fd1c
8 changed files with 146 additions and 12 deletions

View File

@@ -200,6 +200,18 @@ bool EffectSBSMS::ProcessLabelTrack(Track *t)
return true;
}
double EffectSBSMS::getInvertedStretchedTime(double rateStart, double rateEnd, SlideType slideType, double outputTime)
{
Slide slide(slideType,rateStart,rateEnd,0);
return slide.getInverseStretchedTime(outputTime);
}
double EffectSBSMS::getRate(double rateStart, double rateEnd, SlideType slideType, double t)
{
Slide slide(slideType,rateStart,rateEnd,0);
return slide.getRate(t);
}
bool EffectSBSMS::Process()
{
bool bGoodResult = true;
@@ -307,6 +319,8 @@ bool EffectSBSMS::Process()
bPitchReferenceInput,
samplesToProcess,0,
NULL);
} else {
rb.bPitch = false;
outSlideType = (srProcess==srTrack?SlideIdentity:SlideConstant);
@@ -330,7 +344,7 @@ bool EffectSBSMS::Process()
samplesToProcess,processPresamples,
rb.quality);
}
Resampler resampler(outResampleCB,&rb,outSlideType);
audio outBuf[SBSMSOutBlockSize];

View File

@@ -28,7 +28,8 @@ public:
void setParameters(double rateStart, double rateEnd, double pitchStart, double pitchEnd,
SlideType rateSlideType, SlideType pitchSlideType,
bool bLinkRatePitch, bool bRateReferenceInput, bool bPitchReferenceInput);
static double getInvertedStretchedTime(double rateStart, double rateEnd, SlideType slideType, double outputTime);
static double getRate(double rateStart, double rateEnd, SlideType slideType, double t);
private:
bool ProcessLabelTrack(Track *track);
double rateStart, rateEnd, pitchStart, pitchEnd;

View File

@@ -72,6 +72,11 @@ EffectTimeScale::EffectTimeScale()
m_PitchPercentChangeStart = DEF_PitchPercentStart;
m_PitchPercentChangeEnd = DEF_PitchPercentEnd;
slideTypeRate = SlideLinearOutputRate;
slideTypePitch = SlideLinearOutputRate;
bPreview = false;
previewSelectedDuration = 0.0;
SetLinearEffectFlag(true);
}
@@ -143,13 +148,42 @@ bool EffectTimeScale::Init()
return true;
}
double EffectTimeScale::CalcPreviewInputLength(double previewLength)
{
double inputLength = Effect::GetDuration();
if(inputLength == 0.0) {
return 0.0;
} else {
double rateStart = PercentChangeToRatio(m_RatePercentChangeStart);
double rateEnd = PercentChangeToRatio(m_RatePercentChangeEnd);
double tOut = previewLength/inputLength;
double t = EffectSBSMS::getInvertedStretchedTime(rateStart,rateEnd,slideTypeRate,tOut);
return t * inputLength;
}
}
void EffectTimeScale::Preview(bool dryOnly)
{
previewSelectedDuration = Effect::GetDuration();
bPreview = true;
Effect::Preview(dryOnly);
bPreview = false;
}
bool EffectTimeScale::Process()
{
double pitchStart = PercentChangeToRatio(m_PitchPercentChangeStart);
double pitchEnd = PercentChangeToRatio(m_PitchPercentChangeEnd);
double rateStart = PercentChangeToRatio(m_RatePercentChangeStart);
double rateEnd = PercentChangeToRatio(m_RatePercentChangeEnd);
EffectSBSMS::setParameters(rateStart,rateEnd,pitchStart,pitchEnd,SlideLinearOutputRate,SlideLinearOutputRate,false,false,false);
if(bPreview) {
double t = (mT1-mT0) / previewSelectedDuration;
rateEnd = EffectSBSMS::getRate(rateStart,rateEnd,slideTypeRate,t);
pitchEnd = EffectSBSMS::getRate(pitchStart,pitchEnd,slideTypePitch,t);
}
EffectSBSMS::setParameters(rateStart,rateEnd,pitchStart,pitchEnd,slideTypeRate,slideTypePitch,false,false,false);
return EffectSBSMS::Process();
}

View File

@@ -50,10 +50,12 @@ public:
// Effect implementation
virtual bool Init();
virtual void Preview(bool dryOnly);
virtual bool Process();
virtual void PopulateOrExchange(ShuttleGui & S);
virtual bool TransferDataToWindow();
virtual bool TransferDataFromWindow();
virtual double CalcPreviewInputLength(double previewLength);
private:
// EffectTimeScale implementation
@@ -82,6 +84,10 @@ private:
void Update_Slider_RatePercentChangeEnd();
private:
bool bPreview;
double previewSelectedDuration;
SlideType slideTypeRate;
SlideType slideTypePitch;
double m_RatePercentChangeStart;
double m_RatePercentChangeEnd;
double m_PitchHalfStepsStart;