mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-25 08:38:39 +02:00
More envelope fixes, avoiding some unnecessary insertions of points
This commit is contained in:
commit
181c137129
@ -701,7 +701,7 @@ void Envelope::Paste(double t0, const Envelope *e)
|
|||||||
unsigned int len = mEnv.size();
|
unsigned int len = mEnv.size();
|
||||||
|
|
||||||
// get values to perform framing of the insertion
|
// get values to perform framing of the insertion
|
||||||
double splitval = GetValue(t0 + mOffset);
|
const double splitval = GetValueRelative( t0 );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Old analysis of cases:
|
Old analysis of cases:
|
||||||
@ -852,8 +852,8 @@ Old analysis of cases:
|
|||||||
// Add end points in case they are not not in e.
|
// Add end points in case they are not not in e.
|
||||||
// If they are in e, no harm, because the repeated Insert
|
// If they are in e, no harm, because the repeated Insert
|
||||||
// calls for the start and end times will have no effect.
|
// calls for the start and end times will have no effect.
|
||||||
const double leftval = e->GetValue(0 + e->mOffset);
|
const double leftval = e->GetValueRelative( 0 );
|
||||||
const double rightval = e->GetValue(e->mTrackLen + e->mOffset);
|
const double rightval = e->GetValueRelative( e->mTrackLen );
|
||||||
InsertOrReplaceRelative(t0, leftval);
|
InsertOrReplaceRelative(t0, leftval);
|
||||||
InsertOrReplaceRelative(t0 + e->mTrackLen, rightval);
|
InsertOrReplaceRelative(t0 + e->mTrackLen, rightval);
|
||||||
}
|
}
|
||||||
@ -983,6 +983,13 @@ void Envelope::GetPoints(double *bufferWhen,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Envelope::Cap( double sampleTime )
|
||||||
|
{
|
||||||
|
auto range = EqualRange( mTrackLen, sampleTime );
|
||||||
|
if ( range.first == range.second )
|
||||||
|
InsertOrReplaceRelative( mTrackLen, GetValueRelative( mTrackLen ) );
|
||||||
|
}
|
||||||
|
|
||||||
// Private methods
|
// Private methods
|
||||||
|
|
||||||
// We no longer tolerate multiple envelope control points at the exact
|
// We no longer tolerate multiple envelope control points at the exact
|
||||||
@ -1083,17 +1090,21 @@ void Envelope::SetOffset(double newOffset)
|
|||||||
mOffset = newOffset;
|
mOffset = newOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Envelope::SetTrackLen(double trackLen)
|
void Envelope::SetTrackLen( double trackLen, double sampleTime )
|
||||||
// NOFAIL-GUARANTEE
|
// NOFAIL-GUARANTEE
|
||||||
{
|
{
|
||||||
// Preserve the right-side limit at trackLen.
|
// Preserve the left-side limit at trackLen.
|
||||||
bool needPoint = ( trackLen < mTrackLen );
|
auto range = EqualRange( trackLen, sampleTime );
|
||||||
|
bool needPoint = ( range.first == range.second && trackLen < mTrackLen );
|
||||||
double value;
|
double value;
|
||||||
if ( needPoint )
|
if ( needPoint )
|
||||||
value = GetValueRelative( trackLen );
|
value = GetValueRelative( trackLen );
|
||||||
|
|
||||||
mTrackLen = trackLen;
|
mTrackLen = trackLen;
|
||||||
int newLen = EqualRange( trackLen, 0 ).second;
|
|
||||||
|
// Shrink the array.
|
||||||
|
// If more than one point already at the end, keep only the first of them.
|
||||||
|
int newLen = std::min( 1 + range.first, range.second );
|
||||||
mEnv.resize( newLen );
|
mEnv.resize( newLen );
|
||||||
|
|
||||||
if ( needPoint )
|
if ( needPoint )
|
||||||
|
@ -128,7 +128,7 @@ public:
|
|||||||
|
|
||||||
// Control
|
// Control
|
||||||
void SetOffset(double newOffset);
|
void SetOffset(double newOffset);
|
||||||
void SetTrackLen(double trackLen);
|
void SetTrackLen( double trackLen, double sampleTime = 0.0 );
|
||||||
void RescaleValues(double minValue, double maxValue);
|
void RescaleValues(double minValue, double maxValue);
|
||||||
void RescaleTimes( double newLength );
|
void RescaleTimes( double newLength );
|
||||||
|
|
||||||
@ -147,6 +147,9 @@ public:
|
|||||||
void GetValues
|
void GetValues
|
||||||
(double *buffer, int bufferLen, int leftOffset, const ZoomInfo &zoomInfo) const;
|
(double *buffer, int bufferLen, int leftOffset, const ZoomInfo &zoomInfo) const;
|
||||||
|
|
||||||
|
// Guarantee an envelope point at the end of the domain.
|
||||||
|
void Cap( double sampleTime );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
double GetValueRelative(double t) const;
|
double GetValueRelative(double t) const;
|
||||||
void GetValuesRelative
|
void GetValuesRelative
|
||||||
|
@ -1345,7 +1345,8 @@ void WaveClip::ConvertToSampleFormat(sampleFormat format)
|
|||||||
void WaveClip::UpdateEnvelopeTrackLen()
|
void WaveClip::UpdateEnvelopeTrackLen()
|
||||||
// NOFAIL-GUARANTEE
|
// NOFAIL-GUARANTEE
|
||||||
{
|
{
|
||||||
mEnvelope->SetTrackLen((mSequence->GetNumSamples().as_double()) / mRate);
|
mEnvelope->SetTrackLen
|
||||||
|
((mSequence->GetNumSamples().as_double()) / mRate, 1.0 / GetRate());
|
||||||
}
|
}
|
||||||
|
|
||||||
void WaveClip::TimeToSamplesClip(double t0, sampleCount *s0) const
|
void WaveClip::TimeToSamplesClip(double t0, sampleCount *s0) const
|
||||||
@ -1626,12 +1627,11 @@ void WaveClip::InsertSilence( double t, double len, double *pEnvelopeValue )
|
|||||||
|
|
||||||
// Preserve limit value at the end
|
// Preserve limit value at the end
|
||||||
auto oldLen = pEnvelope->GetTrackLen();
|
auto oldLen = pEnvelope->GetTrackLen();
|
||||||
auto oldT = pEnvelope->GetOffset() + oldLen;
|
|
||||||
auto newLen = oldLen + len;
|
auto newLen = oldLen + len;
|
||||||
pEnvelope->InsertOrReplace( oldT, pEnvelope->GetValue( oldT ) );
|
pEnvelope->Cap( sampleTime );
|
||||||
|
|
||||||
// Ramp across the silence to the given value
|
// Ramp across the silence to the given value
|
||||||
pEnvelope->SetTrackLen( newLen );
|
pEnvelope->SetTrackLen( newLen, sampleTime );
|
||||||
pEnvelope->InsertOrReplace
|
pEnvelope->InsertOrReplace
|
||||||
( pEnvelope->GetOffset() + newLen, *pEnvelopeValue );
|
( pEnvelope->GetOffset() + newLen, *pEnvelopeValue );
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user