From f9a5bf1729376d7f206c43e949396dbfa894dd47 Mon Sep 17 00:00:00 2001 From: jules Date: Wed, 17 Oct 2018 14:17:39 +0100 Subject: [PATCH] More use of atomics to avoid asan warnings --- .../juce_BufferingAudioFormatReader.cpp | 30 ++++++++----------- .../format/juce_BufferingAudioFormatReader.h | 4 +-- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp b/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp index 0980c00b23..dcccb87582 100644 --- a/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp +++ b/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp @@ -32,9 +32,7 @@ BufferingAudioReader::BufferingAudioReader (AudioFormatReader* sourceReader, int samplesToBuffer) : AudioFormatReader (nullptr, sourceReader->getFormatName()), source (sourceReader), thread (timeSliceThread), - nextReadPosition (0), - numBlocks (1 + (samplesToBuffer / samplesPerBlock)), - timeoutMs (0) + numBlocks (1 + (samplesToBuffer / samplesPerBlock)) { sampleRate = source->sampleRate; lengthInSamples = source->lengthInSamples; @@ -62,7 +60,7 @@ void BufferingAudioReader::setReadTimeout (int timeoutMilliseconds) noexcept bool BufferingAudioReader::readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, int64 startSampleInFile, int numSamples) { - const uint32 startTime = Time::getMillisecondCounter(); + auto startTime = Time::getMillisecondCounter(); clearSamplesBeyondAvailableLength (destSamples, numDestChannels, startOffsetInDestBuffer, startSampleInFile, numSamples, lengthInSamples); @@ -71,14 +69,14 @@ bool BufferingAudioReader::readSamples (int** destSamples, int numDestChannels, while (numSamples > 0) { - if (const BufferedBlock* const block = getBlockContaining (startSampleInFile)) + if (auto block = getBlockContaining (startSampleInFile)) { - const int offset = (int) (startSampleInFile - block->range.getStart()); - const int numToDo = jmin (numSamples, (int) (block->range.getEnd() - startSampleInFile)); + auto offset = (int) (startSampleInFile - block->range.getStart()); + auto numToDo = jmin (numSamples, (int) (block->range.getEnd() - startSampleInFile)); for (int j = 0; j < numDestChannels; ++j) { - if (float* dest = (float*) destSamples[j]) + if (auto dest = (float*) destSamples[j]) { dest += startOffsetInDestBuffer; @@ -98,7 +96,7 @@ bool BufferingAudioReader::readSamples (int** destSamples, int numDestChannels, if (timeoutMs >= 0 && Time::getMillisecondCounter() >= startTime + (uint32) timeoutMs) { for (int j = 0; j < numDestChannels; ++j) - if (float* dest = (float*) destSamples[j]) + if (auto dest = (float*) destSamples[j]) FloatVectorOperations::clear (dest + startOffsetInDestBuffer, numSamples); break; @@ -123,13 +121,9 @@ BufferingAudioReader::BufferedBlock::BufferedBlock (AudioFormatReader& reader, i BufferingAudioReader::BufferedBlock* BufferingAudioReader::getBlockContaining (int64 pos) const noexcept { - for (int i = blocks.size(); --i >= 0;) - { - BufferedBlock* const b = blocks.getUnchecked(i); - + for (auto* b : blocks) if (b->range.contains (pos)) return b; - } return nullptr; } @@ -141,9 +135,9 @@ int BufferingAudioReader::useTimeSlice() bool BufferingAudioReader::readNextBufferChunk() { - const int64 pos = nextReadPosition; - const int64 startPos = ((pos - 1024) / samplesPerBlock) * samplesPerBlock; - const int64 endPos = startPos + numBlocks * samplesPerBlock; + auto pos = nextReadPosition.get(); + auto startPos = ((pos - 1024) / samplesPerBlock) * samplesPerBlock; + auto endPos = startPos + numBlocks * samplesPerBlock; OwnedArray newBlocks; @@ -157,7 +151,7 @@ bool BufferingAudioReader::readNextBufferChunk() return false; } - for (int64 p = startPos; p < endPos; p += samplesPerBlock) + for (auto p = startPos; p < endPos; p += samplesPerBlock) { if (getBlockContaining (p) == nullptr) { diff --git a/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h b/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h index e45d05df97..964a36b846 100644 --- a/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h +++ b/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h @@ -69,9 +69,9 @@ public: private: std::unique_ptr source; TimeSliceThread& thread; - int64 nextReadPosition; + std::atomic nextReadPosition { 0 }; const int numBlocks; - int timeoutMs; + int timeoutMs = 0; enum { samplesPerBlock = 32768 };