44 for (
int i = 3; --i >= 0;)
45 readNextBufferChunk();
50BufferingAudioReader::~BufferingAudioReader()
70 while (numSamples > 0)
115BufferingAudioReader::BufferedBlock::BufferedBlock (
AudioFormatReader& reader, int64 pos,
int numSamples)
116 : range (pos, pos + numSamples),
117 buffer ((
int) reader.numChannels, numSamples)
119 reader.
read (&buffer, 0, numSamples, pos,
true,
true);
122BufferingAudioReader::BufferedBlock* BufferingAudioReader::getBlockContaining (int64 pos)
const noexcept
124 for (
auto* b : blocks)
125 if (b->range.contains (pos))
131int BufferingAudioReader::useTimeSlice()
133 return readNextBufferChunk() ? 1 : 100;
136bool BufferingAudioReader::readNextBufferChunk()
138 auto pos = nextReadPosition.load();
139 auto startPos = ((pos - 1024) / samplesPerBlock) * samplesPerBlock;
140 auto endPos = startPos + numBlocks * samplesPerBlock;
142 OwnedArray<BufferedBlock> newBlocks;
144 for (
int i = blocks.
size(); --i >= 0;)
145 if (blocks.
getUnchecked(i)->range.intersects (Range<int64> (startPos, endPos)))
148 if (newBlocks.size() == numBlocks)
150 newBlocks.clear (
false);
154 for (
auto p = startPos; p < endPos; p += samplesPerBlock)
156 if (getBlockContaining (p) ==
nullptr)
158 newBlocks.add (
new BufferedBlock (*source, p, samplesPerBlock));
164 const ScopedLock sl (lock);
165 newBlocks.swapWith (blocks);
168 for (
int i = blocks.
size(); --i >= 0;)
bool readSamples(int **destSamples, int numDestChannels, int startOffsetInDestBuffer, int64 startSampleInFile, int numSamples) override
BufferingAudioReader(AudioFormatReader *sourceReader, TimeSliceThread &timeSliceThread, int samplesToBuffer)
void setReadTimeout(int timeoutMilliseconds) noexcept
static void JUCE_CALLTYPE clear(float *dest, int numValues) noexcept
static void JUCE_CALLTYPE copy(float *dest, const float *src, int numValues) noexcept
int size() const noexcept
ObjectClass * getUnchecked(int index) const noexcept
static void JUCE_CALLTYPE yield()
void removeTimeSliceClient(TimeSliceClient *clientToRemove)
void addTimeSliceClient(TimeSliceClient *clientToAdd, int millisecondsBeforeStarting=0)
static uint32 getMillisecondCounter() noexcept