mirror of
https://github.com/cookiengineer/audacity
synced 2025-09-23 07:29:46 +02:00
Sequence::AppendBlock and Sequence::Blockify are static
This commit is contained in:
parent
2677796b0c
commit
52fd607b42
@ -185,7 +185,8 @@ bool Sequence::ConvertToSampleFormat(sampleFormat format, bool* pbChanged)
|
||||
// Using Blockify will handle the cases where len > the NEW mMaxSamples. Previous code did not.
|
||||
const auto blockstart = oldSeqBlock.start;
|
||||
const unsigned prevSize = newBlockArray.size();
|
||||
Blockify(newBlockArray, blockstart, bufferNew.ptr(), len);
|
||||
Blockify(*mDirManager, mMaxSamples, mSampleFormat,
|
||||
newBlockArray, blockstart, bufferNew.ptr(), len);
|
||||
bSuccess = (newBlockArray.size() > prevSize);
|
||||
if (bSuccess)
|
||||
*pbChanged = true;
|
||||
@ -425,7 +426,8 @@ std::unique_ptr<Sequence> Sequence::Copy(sampleCount s0, sampleCount s1) const
|
||||
|
||||
// If there are blocks in the middle, copy the blockfiles directly
|
||||
for (int bb = b0 + 1; bb < b1; ++bb)
|
||||
dest->AppendBlock(mBlock[bb]); // Increase ref count or duplicate file
|
||||
AppendBlock(*dest->mDirManager, dest->mBlock, dest->mNumSamples, mBlock[bb]);
|
||||
// Increase ref count or duplicate file
|
||||
|
||||
// Do the last block
|
||||
if (b1 > b0) {
|
||||
@ -440,7 +442,8 @@ std::unique_ptr<Sequence> Sequence::Copy(sampleCount s0, sampleCount s1) const
|
||||
}
|
||||
else
|
||||
// Special case, copy exactly
|
||||
dest->AppendBlock(block); // Increase ref count or duplicate file
|
||||
AppendBlock(*dest->mDirManager, dest->mBlock, dest->mNumSamples, block);
|
||||
// Increase ref count or duplicate file
|
||||
}
|
||||
|
||||
if (! ConsistencyCheck(wxT("Sequence::Copy()")))
|
||||
@ -507,7 +510,8 @@ bool Sequence::Paste(sampleCount s, const Sequence *src)
|
||||
// minimum size
|
||||
|
||||
for (unsigned int i = 0; i < srcNumBlocks; i++)
|
||||
AppendBlock(srcBlock[i]); // Increase ref count or duplicate file
|
||||
AppendBlock(*mDirManager, mBlock, mNumSamples, srcBlock[i]);
|
||||
// Increase ref count or duplicate file
|
||||
|
||||
return ConsistencyCheck(wxT("Paste branch one"));
|
||||
}
|
||||
@ -583,7 +587,8 @@ bool Sequence::Paste(sampleCount s, const Sequence *src)
|
||||
splitBlock, splitPoint,
|
||||
splitLen - splitPoint);
|
||||
|
||||
Blockify(newBlock, splitBlock.start, sumBuffer.ptr(), sum);
|
||||
Blockify(*mDirManager, mMaxSamples, mSampleFormat,
|
||||
newBlock, splitBlock.start, sumBuffer.ptr(), sum);
|
||||
} else {
|
||||
|
||||
// The final case is that we're inserting at least five blocks.
|
||||
@ -609,7 +614,8 @@ bool Sequence::Paste(sampleCount s, const Sequence *src)
|
||||
src->Get(0, sampleBuffer.ptr() + splitPoint*sampleSize,
|
||||
mSampleFormat, 0, srcFirstTwoLen);
|
||||
|
||||
Blockify(newBlock, splitBlock.start, sampleBuffer.ptr(), leftLen);
|
||||
Blockify(*mDirManager, mMaxSamples, mSampleFormat,
|
||||
newBlock, splitBlock.start, sampleBuffer.ptr(), leftLen);
|
||||
|
||||
for (i = 2; i < srcNumBlocks - 2; i++) {
|
||||
const SeqBlock &block = srcBlock[i];
|
||||
@ -628,7 +634,8 @@ bool Sequence::Paste(sampleCount s, const Sequence *src)
|
||||
Read(sampleBuffer.ptr() + srcLastTwoLen * sampleSize, mSampleFormat,
|
||||
splitBlock, splitPoint, rightSplit);
|
||||
|
||||
Blockify(newBlock, s + lastStart, sampleBuffer.ptr(), rightLen);
|
||||
Blockify(*mDirManager, mMaxSamples, mSampleFormat,
|
||||
newBlock, s + lastStart, sampleBuffer.ptr(), rightLen);
|
||||
}
|
||||
|
||||
// Copy remaining blocks to NEW block array and
|
||||
@ -734,14 +741,16 @@ bool Sequence::AppendCoded(const wxString &fName, sampleCount start,
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Sequence::AppendBlock(const SeqBlock &b)
|
||||
bool Sequence::AppendBlock
|
||||
(DirManager &mDirManager,
|
||||
BlockArray &mBlock, sampleCount &mNumSamples, const SeqBlock &b)
|
||||
{
|
||||
// Quick check to make sure that it doesn't overflow
|
||||
if (Overflows((mNumSamples.as_double()) + ((double)b.f->GetLength())))
|
||||
return false;
|
||||
|
||||
SeqBlock newBlock(
|
||||
mDirManager->CopyBlockFile(b.f), // Bump ref count if not locked, else copy
|
||||
mDirManager.CopyBlockFile(b.f), // Bump ref count if not locked, else copy
|
||||
mNumSamples
|
||||
);
|
||||
if (!newBlock.f) {
|
||||
@ -1592,7 +1601,9 @@ bool Sequence::Append(samplePtr buffer, sampleFormat format,
|
||||
return true;
|
||||
}
|
||||
|
||||
void Sequence::Blockify(BlockArray &list, sampleCount start, samplePtr buffer, size_t len)
|
||||
void Sequence::Blockify
|
||||
(DirManager &mDirManager, size_t mMaxSamples, sampleFormat mSampleFormat,
|
||||
BlockArray &list, sampleCount start, samplePtr buffer, size_t len)
|
||||
{
|
||||
if (len <= 0)
|
||||
return;
|
||||
@ -1607,7 +1618,7 @@ void Sequence::Blockify(BlockArray &list, sampleCount start, samplePtr buffer, s
|
||||
int newLen = ((i + 1) * len / num) - offset;
|
||||
samplePtr bufStart = buffer + (offset * SAMPLE_SIZE(mSampleFormat));
|
||||
|
||||
b.f = mDirManager->NewSimpleBlockFile(bufStart, newLen, mSampleFormat);
|
||||
b.f = mDirManager.NewSimpleBlockFile(bufStart, newLen, mSampleFormat);
|
||||
|
||||
list.push_back(b);
|
||||
}
|
||||
@ -1713,7 +1724,8 @@ bool Sequence::Delete(sampleCount start, sampleCount len)
|
||||
preBlock, 0, preBufferLen);
|
||||
|
||||
newBlock.erase(newBlock.end() - 1);
|
||||
Blockify(newBlock, prepreBlock.start, scratch.ptr(), sum);
|
||||
Blockify(*mDirManager, mMaxSamples, mSampleFormat,
|
||||
newBlock, prepreBlock.start, scratch.ptr(), sum);
|
||||
}
|
||||
}
|
||||
else {
|
||||
@ -1757,7 +1769,8 @@ bool Sequence::Delete(sampleCount start, sampleCount len)
|
||||
Read(scratch.ptr() + (postBufferLen * sampleSize), mSampleFormat,
|
||||
postpostBlock, 0, postpostLen);
|
||||
|
||||
Blockify(newBlock, start, scratch.ptr(), sum);
|
||||
Blockify(*mDirManager, mMaxSamples, mSampleFormat,
|
||||
newBlock, start, scratch.ptr(), sum);
|
||||
b1++;
|
||||
}
|
||||
}
|
||||
|
@ -246,13 +246,20 @@ class PROFILE_DLL_API Sequence final : public XMLTagHandler{
|
||||
|
||||
int FindBlock(sampleCount pos) const;
|
||||
|
||||
bool AppendBlock(const SeqBlock &b);
|
||||
static bool AppendBlock
|
||||
(DirManager &dirManager,
|
||||
BlockArray &blocks, sampleCount &numSamples, const SeqBlock &b);
|
||||
|
||||
bool Read(samplePtr buffer, sampleFormat format,
|
||||
const SeqBlock &b,
|
||||
size_t blockRelativeStart, size_t len) const;
|
||||
|
||||
void Blockify(BlockArray &list, sampleCount start, samplePtr buffer, size_t len);
|
||||
// Accumulate NEW block files onto the end of a block array.
|
||||
// Does not change this sequence. The intent is to use
|
||||
// CommitChangesIfConsistent later.
|
||||
static void Blockify
|
||||
(DirManager &dirManager, size_t maxSamples, sampleFormat format,
|
||||
BlockArray &list, sampleCount start, samplePtr buffer, size_t len);
|
||||
|
||||
bool Get(int b, samplePtr buffer, sampleFormat format,
|
||||
sampleCount start, size_t len) const;
|
||||
|
Loading…
x
Reference in New Issue
Block a user