diff --git a/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp b/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp index 1377071359..d123e4cf2e 100644 --- a/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp +++ b/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp @@ -27,11 +27,6 @@ ResamplingAudioSource::ResamplingAudioSource (AudioSource* const inputSource, const bool deleteInputWhenDeleted, const int channels) : input (inputSource, deleteInputWhenDeleted), - ratio (1.0), - lastRatio (1.0), - bufferPos (0), - sampsInBuffer (0), - subSampleOffset (0), numChannels (channels) { jassert (input != nullptr); @@ -67,6 +62,8 @@ void ResamplingAudioSource::prepareToPlay (int samplesPerBlockExpected, double s void ResamplingAudioSource::flushBuffers() { + const ScopedLock sl (callbackLock); + buffer.clear(); bufferPos = 0; sampsInBuffer = 0; @@ -82,10 +79,12 @@ void ResamplingAudioSource::releaseResources() void ResamplingAudioSource::getNextAudioBlock (const AudioSourceChannelInfo& info) { + const ScopedLock sl (callbackLock); + double localRatio; { - const SpinLock::ScopedLockType sl (ratioLock); + const SpinLock::ScopedLockType ratioSl (ratioLock); localRatio = ratio; } diff --git a/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h b/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h index e33396b893..49b4974b29 100644 --- a/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h +++ b/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h @@ -76,12 +76,13 @@ public: private: //============================================================================== OptionalScopedPointer input; - double ratio, lastRatio; + double ratio = 1.0, lastRatio = 1.0; AudioBuffer buffer; - int bufferPos, sampsInBuffer; - double subSampleOffset; + int bufferPos = 0, sampsInBuffer = 0; + double subSampleOffset = 0.0; double coefficients[6]; SpinLock ratioLock; + CriticalSection callbackLock; const int numChannels; HeapBlock destBuffers; HeapBlock srcBuffers; diff --git a/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp b/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp index 34e05748c7..57c4c87c29 100644 --- a/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp +++ b/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp @@ -125,10 +125,7 @@ void AudioTransportSource::stop() { if (playing) { - { - const ScopedLock sl (callbackLock); - playing = false; - } + playing = false; int n = 500; while (--n >= 0 && ! stopped) diff --git a/modules/juce_audio_devices/sources/juce_AudioTransportSource.h b/modules/juce_audio_devices/sources/juce_AudioTransportSource.h index 5e4c21237f..67c4869907 100644 --- a/modules/juce_audio_devices/sources/juce_AudioTransportSource.h +++ b/modules/juce_audio_devices/sources/juce_AudioTransportSource.h @@ -167,7 +167,7 @@ private: CriticalSection callbackLock; float gain = 1.0f, lastGain = 1.0f; - bool playing = false, stopped = true; + std::atomic playing { false }, stopped { true }; double sampleRate = 44100.0, sourceSampleRate = 0; int blockSize = 128, readAheadBufferSize = 0; bool isPrepared = false, inputStreamEOF = false; diff --git a/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp b/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp index dd9344bcf8..6d289d114e 100644 --- a/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp +++ b/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp @@ -214,7 +214,7 @@ private: std::unique_ptr source; std::unique_ptr reader; CriticalSection readerLock; - uint32 lastReaderUseTime = 0; + std::atomic lastReaderUseTime { 0 }; void createReader() { @@ -645,6 +645,7 @@ bool AudioThumbnail::setDataSource (LevelDataSource* newSource) JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED numSamplesFinished = 0; + auto wasSuccessful = [&] { return sampleRate > 0 && totalSamples > 0; }; if (cache.loadThumb (*this, newSource->hashCode) && isFullyLoaded()) { @@ -654,22 +655,22 @@ bool AudioThumbnail::setDataSource (LevelDataSource* newSource) source->sampleRate = sampleRate; source->numChannels = (unsigned int) numChannels; source->numSamplesFinished = numSamplesFinished; + + return wasSuccessful(); } - else - { - source.reset (newSource); // (make sure this isn't done before loadThumb is called) - const ScopedLock sl (lock); - source->initialise (numSamplesFinished); + source.reset (newSource); - totalSamples = source->lengthInSamples; - sampleRate = source->sampleRate; - numChannels = (int32) source->numChannels; + const ScopedLock sl (lock); + source->initialise (numSamplesFinished); - createChannels (1 + (int) (totalSamples / samplesPerThumbSample)); - } + totalSamples = source->lengthInSamples; + sampleRate = source->sampleRate; + numChannels = (int32) source->numChannels; + + createChannels (1 + (int) (totalSamples / samplesPerThumbSample)); - return sampleRate > 0 && totalSamples > 0; + return wasSuccessful(); } bool AudioThumbnail::setSource (InputSource* const newSource)