Commit 577be8ae authored by David Reid's avatar David Reid

Convert WASAPI over to the new callback based backend system.

parent f67f623f
...@@ -1095,9 +1095,16 @@ struct mal_context ...@@ -1095,9 +1095,16 @@ struct mal_context
mal_uint32 captureDeviceInfoCount; mal_uint32 captureDeviceInfoCount;
mal_device_info* pDeviceInfos; // Playback devices first, then capture. mal_device_info* pDeviceInfos; // Playback devices first, then capture.
mal_bool32 (* onDeviceIDEqual)(mal_context* pContext, const mal_device_id* pID0, const mal_device_id* pID1); mal_result (* onUninit )(mal_context* pContext);
mal_result (* onEnumDevices )(mal_context* pContext, mal_enum_devices_callback_proc callback, void* pUserData); // Return false from the callback to stop enumeration. mal_bool32 (* onDeviceIDEqual )(mal_context* pContext, const mal_device_id* pID0, const mal_device_id* pID1);
mal_result (* onGetDeviceInfo)(mal_context* pContext, mal_device_type type, const mal_device_id* pDeviceID, mal_share_mode shareMode, mal_device_info* pDeviceInfo); mal_result (* onEnumDevices )(mal_context* pContext, mal_enum_devices_callback_proc callback, void* pUserData); // Return false from the callback to stop enumeration.
mal_result (* onGetDeviceInfo )(mal_context* pContext, mal_device_type type, const mal_device_id* pDeviceID, mal_share_mode shareMode, mal_device_info* pDeviceInfo);
mal_result (* onDeviceInit )(mal_context* pContext, mal_device_type type, mal_device_id* pDeviceID, const mal_device_config* pConfig, mal_device* pDevice);
void (* onDeviceUninit )(mal_device* pDevice);
mal_result (* onDeviceStart )(mal_device* pDevice);
mal_result (* onDeviceStop )(mal_device* pDevice);
mal_result (* onDeviceBreakMainLoop)(mal_device* pDevice);
mal_result (* onDeviceMainLoop )(mal_device* pDevice);
union union
{ {
...@@ -5760,50 +5767,6 @@ mal_result mal_context_get_device_info__wasapi(mal_context* pContext, mal_device ...@@ -5760,50 +5767,6 @@ mal_result mal_context_get_device_info__wasapi(mal_context* pContext, mal_device
#endif #endif
} }
mal_result mal_context_init__wasapi(mal_context* pContext)
{
mal_assert(pContext != NULL);
(void)pContext;
mal_result result = MAL_SUCCESS;
#ifdef MAL_WIN32_DESKTOP
// WASAPI is only supported in Vista SP1 and newer. The reason for SP1 and not the base version of Vista is that event-driven
// exclusive mode does not work until SP1.
mal_OSVERSIONINFOEXW osvi;
mal_zero_object(&osvi);
osvi.dwOSVersionInfoSize = sizeof(osvi);
osvi.dwMajorVersion = HIBYTE(_WIN32_WINNT_VISTA);
osvi.dwMinorVersion = LOBYTE(_WIN32_WINNT_VISTA);
osvi.wServicePackMajor = 1;
if (VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL), VER_MINORVERSION, VER_GREATER_EQUAL), VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL))) {
result = MAL_SUCCESS;
} else {
result = MAL_NO_BACKEND;
}
#endif
if (result != MAL_SUCCESS) {
return result;
}
pContext->onDeviceIDEqual = mal_context_is_device_id_equal__wasapi;
pContext->onEnumDevices = mal_context_enumerate_devices__wasapi;
pContext->onGetDeviceInfo = mal_context_get_device_info__wasapi;
return result;
}
mal_result mal_context_uninit__wasapi(mal_context* pContext)
{
mal_assert(pContext != NULL);
mal_assert(pContext->backend == mal_backend_wasapi);
(void)pContext;
return MAL_SUCCESS;
}
void mal_device_uninit__wasapi(mal_device* pDevice) void mal_device_uninit__wasapi(mal_device* pDevice)
{ {
mal_assert(pDevice != NULL); mal_assert(pDevice != NULL);
...@@ -6349,6 +6312,56 @@ mal_result mal_device__main_loop__wasapi(mal_device* pDevice) ...@@ -6349,6 +6312,56 @@ mal_result mal_device__main_loop__wasapi(mal_device* pDevice)
return MAL_SUCCESS; return MAL_SUCCESS;
} }
mal_result mal_context_uninit__wasapi(mal_context* pContext)
{
mal_assert(pContext != NULL);
mal_assert(pContext->backend == mal_backend_wasapi);
(void)pContext;
return MAL_SUCCESS;
}
mal_result mal_context_init__wasapi(mal_context* pContext)
{
mal_assert(pContext != NULL);
(void)pContext;
mal_result result = MAL_SUCCESS;
#ifdef MAL_WIN32_DESKTOP
// WASAPI is only supported in Vista SP1 and newer. The reason for SP1 and not the base version of Vista is that event-driven
// exclusive mode does not work until SP1.
mal_OSVERSIONINFOEXW osvi;
mal_zero_object(&osvi);
osvi.dwOSVersionInfoSize = sizeof(osvi);
osvi.dwMajorVersion = HIBYTE(_WIN32_WINNT_VISTA);
osvi.dwMinorVersion = LOBYTE(_WIN32_WINNT_VISTA);
osvi.wServicePackMajor = 1;
if (VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL), VER_MINORVERSION, VER_GREATER_EQUAL), VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL))) {
result = MAL_SUCCESS;
} else {
result = MAL_NO_BACKEND;
}
#endif
if (result != MAL_SUCCESS) {
return result;
}
pContext->onUninit = mal_context_uninit__wasapi;
pContext->onDeviceIDEqual = mal_context_is_device_id_equal__wasapi;
pContext->onEnumDevices = mal_context_enumerate_devices__wasapi;
pContext->onGetDeviceInfo = mal_context_get_device_info__wasapi;
pContext->onDeviceInit = mal_device_init__wasapi;
pContext->onDeviceUninit = mal_device_uninit__wasapi;
pContext->onDeviceStart = mal_device__start_backend__wasapi;
pContext->onDeviceStop = mal_device__stop_backend__wasapi;
pContext->onDeviceBreakMainLoop = mal_device__break_main_loop__wasapi;
pContext->onDeviceMainLoop = mal_device__main_loop__wasapi;
return result;
}
#endif #endif
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
...@@ -17345,7 +17358,7 @@ mal_result mal_device__start_backend(mal_device* pDevice) ...@@ -17345,7 +17358,7 @@ mal_result mal_device__start_backend(mal_device* pDevice)
mal_result result = MAL_NO_BACKEND; mal_result result = MAL_NO_BACKEND;
#ifdef MAL_HAS_WASAPI #ifdef MAL_HAS_WASAPI
if (pDevice->pContext->backend == mal_backend_wasapi) { if (pDevice->pContext->backend == mal_backend_wasapi) {
result = mal_device__start_backend__wasapi(pDevice); result = pDevice->pContext->onDeviceStart(pDevice);
} }
#endif #endif
#ifdef MAL_HAS_DSOUND #ifdef MAL_HAS_DSOUND
...@@ -17394,7 +17407,7 @@ mal_result mal_device__stop_backend(mal_device* pDevice) ...@@ -17394,7 +17407,7 @@ mal_result mal_device__stop_backend(mal_device* pDevice)
mal_result result = MAL_NO_BACKEND; mal_result result = MAL_NO_BACKEND;
#ifdef MAL_HAS_WASAPI #ifdef MAL_HAS_WASAPI
if (pDevice->pContext->backend == mal_backend_wasapi) { if (pDevice->pContext->backend == mal_backend_wasapi) {
result = mal_device__stop_backend__wasapi(pDevice); result = pDevice->pContext->onDeviceStop(pDevice);
} }
#endif #endif
#ifdef MAL_HAS_DSOUND #ifdef MAL_HAS_DSOUND
...@@ -17443,7 +17456,7 @@ mal_result mal_device__break_main_loop(mal_device* pDevice) ...@@ -17443,7 +17456,7 @@ mal_result mal_device__break_main_loop(mal_device* pDevice)
mal_result result = MAL_NO_BACKEND; mal_result result = MAL_NO_BACKEND;
#ifdef MAL_HAS_WASAPI #ifdef MAL_HAS_WASAPI
if (pDevice->pContext->backend == mal_backend_wasapi) { if (pDevice->pContext->backend == mal_backend_wasapi) {
result = mal_device__break_main_loop__wasapi(pDevice); result = pDevice->pContext->onDeviceBreakMainLoop(pDevice);
} }
#endif #endif
#ifdef MAL_HAS_DSOUND #ifdef MAL_HAS_DSOUND
...@@ -17492,7 +17505,7 @@ mal_result mal_device__main_loop(mal_device* pDevice) ...@@ -17492,7 +17505,7 @@ mal_result mal_device__main_loop(mal_device* pDevice)
mal_result result = MAL_NO_BACKEND; mal_result result = MAL_NO_BACKEND;
#ifdef MAL_HAS_WASAPI #ifdef MAL_HAS_WASAPI
if (pDevice->pContext->backend == mal_backend_wasapi) { if (pDevice->pContext->backend == mal_backend_wasapi) {
result = mal_device__main_loop__wasapi(pDevice); result = pDevice->pContext->onDeviceMainLoop(pDevice);
} }
#endif #endif
#ifdef MAL_HAS_DSOUND #ifdef MAL_HAS_DSOUND
...@@ -17928,7 +17941,7 @@ mal_result mal_context_uninit(mal_context* pContext) ...@@ -17928,7 +17941,7 @@ mal_result mal_context_uninit(mal_context* pContext)
#ifdef MAL_HAS_WASAPI #ifdef MAL_HAS_WASAPI
case mal_backend_wasapi: case mal_backend_wasapi:
{ {
mal_context_uninit__wasapi(pContext); pContext->onUninit(pContext);
} break; } break;
#endif #endif
#ifdef MAL_HAS_DSOUND #ifdef MAL_HAS_DSOUND
...@@ -18274,7 +18287,7 @@ mal_result mal_device_init(mal_context* pContext, mal_device_type type, mal_devi ...@@ -18274,7 +18287,7 @@ mal_result mal_device_init(mal_context* pContext, mal_device_type type, mal_devi
#ifdef MAL_HAS_WASAPI #ifdef MAL_HAS_WASAPI
case mal_backend_wasapi: case mal_backend_wasapi:
{ {
result = mal_device_init__wasapi(pContext, type, pDeviceID, &config, pDevice); result = pContext->onDeviceInit(pContext, type, pDeviceID, &config, pDevice);
} break; } break;
#endif #endif
#ifdef MAL_HAS_DSOUND #ifdef MAL_HAS_DSOUND
...@@ -18496,7 +18509,7 @@ void mal_device_uninit(mal_device* pDevice) ...@@ -18496,7 +18509,7 @@ void mal_device_uninit(mal_device* pDevice)
#ifdef MAL_HAS_WASAPI #ifdef MAL_HAS_WASAPI
if (pDevice->pContext->backend == mal_backend_wasapi) { if (pDevice->pContext->backend == mal_backend_wasapi) {
mal_device_uninit__wasapi(pDevice); pDevice->pContext->onDeviceUninit(pDevice);
} }
#endif #endif
#ifdef MAL_HAS_DSOUND #ifdef MAL_HAS_DSOUND
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment