mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-23 15:50:05 +02:00
Sequence::SetSamples, ::SetSilence give strong guarantee
This commit is contained in:
parent
73e61592aa
commit
06f6953c91
@ -634,9 +634,10 @@ void Sequence::Paste(sampleCount s, const Sequence *src)
|
|||||||
(newBlock, mNumSamples + addedLen, wxT("Paste branch three"));
|
(newBlock, mNumSamples + addedLen, wxT("Paste branch three"));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Sequence::SetSilence(sampleCount s0, sampleCount len)
|
void Sequence::SetSilence(sampleCount s0, sampleCount len)
|
||||||
|
// STRONG-GUARANTEE
|
||||||
{
|
{
|
||||||
return Set(NULL, mSampleFormat, s0, len);
|
SetSamples(NULL, mSampleFormat, s0, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sequence::InsertSilence(sampleCount s0, sampleCount len)
|
void Sequence::InsertSilence(sampleCount s0, sampleCount len)
|
||||||
@ -1169,12 +1170,14 @@ bool Sequence::Get(int b, samplePtr buffer, sampleFormat format,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Pass NULL to set silence
|
// Pass NULL to set silence
|
||||||
bool Sequence::Set(samplePtr buffer, sampleFormat format,
|
void Sequence::SetSamples(samplePtr buffer, sampleFormat format,
|
||||||
sampleCount start, sampleCount len)
|
sampleCount start, sampleCount len)
|
||||||
|
// STRONG-GUARANTEE
|
||||||
{
|
{
|
||||||
if (start < 0 || start >= mNumSamples ||
|
if (start < 0 || start >= mNumSamples ||
|
||||||
start+len > mNumSamples)
|
start + len > mNumSamples)
|
||||||
return false;
|
//THROW_INCONSISTENCY_EXCEPTION
|
||||||
|
;
|
||||||
|
|
||||||
SampleBuffer scratch(mMaxSamples, mSampleFormat);
|
SampleBuffer scratch(mMaxSamples, mSampleFormat);
|
||||||
|
|
||||||
@ -1185,9 +1188,12 @@ bool Sequence::Set(samplePtr buffer, sampleFormat format,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int b = FindBlock(start);
|
int b = FindBlock(start);
|
||||||
|
BlockArray newBlock;
|
||||||
|
std::copy( mBlock.begin(), mBlock.begin() + b, std::back_inserter(newBlock) );
|
||||||
|
|
||||||
while (len != 0) {
|
while (len != 0) {
|
||||||
SeqBlock &block = mBlock[b];
|
newBlock.push_back( mBlock[b] );
|
||||||
|
SeqBlock &block = newBlock.back();
|
||||||
// start is within block
|
// start is within block
|
||||||
const auto bstart = ( start - block.start ).as_size_t();
|
const auto bstart = ( start - block.start ).as_size_t();
|
||||||
const auto fileLength = block.f->GetLength();
|
const auto fileLength = block.f->GetLength();
|
||||||
@ -1242,8 +1248,9 @@ bool Sequence::Set(samplePtr buffer, sampleFormat format,
|
|||||||
b++;
|
b++;
|
||||||
}
|
}
|
||||||
|
|
||||||
ConsistencyCheck(wxT("Set"));
|
std::copy( mBlock.begin() + b, mBlock.end(), std::back_inserter(newBlock) );
|
||||||
return true;
|
|
||||||
|
CommitChangesIfConsistent( newBlock, mNumSamples, wxT("SetSamples") );
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
@ -90,7 +90,7 @@ class PROFILE_DLL_API Sequence final : public XMLTagHandler{
|
|||||||
|
|
||||||
// Note that len is not size_t, because nullptr may be passed for buffer, in
|
// Note that len is not size_t, because nullptr may be passed for buffer, in
|
||||||
// which case, silence is inserted, possibly a large amount.
|
// which case, silence is inserted, possibly a large amount.
|
||||||
bool Set(samplePtr buffer, sampleFormat format,
|
void SetSamples(samplePtr buffer, sampleFormat format,
|
||||||
sampleCount start, sampleCount len);
|
sampleCount start, sampleCount len);
|
||||||
|
|
||||||
// where is input, assumed to be nondecreasing, and its size is len + 1.
|
// where is input, assumed to be nondecreasing, and its size is len + 1.
|
||||||
@ -128,7 +128,7 @@ class PROFILE_DLL_API Sequence final : public XMLTagHandler{
|
|||||||
// loaded from an XML file via DirManager::HandleXMLTag
|
// loaded from an XML file via DirManager::HandleXMLTag
|
||||||
void AppendBlockFile(const BlockFilePtr &blockFile);
|
void AppendBlockFile(const BlockFilePtr &blockFile);
|
||||||
|
|
||||||
bool SetSilence(sampleCount s0, sampleCount len);
|
void SetSilence(sampleCount s0, sampleCount len);
|
||||||
void InsertSilence(sampleCount s0, sampleCount len);
|
void InsertSilence(sampleCount s0, sampleCount len);
|
||||||
|
|
||||||
const std::shared_ptr<DirManager> &GetDirManager() { return mDirManager; }
|
const std::shared_ptr<DirManager> &GetDirManager() { return mDirManager; }
|
||||||
|
@ -413,7 +413,7 @@ void WaveClip::SetSamples(samplePtr buffer, sampleFormat format,
|
|||||||
// STRONG-GUARANTEE
|
// STRONG-GUARANTEE
|
||||||
{
|
{
|
||||||
// use STRONG-GUARANTEE
|
// use STRONG-GUARANTEE
|
||||||
mSequence->Set(buffer, format, start, len);
|
mSequence->SetSamples(buffer, format, start, len);
|
||||||
|
|
||||||
// use NOFAIL-GUARANTEE
|
// use NOFAIL-GUARANTEE
|
||||||
MarkChanged();
|
MarkChanged();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user