summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2023-04-08 06:17:30 +1000
committer Vas Crabb <vas@vastheman.com>2023-04-08 06:17:30 +1000
commit4a18756e4f3bc8c4af10fc3d6ce2363a46d1e44b (patch)
treec8d85afc035fa3620398db45f5e69af6878eff81
parent8994dbb3f692f03e8c5120d2b66bf135779c7c9d (diff)
osd/windows: Create single-threaded COM apartment on main thread.
-rw-r--r--src/osd/modules/debugger/win/consolewininfo.cpp6
-rw-r--r--src/osd/modules/input/input_winhybrid.cpp23
-rw-r--r--src/osd/modules/sound/xaudio2_sound.cpp2
-rw-r--r--src/osd/windows/winmain.cpp4
-rw-r--r--src/osd/windows/winmain.h3
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<IFileDialog> 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<IShellItem> 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<IShellItem> 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 <windows.h>
#include <commctrl.h>
#include <mmsystem.h>
+#include <objbase.h>
#include <tchar.h>
#include <io.h>
@@ -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;