From a3064276caf341676e2565dfe72c137fe9f3ab70 Mon Sep 17 00:00:00 2001 From: David Reid Date: Sun, 15 Jul 2018 20:10:49 +1000 Subject: [PATCH] Add a flag for asynchronous backends. The motivation for this change is to simplify and clean up the cross- platform part of mini_al. --- mini_al.h | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/mini_al.h b/mini_al.h index 9469b140..2e0e9289 100644 --- a/mini_al.h +++ b/mini_al.h @@ -1094,6 +1094,7 @@ struct mal_context mal_uint32 playbackDeviceInfoCount; mal_uint32 captureDeviceInfoCount; mal_device_info* pDeviceInfos; // Playback devices first, then capture. + mal_bool32 isBackendAsynchronous : 1; // Set when the context is initialized. Set to 1 for asynchronous backends such as Core Audio and JACK. Do not modify. mal_result (* onUninit )(mal_context* pContext); mal_bool32 (* onDeviceIDEqual )(mal_context* pContext, const mal_device_id* pID0, const mal_device_id* pID1); @@ -12399,6 +12400,8 @@ mal_result mal_context_init__jack(mal_context* pContext) pContext->jack.jack_free = (mal_proc)_jack_free; #endif + pContext->isBackendAsynchronous = MAL_TRUE; + pContext->onDeviceIDEqual = mal_context_is_device_id_equal__jack; pContext->onEnumDevices = mal_context_enumerate_devices__jack; pContext->onGetDeviceInfo = mal_context_get_device_info__jack; @@ -14017,6 +14020,8 @@ mal_result mal_context_init__coreaudio(mal_context* pContext) pContext->coreaudio.AudioUnitInitialize = (mal_proc)AudioUnitInitialize; pContext->coreaudio.AudioUnitRender = (mal_proc)AudioUnitRender; #endif + + pContext->isBackendAsynchronous = MAL_TRUE; pContext->onDeviceIDEqual = mal_context_is_device_id_equal__coreaudio; pContext->onEnumDevices = mal_context_enumerate_devices__coreaudio; @@ -15361,6 +15366,8 @@ mal_result mal_context_init__opensl(mal_context* pContext) } } + pContext->isBackendAsynchronous = MAL_TRUE; + pContext->onDeviceIDEqual = mal_context_is_device_id_equal__opensl; pContext->onEnumDevices = mal_context_enumerate_devices__opensl; pContext->onGetDeviceInfo = mal_context_get_device_info__opensl; @@ -17132,6 +17139,8 @@ mal_result mal_context_init__sdl(mal_context* pContext) return MAL_ERROR; } + pContext->isBackendAsynchronous = MAL_TRUE; + pContext->onDeviceIDEqual = mal_context_is_device_id_equal__sdl; pContext->onEnumDevices = mal_context_enumerate_devices__sdl; pContext->onGetDeviceInfo = mal_context_get_device_info__sdl; @@ -17790,13 +17799,9 @@ const mal_backend g_malDefaultBackends[] = { mal_backend_null }; -mal_bool32 mal_is_backend_asynchronous(mal_backend backend) +mal_bool32 mal_context_is_backend_asynchronous(mal_context* pContext) { - return - backend == mal_backend_jack || - backend == mal_backend_coreaudio || - backend == mal_backend_opensl || - backend == mal_backend_sdl; + return pContext->isBackendAsynchronous; } mal_result mal_context_init(const mal_backend backends[], mal_uint32 backendCount, const mal_context_config* pConfig, mal_context* pContext) @@ -18432,7 +18437,7 @@ mal_result mal_device_init(mal_context* pContext, mal_device_type type, mal_devi // Some backends don't require the worker thread. - if (!mal_is_backend_asynchronous(pContext->backend)) { + if (!mal_context_is_backend_asynchronous(pContext)) { // The worker thread. if (mal_thread_create(pContext, &pDevice->thread, mal_worker_thread, pDevice) != MAL_SUCCESS) { mal_device_uninit(pDevice); @@ -18502,7 +18507,7 @@ void mal_device_uninit(mal_device* pDevice) mal_device__set_state(pDevice, MAL_STATE_UNINITIALIZED); // Wake up the worker thread and wait for it to properly terminate. - if (!mal_is_backend_asynchronous(pDevice->pContext->backend)) { + if (!mal_context_is_backend_asynchronous(pDevice->pContext)) { mal_event_signal(&pDevice->wakeupEvent); mal_thread_wait(&pDevice->thread); }