1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-05-05 22:28:57 +02:00

Partial range copy of Envelope will not leave coincident points

This commit is contained in:
Paul Licameli 2017-05-07 12:20:53 -04:00
parent f5a7e4ce7c
commit 945e411e2c
2 changed files with 18 additions and 4 deletions

View File

@ -174,10 +174,23 @@ void Envelope::SetRange(double minValue, double maxValue) {
mEnv[i].SetVal( this, mEnv[i].GetVal() ); // this clamps the value to the NEW range
}
EnvPoint *Envelope::AddPointAtEnd( double t, double val )
// This is used only during construction of an Envelope by complete or partial
// copy of another.
void Envelope::AddPointAtEnd( double t, double val )
{
mEnv.push_back( EnvPoint{ t, val } );
return &mEnv.back();
// Assume copied points were stored by nondecreasing time.
// Allow no more than two points at exactly the same time.
// Maybe that happened, because extra points were inserted at the boundary
// of the copied range, which were not in the source envelope.
auto nn = mEnv.size() - 1;
while ( nn >= 2 && mEnv[ nn - 2 ].GetT() == t ) {
// Of three or more points at the same time, erase one in the middle,
// not the one newly added.
mEnv.erase( mEnv.begin() + nn - 1 );
--nn;
}
}
Envelope::Envelope(const Envelope &orig, double t0, double t1)
@ -342,7 +355,8 @@ XMLTagHandler *Envelope::HandleXMLChild(const wxChar *tag)
if (wxStrcmp(tag, wxT("controlpoint")))
return NULL;
return AddPointAtEnd(0,0);
mEnv.push_back( EnvPoint{} );
return &mEnv.back();
}
void Envelope::WriteXML(XMLWriter &xmlFile) const

View File

@ -215,7 +215,7 @@ private:
void MoveDragPoint(double newWhen, double value);
// May delete the drag point. Restores envelope consistency.
void ClearDragPoint();
EnvPoint * AddPointAtEnd( double t, double val );
void AddPointAtEnd( double t, double val );
void CopyRange(const Envelope &orig, size_t begin, size_t end);
// relative time
void BinarySearchForTime( int &Lo, int &Hi, double t ) const;