diff --git a/Source/Plugins/BinaryWriter/FileMemoryBlock.h b/Source/Plugins/BinaryWriter/FileMemoryBlock.h index e56edc4fa475f4c5641d08fc77716110a7c4f2e4..eb61a2fb7d956e04fce6e7cd40e2e61488e0999c 100644 --- a/Source/Plugins/BinaryWriter/FileMemoryBlock.h +++ b/Source/Plugins/BinaryWriter/FileMemoryBlock.h @@ -40,17 +40,28 @@ namespace BinaryRecordingEngine m_offset(offset) {}; ~FileMemoryBlock() { - m_file->write(m_data, m_blockSize*sizeof(StorageType)); + if (!m_flushed) + { + m_file->write(m_data, m_blockSize*sizeof(StorageType)); + } }; inline uint64 getOffset() { return m_offset; } inline StorageType* getData() { return m_data.getData(); } + void partialFlush(size_t size, bool markFlushed = true) + { + std::cout << "flushing last block " << size << std::endl; + m_file->write(m_data, size*sizeof(StorageType)); + if (markFlushed) + m_flushed = true; + } private: HeapBlock<StorageType> m_data; FileOutputStream* const m_file; const int m_blockSize; const uint64 m_offset; + bool m_flushed{ false }; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(FileMemoryBlock); }; } diff --git a/Source/Plugins/BinaryWriter/SequentialBlockFile.cpp b/Source/Plugins/BinaryWriter/SequentialBlockFile.cpp index 15e75d057457035e27299522844a68b12ca44daf..334de359d20d94de0931c8b376efdb626597df32 100644 --- a/Source/Plugins/BinaryWriter/SequentialBlockFile.cpp +++ b/Source/Plugins/BinaryWriter/SequentialBlockFile.cpp @@ -29,7 +29,8 @@ SequentialBlockFile::SequentialBlockFile(int nChannels, int samplesPerBlock) : m_file(nullptr), m_nChannels(nChannels), m_samplesPerBlock(samplesPerBlock), -m_blockSize(nChannels*samplesPerBlock) +m_blockSize(nChannels*samplesPerBlock), +m_lastBlockFill(0) { m_memBlocks.ensureStorageAllocated(blockArrayInitSize); for (int i = 0; i < nChannels; i++) @@ -38,10 +39,15 @@ m_blockSize(nChannels*samplesPerBlock) SequentialBlockFile::~SequentialBlockFile() { - //Ensure that all remaining blocks are flushed in order + //Ensure that all remaining blocks are flushed in order. Keep the last one int n = m_memBlocks.size(); - for (int i = 0; i < n; i++) + for (int i = 0; i < n - 1; i++) + { m_memBlocks.remove(0); + } + + //manually flush the last one to avoid trailing zeroes + m_memBlocks[0]->partialFlush(m_lastBlockFill * m_nChannels); } bool SequentialBlockFile::openFile(String filename) @@ -86,6 +92,7 @@ bool SequentialBlockFile::writeChannel(uint64 startPos, int channel, int16* data int startIdx = startPos - m_memBlocks[bIndex]->getOffset(); int startMemPos = startIdx*m_nChannels; int dataIdx = 0; + int lastBlockIdx = m_memBlocks.size() - 1; while (writtenSamples < nSamples) { int16* blockPtr = m_memBlocks[bIndex]->getData(); @@ -96,6 +103,14 @@ bool SequentialBlockFile::writeChannel(uint64 startPos, int channel, int16* data dataIdx++; } writtenSamples += samplesToWrite; + + //Update the last block fill index + size_t samplePos = startIdx + samplesToWrite; + if (bIndex == lastBlockIdx && samplePos > m_lastBlockFill) + { + m_lastBlockFill = samplePos; + } + startIdx = 0; startMemPos = 0; bIndex++; @@ -140,6 +155,7 @@ void SequentialBlockFile::allocateBlocks(uint64 startIndex, int numSamples) lastOffset += m_samplesPerBlock; m_memBlocks.add(new FileBlock(m_file, m_blockSize, lastOffset)); } - + if (newBlocks > 0) + m_lastBlockFill = 0; //we've added some new blocks, so the last one will be empty } diff --git a/Source/Plugins/BinaryWriter/SequentialBlockFile.h b/Source/Plugins/BinaryWriter/SequentialBlockFile.h index b5fd350aad449cad3b1687abe8b1abf390f84f15..a5b6e7e095f91727686b83bfc39030fdc57e007d 100644 --- a/Source/Plugins/BinaryWriter/SequentialBlockFile.h +++ b/Source/Plugins/BinaryWriter/SequentialBlockFile.h @@ -47,9 +47,11 @@ namespace BinaryRecordingEngine const int m_blockSize; OwnedArray<FileBlock> m_memBlocks; Array<int> m_currentBlock; + size_t m_lastBlockFill; void allocateBlocks(uint64 startIndex, int numSamples); + //Compile-time parameters const int streamBufferSize{ 0 }; const int blockArrayInitSize{ 128 };