From f970144a3d764137dbd17d5a2750dece09245c45 Mon Sep 17 00:00:00 2001 From: znakeeye Date: Sun, 9 Feb 2025 22:57:24 +0100 Subject: [PATCH] Fix for NDK issue 360. dlclose() skipped pre-API 28. This fixes weird crashes during uninit. --- miniaudio.h | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/miniaudio.h b/miniaudio.h index 75fe9ce9..939c5954 100644 --- a/miniaudio.h +++ b/miniaudio.h @@ -38467,6 +38467,18 @@ static ma_result ma_device_get_info__aaudio(ma_device* pDevice, ma_device_type t return MA_SUCCESS; } +static void ma_close_library__aaudio(ma_context* pContext) +{ + MA_ASSERT(pContext != NULL); + + /* Hack for Android bug (see https://github.com/android/ndk/issues/360). Calling dlclose() pre-API 28 may segfault. */ + if (ma_android_sdk_version() >= 28) { + ma_dlclose(ma_context_get_log(pContext), pContext->aaudio.hAAudio); + } + + pContext->aaudio.hAAudio = NULL; +} + static ma_result ma_context_uninit__aaudio(ma_context* pContext) { @@ -38474,9 +38486,7 @@ static ma_result ma_context_uninit__aaudio(ma_context* pContext) MA_ASSERT(pContext->backend == ma_backend_aaudio); ma_device_job_thread_uninit(&pContext->aaudio.jobThread, &pContext->allocationCallbacks); - - ma_dlclose(ma_context_get_log(pContext), pContext->aaudio.hAAudio); - pContext->aaudio.hAAudio = NULL; + ma_close_library__aaudio(pContext); return MA_SUCCESS; } @@ -38584,8 +38594,7 @@ static ma_result ma_context_init__aaudio(ma_context* pContext, const ma_context_ result = ma_device_job_thread_init(&jobThreadConfig, &pContext->allocationCallbacks, &pContext->aaudio.jobThread); if (result != MA_SUCCESS) { - ma_dlclose(ma_context_get_log(pContext), pContext->aaudio.hAAudio); - pContext->aaudio.hAAudio = NULL; + ma_close_library__aaudio(pContext); return result; } }