Browse Source

Oboe: Prefer SpinLock to raw atomics

v7.0.9
reuk 2 years ago
parent
commit
a24be991fa
No known key found for this signature in database GPG Key ID: FCB43929F012EE5C
1 changed files with 9 additions and 17 deletions
  1. +9
    -17
      modules/juce_audio_devices/native/juce_android_Oboe.cpp

+ 9
- 17
modules/juce_audio_devices/native/juce_android_Oboe.cpp View File

@@ -751,8 +751,6 @@ private:
void start() override void start() override
{ {
audioCallbackGuard.set (0);
if (inputStream != nullptr) if (inputStream != nullptr)
inputStream->start(); inputStream->start();
@@ -764,13 +762,10 @@ private:
void stop() override void stop() override
{ {
while (! audioCallbackGuard.compareAndSetBool (1, 0))
Thread::sleep (1);
const SpinLock::ScopedLockType lock { audioCallbackMutex };
inputStream = nullptr; inputStream = nullptr;
outputStream = nullptr; outputStream = nullptr;
audioCallbackGuard.set (0);
} }
int getOutputLatencyInSamples() override { return outputLatency; } int getOutputLatencyInSamples() override { return outputLatency; }
@@ -788,7 +783,9 @@ private:
oboe::DataCallbackResult onAudioReady (oboe::AudioStream* stream, void* audioData, int32_t numFrames) override 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) if (stream == nullptr)
return oboe::DataCallbackResult::Stop; return oboe::DataCallbackResult::Stop;
@@ -854,8 +851,6 @@ private:
if (isOutputLatencyDetectionSupported) if (isOutputLatencyDetectionSupported)
outputLatency = getLatencyFor (*outputStream); outputLatency = getLatencyFor (*outputStream);
audioCallbackGuard.set (0);
} }
return oboe::DataCallbackResult::Continue; return oboe::DataCallbackResult::Continue;
@@ -945,13 +940,14 @@ private:
if (error == oboe::Result::ErrorDisconnected) 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. // 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). // 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 = nullptr;
outputStream.reset (new OboeStream (oboe::kUnspecified, outputStream.reset (new OboeStream (oboe::kUnspecified,
@@ -964,9 +960,6 @@ private:
this)); this));
outputStream->start(); outputStream->start();
audioCallbackGuard.set (0);
streamRestartGuard.set (0);
} }
} }
} }
@@ -974,8 +967,7 @@ private:
std::vector<SampleType> inputStreamNativeBuffer; std::vector<SampleType> inputStreamNativeBuffer;
AudioBuffer<float> inputStreamSampleBuffer, AudioBuffer<float> inputStreamSampleBuffer,
outputStreamSampleBuffer; outputStreamSampleBuffer;
Atomic<int> audioCallbackGuard { 0 },
streamRestartGuard { 0 };
SpinLock audioCallbackMutex, streamRestartMutex;
bool isInputLatencyDetectionSupported = false; bool isInputLatencyDetectionSupported = false;
int inputLatency = -1; int inputLatency = -1;


Loading…
Cancel
Save