Commit fcdd14cd authored by David Reid's avatar David Reid

Fix crash when running on Windows 95.

It looks like CoInitializeEx() is not available on Windows 95. This
commit changes it so that if CoInitializeEx() cannot be found, such as
the case with Windows 95, it falls back to CoInitialize().

As of this commit, a crash still occurs when trying to initialize the
DirectSound backend. The WinMM backend works, however.
parent f648c9b2
...@@ -7375,6 +7375,7 @@ struct ma_context ...@@ -7375,6 +7375,7 @@ struct ma_context
struct struct
{ {
/*HMODULE*/ ma_handle hOle32DLL; /*HMODULE*/ ma_handle hOle32DLL;
ma_proc CoInitialize;
ma_proc CoInitializeEx; ma_proc CoInitializeEx;
ma_proc CoUninitialize; ma_proc CoUninitialize;
ma_proc CoCreateInstance; ma_proc CoCreateInstance;
...@@ -18097,6 +18098,7 @@ static ma_result ma_result_from_HRESULT(HRESULT hr) ...@@ -18097,6 +18098,7 @@ static ma_result ma_result_from_HRESULT(HRESULT hr)
} }
} }
typedef HRESULT (WINAPI * MA_PFN_CoInitialize)(LPVOID pvReserved);
typedef HRESULT (WINAPI * MA_PFN_CoInitializeEx)(LPVOID pvReserved, DWORD dwCoInit); typedef HRESULT (WINAPI * MA_PFN_CoInitializeEx)(LPVOID pvReserved, DWORD dwCoInit);
typedef void (WINAPI * MA_PFN_CoUninitialize)(void); typedef void (WINAPI * MA_PFN_CoUninitialize)(void);
typedef HRESULT (WINAPI * MA_PFN_CoCreateInstance)(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID *ppv); typedef HRESULT (WINAPI * MA_PFN_CoCreateInstance)(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID *ppv);
...@@ -19611,7 +19613,7 @@ WIN32 COMMON ...@@ -19611,7 +19613,7 @@ WIN32 COMMON
*******************************************************************************/ *******************************************************************************/
#if defined(MA_WIN32) #if defined(MA_WIN32)
#if defined(MA_WIN32_DESKTOP) #if defined(MA_WIN32_DESKTOP)
#define ma_CoInitializeEx(pContext, pvReserved, dwCoInit) ((MA_PFN_CoInitializeEx)pContext->win32.CoInitializeEx)(pvReserved, dwCoInit) #define ma_CoInitializeEx(pContext, pvReserved, dwCoInit) ((pContext->win32.CoInitializeEx) ? ((MA_PFN_CoInitializeEx)pContext->win32.CoInitializeEx)(pvReserved, dwCoInit) : ((MA_PFN_CoInitialize)pContext->win32.CoInitialize)(pvReserved))
#define ma_CoUninitialize(pContext) ((MA_PFN_CoUninitialize)pContext->win32.CoUninitialize)() #define ma_CoUninitialize(pContext) ((MA_PFN_CoUninitialize)pContext->win32.CoUninitialize)()
#define ma_CoCreateInstance(pContext, rclsid, pUnkOuter, dwClsContext, riid, ppv) ((MA_PFN_CoCreateInstance)pContext->win32.CoCreateInstance)(rclsid, pUnkOuter, dwClsContext, riid, ppv) #define ma_CoCreateInstance(pContext, rclsid, pUnkOuter, dwClsContext, riid, ppv) ((MA_PFN_CoCreateInstance)pContext->win32.CoCreateInstance)(rclsid, pUnkOuter, dwClsContext, riid, ppv)
#define ma_CoTaskMemFree(pContext, pv) ((MA_PFN_CoTaskMemFree)pContext->win32.CoTaskMemFree)(pv) #define ma_CoTaskMemFree(pContext, pv) ((MA_PFN_CoTaskMemFree)pContext->win32.CoTaskMemFree)(pv)
...@@ -40179,6 +40181,7 @@ static ma_result ma_context_init_backend_apis__win32(ma_context* pContext) ...@@ -40179,6 +40181,7 @@ static ma_result ma_context_init_backend_apis__win32(ma_context* pContext)
return MA_FAILED_TO_INIT_BACKEND; return MA_FAILED_TO_INIT_BACKEND;
} }
pContext->win32.CoInitialize = (ma_proc)ma_dlsym(pContext, pContext->win32.hOle32DLL, "CoInitialize");
pContext->win32.CoInitializeEx = (ma_proc)ma_dlsym(pContext, pContext->win32.hOle32DLL, "CoInitializeEx"); pContext->win32.CoInitializeEx = (ma_proc)ma_dlsym(pContext, pContext->win32.hOle32DLL, "CoInitializeEx");
pContext->win32.CoUninitialize = (ma_proc)ma_dlsym(pContext, pContext->win32.hOle32DLL, "CoUninitialize"); pContext->win32.CoUninitialize = (ma_proc)ma_dlsym(pContext, pContext->win32.hOle32DLL, "CoUninitialize");
pContext->win32.CoCreateInstance = (ma_proc)ma_dlsym(pContext, pContext->win32.hOle32DLL, "CoCreateInstance"); pContext->win32.CoCreateInstance = (ma_proc)ma_dlsym(pContext, pContext->win32.hOle32DLL, "CoCreateInstance");
...@@ -41259,7 +41262,6 @@ MA_API ma_result ma_device_init_ex(const ma_backend backends[], ma_uint32 backen ...@@ -41259,7 +41262,6 @@ MA_API ma_result ma_device_init_ex(const ma_backend backends[], ma_uint32 backen
allocationCallbacks = ma_allocation_callbacks_init_default(); allocationCallbacks = ma_allocation_callbacks_init_default();
} }
pContext = (ma_context*)ma_malloc(sizeof(*pContext), &allocationCallbacks); pContext = (ma_context*)ma_malloc(sizeof(*pContext), &allocationCallbacks);
if (pContext == NULL) { if (pContext == NULL) {
return MA_OUT_OF_MEMORY; return MA_OUT_OF_MEMORY;
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