From 4a18756e4f3bc8c4af10fc3d6ce2363a46d1e44b Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Sat, 8 Apr 2023 06:17:30 +1000 Subject: osd/windows: Create single-threaded COM apartment on main thread. --- src/osd/modules/debugger/win/consolewininfo.cpp | 6 +++--- src/osd/modules/input/input_winhybrid.cpp | 23 ----------------------- src/osd/modules/sound/xaudio2_sound.cpp | 2 -- src/osd/windows/winmain.cpp | 4 ++++ src/osd/windows/winmain.h | 3 ++- 5 files changed, 9 insertions(+), 29 deletions(-) diff --git a/src/osd/modules/debugger/win/consolewininfo.cpp b/src/osd/modules/debugger/win/consolewininfo.cpp index 86635cd4153..1c70cb8e7a0 100644 --- a/src/osd/modules/debugger/win/consolewininfo.cpp +++ b/src/osd/modules/debugger/win/consolewininfo.cpp @@ -126,7 +126,7 @@ void choose_image(device_image_interface &device, HWND owner, REFCLSID class_id, // create file dialog Microsoft::WRL::ComPtr dialog; - hr = CoCreateInstance(class_id, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(dialog.GetAddressOf())); + hr = CoCreateInstance(class_id, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&dialog)); // set file types if (SUCCEEDED(hr)) @@ -159,7 +159,7 @@ void choose_image(device_image_interface &device, HWND owner, REFCLSID class_id, // FIXME: strip off archive names - opening a file inside an archive decompresses it to a temporary location std::wstring wfull = osd::text::to_wstring(full); Microsoft::WRL::ComPtr item; - if (SUCCEEDED(SHCreateItemFromParsingName(wfull.c_str(), nullptr, IID_PPV_ARGS(item.GetAddressOf())))) + if (SUCCEEDED(SHCreateItemFromParsingName(wfull.c_str(), nullptr, IID_PPV_ARGS(&item)))) { //dialog->SetFolder(item); disabled until } @@ -176,7 +176,7 @@ void choose_image(device_image_interface &device, HWND owner, REFCLSID class_id, if (SUCCEEDED(hr)) { Microsoft::WRL::ComPtr result; - hr = dialog->GetResult(result.GetAddressOf()); + hr = dialog->GetResult(&result); if (SUCCEEDED(hr)) { PWSTR selection = nullptr; diff --git a/src/osd/modules/input/input_winhybrid.cpp b/src/osd/modules/input/input_winhybrid.cpp index 7a6b840020d..2f1023e24fb 100644 --- a/src/osd/modules/input/input_winhybrid.cpp +++ b/src/osd/modules/input/input_winhybrid.cpp @@ -288,29 +288,6 @@ private: { xinput_deviceids.clear(); - // CoInit if needed - class com_helper - { - public: - com_helper() - { - switch (CoInitialize(nullptr)) - { - case S_OK: - case S_FALSE: - m_succeeded = true; - } - } - ~com_helper() - { - if (m_succeeded) - CoUninitialize(); - } - private: - bool m_succeeded = false; - }; - com_helper cominit; - HRESULT hr; // Create WMI diff --git a/src/osd/modules/sound/xaudio2_sound.cpp b/src/osd/modules/sound/xaudio2_sound.cpp index 15352ebc1b4..d0243ba1267 100644 --- a/src/osd/modules/sound/xaudio2_sound.cpp +++ b/src/osd/modules/sound/xaudio2_sound.cpp @@ -292,8 +292,6 @@ int sound_xaudio2::init(osd_interface &osd, osd_options const &options) m_sample_rate = options.sample_rate(); m_audio_latency = options.audio_latency(); - CoInitializeEx(nullptr, COINIT_MULTITHREADED); - // Create the IXAudio2 object HR_GOERR(OSD_DYNAMIC_CALL(XAudio2Create, m_xAudio2.GetAddressOf(), 0, XAUDIO2_DEFAULT_PROCESSOR)); diff --git a/src/osd/windows/winmain.cpp b/src/osd/windows/winmain.cpp index 2fd5894a6ab..f1df872456f 100644 --- a/src/osd/windows/winmain.cpp +++ b/src/osd/windows/winmain.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include @@ -269,6 +270,7 @@ void windows_osd_interface::output_oslog(const char *buffer) windows_osd_interface::windows_osd_interface(windows_options &options) : osd_common_t(options) , m_options(options) + , m_com_status(SUCCEEDED(CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED))) , m_last_event_check(std::chrono::steady_clock::time_point::min()) { } @@ -280,6 +282,8 @@ windows_osd_interface::windows_osd_interface(windows_options &options) windows_osd_interface::~windows_osd_interface() { + if (m_com_status) + CoUninitialize(); } diff --git a/src/osd/windows/winmain.h b/src/osd/windows/winmain.h index 22920b94bba..bb96ec2a3e4 100644 --- a/src/osd/windows/winmain.h +++ b/src/osd/windows/winmain.h @@ -98,7 +98,8 @@ private: virtual void osd_exit() override; static void output_oslog(const char *buffer); - windows_options & m_options; + windows_options &m_options; + bool const m_com_status; std::chrono::steady_clock::time_point m_last_event_check; -- cgit v1.2.3