Initialize COM only once, globally
This commit is contained in:
parent
d3210b87ae
commit
0cff7eefa7
|
@ -589,7 +589,6 @@ static void *wasapi_init(const char *dev_id, unsigned rate, unsigned latency,
|
||||||
unsigned u1, unsigned *u2)
|
unsigned u1, unsigned *u2)
|
||||||
{
|
{
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
bool com_initialized = false;
|
|
||||||
UINT32 frame_count = 0;
|
UINT32 frame_count = 0;
|
||||||
REFERENCE_TIME dev_period = 0;
|
REFERENCE_TIME dev_period = 0;
|
||||||
BYTE *dest = NULL;
|
BYTE *dest = NULL;
|
||||||
|
@ -601,11 +600,6 @@ static void *wasapi_init(const char *dev_id, unsigned rate, unsigned latency,
|
||||||
|
|
||||||
WASAPI_CHECK(w, "Out of memory", return NULL);
|
WASAPI_CHECK(w, "Out of memory", return NULL);
|
||||||
|
|
||||||
hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
|
|
||||||
WASAPI_HR_CHECK(hr, "CoInitializeEx", goto error);
|
|
||||||
|
|
||||||
com_initialized = true;
|
|
||||||
|
|
||||||
w->device = wasapi_init_device(dev_id);
|
w->device = wasapi_init_device(dev_id);
|
||||||
if (!w->device && dev_id)
|
if (!w->device && dev_id)
|
||||||
w->device = wasapi_init_device(NULL);
|
w->device = wasapi_init_device(NULL);
|
||||||
|
@ -685,8 +679,6 @@ error:
|
||||||
if (w->buffer)
|
if (w->buffer)
|
||||||
fifo_free(w->buffer);
|
fifo_free(w->buffer);
|
||||||
free(w);
|
free(w);
|
||||||
if (com_initialized)
|
|
||||||
CoUninitialize();
|
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -898,7 +890,6 @@ static void wasapi_free(void *wh)
|
||||||
_IAudioClient_Stop(w->client);
|
_IAudioClient_Stop(w->client);
|
||||||
WASAPI_RELEASE(w->client);
|
WASAPI_RELEASE(w->client);
|
||||||
WASAPI_RELEASE(w->device);
|
WASAPI_RELEASE(w->device);
|
||||||
CoUninitialize();
|
|
||||||
if (w->buffer)
|
if (w->buffer)
|
||||||
fifo_free(w->buffer);
|
fifo_free(w->buffer);
|
||||||
free(w);
|
free(w);
|
||||||
|
|
|
@ -201,11 +201,6 @@ static xaudio2_t *xaudio2_new(unsigned samplerate, unsigned channels,
|
||||||
{
|
{
|
||||||
xaudio2_t *handle = NULL;
|
xaudio2_t *handle = NULL;
|
||||||
WAVEFORMATEX wfx = {0};
|
WAVEFORMATEX wfx = {0};
|
||||||
#if !defined(_XBOX) && !defined(__WINRT__)
|
|
||||||
HRESULT hr = CoInitialize(NULL);
|
|
||||||
if (FAILED(hr))
|
|
||||||
return NULL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__cplusplus) && !defined(CINTERFACE)
|
#if defined(__cplusplus) && !defined(CINTERFACE)
|
||||||
handle = new xaudio2;
|
handle = new xaudio2;
|
||||||
|
@ -256,9 +251,6 @@ static xaudio2_t *xaudio2_new(unsigned samplerate, unsigned channels,
|
||||||
|
|
||||||
error:
|
error:
|
||||||
xaudio2_free(handle);
|
xaudio2_free(handle);
|
||||||
#if !defined(_XBOX) && !defined(__WINRT__)
|
|
||||||
CoUninitialize();
|
|
||||||
#endif
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -408,10 +400,6 @@ static void xa_free(void *data)
|
||||||
if (xa->xa)
|
if (xa->xa)
|
||||||
xaudio2_free(xa->xa);
|
xaudio2_free(xa->xa);
|
||||||
free(xa);
|
free(xa);
|
||||||
|
|
||||||
#if !defined(_XBOX) && !defined(__WINRT__)
|
|
||||||
CoUninitialize();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static size_t xa_write_avail(void *data)
|
static size_t xa_write_avail(void *data)
|
||||||
|
|
|
@ -109,6 +109,14 @@ int rarch_main(int argc, char *argv[], void *data)
|
||||||
const ui_application_t *ui_application = NULL;
|
const ui_application_t *ui_application = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !defined(HAVE_MAIN) && defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__)
|
||||||
|
if (FAILED(CoInitialize(NULL)))
|
||||||
|
{
|
||||||
|
RARCH_ERR("FATAL: Failed to initialize the COM interface\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
rarch_ctl(RARCH_CTL_PREINIT, NULL);
|
rarch_ctl(RARCH_CTL_PREINIT, NULL);
|
||||||
frontend_driver_init_first(args);
|
frontend_driver_init_first(args);
|
||||||
rarch_ctl(RARCH_CTL_INIT, NULL);
|
rarch_ctl(RARCH_CTL_INIT, NULL);
|
||||||
|
@ -157,6 +165,10 @@ int rarch_main(int argc, char *argv[], void *data)
|
||||||
ui_application->run(args);
|
ui_application->run(args);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !defined(HAVE_MAIN) && defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__)
|
||||||
|
CoUninitialize();
|
||||||
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -83,12 +83,6 @@ static void* win32_display_server_init(void)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
#ifdef HAS_TASKBAR_EXT
|
#ifdef HAS_TASKBAR_EXT
|
||||||
if (FAILED(CoInitialize(NULL)))
|
|
||||||
{
|
|
||||||
RARCH_ERR("COM initialization failed, ITaskbarList3 disabled\n");
|
|
||||||
return dispserv;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
/* When compiling in C++ mode, GUIDs are references instead of pointers */
|
/* When compiling in C++ mode, GUIDs are references instead of pointers */
|
||||||
hr = CoCreateInstance(CLSID_TaskbarList, NULL,
|
hr = CoCreateInstance(CLSID_TaskbarList, NULL,
|
||||||
|
@ -130,8 +124,6 @@ static void win32_display_server_destroy(void *data)
|
||||||
ITaskbarList3_Release(g_taskbarList);
|
ITaskbarList3_Release(g_taskbarList);
|
||||||
g_taskbarList = NULL;
|
g_taskbarList = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
CoUninitialize();
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (dispserv)
|
if (dispserv)
|
||||||
|
|
|
@ -98,8 +98,6 @@ void dinput_destroy_context(void)
|
||||||
|
|
||||||
IDirectInput8_Release(g_dinput_ctx);
|
IDirectInput8_Release(g_dinput_ctx);
|
||||||
g_dinput_ctx = NULL;
|
g_dinput_ctx = NULL;
|
||||||
|
|
||||||
CoUninitialize();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dinput_init_context(void)
|
bool dinput_init_context(void)
|
||||||
|
@ -107,12 +105,6 @@ bool dinput_init_context(void)
|
||||||
if (g_dinput_ctx)
|
if (g_dinput_ctx)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (FAILED(CoInitialize(NULL)))
|
|
||||||
{
|
|
||||||
RARCH_ERR("[DINPUT]: Failed to initialize the COM interface\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Who said we shouldn't have same call signature in a COM API? <_< */
|
/* Who said we shouldn't have same call signature in a COM API? <_< */
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
if (!(SUCCEEDED(DirectInput8Create(
|
if (!(SUCCEEDED(DirectInput8Create(
|
||||||
|
@ -131,7 +123,6 @@ bool dinput_init_context(void)
|
||||||
|
|
||||||
error:
|
error:
|
||||||
RARCH_ERR("[DINPUT]: Failed to initialize DirectInput.\n");
|
RARCH_ERR("[DINPUT]: Failed to initialize DirectInput.\n");
|
||||||
CoUninitialize();
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue