From 5cf331ae8c8a27d4d5c891d912671b6446059998 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Sat, 20 Aug 2016 17:56:41 -0400 Subject: [PATCH] Rewrite WaveTrack::GetEnvelopeValues, taking one less argument... ... In practice this argument was always 1 / rate so it was superfluous. Also make the buffer size argument unsigned. --- src/Mix.cpp | 12 ++++++------ src/WaveTrack.cpp | 28 +++++++++++++--------------- src/WaveTrack.h | 4 ++-- 3 files changed, 21 insertions(+), 23 deletions(-) diff --git a/src/Mix.cpp b/src/Mix.cpp index 329afc81d..638808b16 100644 --- a/src/Mix.cpp +++ b/src/Mix.cpp @@ -460,8 +460,7 @@ sampleCount Mixer::MixVariableRates(int *channelFlags, WaveTrackCache &cache, track->GetEnvelopeValues(mEnvValues, getLen, - (*pos - (getLen- 1)) / trackRate, - tstep); + (*pos - (getLen- 1)) / trackRate); *pos -= getLen; } @@ -471,8 +470,7 @@ sampleCount Mixer::MixVariableRates(int *channelFlags, WaveTrackCache &cache, track->GetEnvelopeValues(mEnvValues, getLen, - (*pos) / trackRate, - tstep); + (*pos) / trackRate); *pos += getLen; } @@ -584,10 +582,12 @@ sampleCount Mixer::MixSameRate(int *channelFlags, WaveTrackCache &cache, if (slen > mMaxOut) slen = mMaxOut; + wxASSERT(slen >= 0); + if (backwards) { auto results = cache.Get(floatSample, *pos - (slen - 1), slen); memcpy(mFloatBuffer, results, sizeof(float) * slen); - track->GetEnvelopeValues(mEnvValues, slen, t - (slen - 1) / mRate, 1.0 / mRate); + track->GetEnvelopeValues(mEnvValues, slen, t - (slen - 1) / mRate); for(int i=0; iGetEnvelopeValues(mEnvValues, slen, t, 1.0 / mRate); + track->GetEnvelopeValues(mEnvValues, slen, t); for(int i=0; iGetStartTime(); - double dClipEndTime = clip->GetEndTime(); + auto dClipStartTime = clip->GetStartTime(); + auto dClipEndTime = clip->GetEndTime(); if ((dClipStartTime < endTime) && (dClipEndTime > startTime)) { - double* rbuf = buffer; - int rlen = bufferLen; - double rt0 = t0; + auto rbuf = buffer; + auto rlen = bufferLen; + auto rt0 = t0; if (rt0 < dClipStartTime) { sampleCount nDiff = (sampleCount)floor((dClipStartTime - rt0) * mRate + 0.5); rbuf += nDiff; + wxASSERT(nDiff <= rlen); rlen -= nDiff; rt0 = dClipStartTime; } if (rt0 + rlen*tstep > dClipEndTime) { - int nClipLen = clip->GetEndSample() - clip->GetStartSample(); + auto nClipLen = clip->GetEndSample() - clip->GetStartSample(); if (nClipLen <= 0) // Testing for bug 641, this problem is consistently '== 0', but doesn't hurt to check <. return; @@ -2151,8 +2149,8 @@ void WaveTrack::GetEnvelopeValues(double *buffer, int bufferLen, // This conditional prevents the previous write past the buffer end, in clip->GetEnvelope() call. // Never increase rlen here. // PRL bug 827: rewrote it again - rlen = std::min(rlen, nClipLen); - rlen = std::min(rlen, int(floor(0.5 + (dClipEndTime - rt0) / tstep))); + rlen = static_cast( std::min(sampleCount( rlen ), nClipLen) ); + rlen = std::min(rlen, size_t(floor(0.5 + (dClipEndTime - rt0) / tstep))); } clip->GetEnvelope()->GetValues(rbuf, rlen, rt0, tstep); } diff --git a/src/WaveTrack.h b/src/WaveTrack.h index ad35eaa98..88ff55adf 100644 --- a/src/WaveTrack.h +++ b/src/WaveTrack.h @@ -239,8 +239,8 @@ class AUDACITY_DLL_API WaveTrack final : public Track { sampleCount start, sampleCount len, fillFormat fill=fillZero) const; bool Set(samplePtr buffer, sampleFormat format, sampleCount start, sampleCount len); - void GetEnvelopeValues(double *buffer, int bufferLen, - double t0, double tstep) const; + void GetEnvelopeValues(double *buffer, size_t bufferLen, + double t0) const; bool GetMinMax(float *min, float *max, double t0, double t1) const; bool GetRMS(float *rms, double t0, double t1);