mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
Android: Extend lifetime of OpenSLEngineHolder object to fix crash when deleting the current audio device
This commit is contained in:
parent
be8a568747
commit
cd38d44d86
1 changed files with 16 additions and 11 deletions
|
|
@ -315,6 +315,12 @@ struct OpenSLEngineHolder
|
|||
SlRef<SLEngineItf_> engine;
|
||||
};
|
||||
|
||||
OpenSLEngineHolder& getEngineHolder()
|
||||
{
|
||||
static OpenSLEngineHolder holder;
|
||||
return holder;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
class SLRealtimeThread;
|
||||
|
||||
|
|
@ -458,11 +464,11 @@ public:
|
|||
|
||||
SLObjectItf obj = nullptr;
|
||||
|
||||
SharedResourcePointer<OpenSLEngineHolder> 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<OpenSLEngineHolder> 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<OpenSLEngineHolder> 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<OpenSLEngineHolder> engineHolder;
|
||||
|
||||
int actualBufferSize = 0, sampleRate = 0, audioBuffersToEnqueue = 0;
|
||||
int inputLatency, outputLatency;
|
||||
bool deviceOpen = false, audioProcessingEnabled = true;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue