From a24be991fa24285aaafaee4799b7764f68b85ac6 Mon Sep 17 00:00:00 2001 From: reuk Date: Wed, 1 Mar 2023 16:26:09 +0000 Subject: [PATCH] Oboe: Prefer SpinLock to raw atomics --- .../native/juce_android_Oboe.cpp | 26 +++++++------------ 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/modules/juce_audio_devices/native/juce_android_Oboe.cpp b/modules/juce_audio_devices/native/juce_android_Oboe.cpp index 9a2dade318..3e3d2de973 100644 --- a/modules/juce_audio_devices/native/juce_android_Oboe.cpp +++ b/modules/juce_audio_devices/native/juce_android_Oboe.cpp @@ -751,8 +751,6 @@ private: void start() override { - audioCallbackGuard.set (0); - if (inputStream != nullptr) inputStream->start(); @@ -764,13 +762,10 @@ private: void stop() override { - while (! audioCallbackGuard.compareAndSetBool (1, 0)) - Thread::sleep (1); + const SpinLock::ScopedLockType lock { audioCallbackMutex }; inputStream = nullptr; outputStream = nullptr; - - audioCallbackGuard.set (0); } int getOutputLatencyInSamples() override { return outputLatency; } @@ -788,7 +783,9 @@ private: oboe::DataCallbackResult onAudioReady (oboe::AudioStream* stream, void* audioData, int32_t numFrames) override { - if (audioCallbackGuard.compareAndSetBool (1, 0)) + const SpinLock::ScopedTryLockType lock { audioCallbackMutex }; + + if (lock.isLocked()) { if (stream == nullptr) return oboe::DataCallbackResult::Stop; @@ -854,8 +851,6 @@ private: if (isOutputLatencyDetectionSupported) outputLatency = getLatencyFor (*outputStream); - - audioCallbackGuard.set (0); } return oboe::DataCallbackResult::Continue; @@ -945,13 +940,14 @@ private: if (error == oboe::Result::ErrorDisconnected) { - if (streamRestartGuard.compareAndSetBool (1, 0)) + const SpinLock::ScopedTryLockType streamRestartLock { streamRestartMutex }; + + if (streamRestartLock.isLocked()) { // Close, recreate, and start the stream, not much use in current one. // Use default device id, to let the OS pick the best ID (since our was disconnected). - while (! audioCallbackGuard.compareAndSetBool (1, 0)) - Thread::sleep (1); + const SpinLock::ScopedLockType audioCallbackLock { audioCallbackMutex }; outputStream = nullptr; outputStream.reset (new OboeStream (oboe::kUnspecified, @@ -964,9 +960,6 @@ private: this)); outputStream->start(); - - audioCallbackGuard.set (0); - streamRestartGuard.set (0); } } } @@ -974,8 +967,7 @@ private: std::vector inputStreamNativeBuffer; AudioBuffer inputStreamSampleBuffer, outputStreamSampleBuffer; - Atomic audioCallbackGuard { 0 }, - streamRestartGuard { 0 }; + SpinLock audioCallbackMutex, streamRestartMutex; bool isInputLatencyDetectionSupported = false; int inputLatency = -1;