From cd38d44d86f88dd78b991b8d7c4c94825e672e6e Mon Sep 17 00:00:00 2001 From: ed Date: Wed, 14 Aug 2019 11:41:08 +0100 Subject: [PATCH] Android: Extend lifetime of OpenSLEngineHolder object to fix crash when deleting the current audio device --- .../native/juce_android_OpenSL.cpp | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/modules/juce_audio_devices/native/juce_android_OpenSL.cpp b/modules/juce_audio_devices/native/juce_android_OpenSL.cpp index 3f0229f86c..f5d287f5a9 100644 --- a/modules/juce_audio_devices/native/juce_android_OpenSL.cpp +++ b/modules/juce_audio_devices/native/juce_android_OpenSL.cpp @@ -315,6 +315,12 @@ struct OpenSLEngineHolder SlRef engine; }; +OpenSLEngineHolder& getEngineHolder() +{ + static OpenSLEngineHolder holder; + return holder; +} + //============================================================================== class SLRealtimeThread; @@ -458,11 +464,11 @@ public: SLObjectItf obj = nullptr; - SharedResourcePointer holder; + auto& holder = getEngineHolder(); - if (auto e = *holder->engine) + if (auto e = *holder.engine) { - auto status = e->CreateAudioPlayer (holder->engine, &obj, &source, &sink, 2, + auto status = e->CreateAudioPlayer (holder.engine, &obj, &source, &sink, 2, queueInterfaces, interfaceRequired); if (status != SL_RESULT_SUCCESS || obj == nullptr || (*obj)->Realize(obj, 0) != SL_RESULT_SUCCESS) @@ -503,11 +509,11 @@ public: SLObjectItf obj = nullptr; - SharedResourcePointer holder; + auto& holder = getEngineHolder(); - if (auto e = *holder->engine) + if (auto e = *holder.engine) { - auto status = e->CreateAudioRecorder (holder->engine, &obj, &source, &sink, 2, queueInterfaces, interfaceRequired); + auto status = e->CreateAudioRecorder (holder.engine, &obj, &source, &sink, 2, queueInterfaces, interfaceRequired); if (status != SL_RESULT_SUCCESS || obj == nullptr || (*obj)->Realize (obj, 0) != SL_RESULT_SUCCESS) { @@ -556,9 +562,10 @@ public: if (outputChannels > 0) { - SharedResourcePointer holder; + auto& holder = getEngineHolder(); SLObjectItf obj = nullptr; - auto err = (*holder->engine)->CreateOutputMix (holder->engine, &obj, 0, nullptr, nullptr); + + auto err = (*holder.engine)->CreateOutputMix (holder.engine, &obj, 0, nullptr, nullptr); if (err != SL_RESULT_SUCCESS || obj == nullptr || *obj == nullptr || (*obj)->Realize (obj, 0) != SL_RESULT_SUCCESS) @@ -814,7 +821,7 @@ public: outputLatency = (int) ((longestLatency * outputLatency) / totalLatency) & ~15; // You can only create this class if you are sure that your hardware supports OpenSL - jassert (engineHolder->slLibrary.getNativeHandle() != nullptr); + jassert (getEngineHolder().slLibrary.getNativeHandle() != nullptr); } ~OpenSLAudioIODevice() override @@ -1032,8 +1039,6 @@ private: friend class SLRealtimeThread; //============================================================================== - SharedResourcePointer engineHolder; - int actualBufferSize = 0, sampleRate = 0, audioBuffersToEnqueue = 0; int inputLatency, outputLatency; bool deviceOpen = false, audioProcessingEnabled = true;