diff options
-rw-r--r-- | cv/camera-dialog.cpp | 13 | ||||
-rw-r--r-- | cv/camera-dialog.hpp | 8 | ||||
-rw-r--r-- | gui/main.cpp | 2 | ||||
-rw-r--r-- | opentrack-compat/camera-names.cpp | 9 | ||||
-rw-r--r-- | opentrack-dinput/dinput.cpp | 5 |
5 files changed, 11 insertions, 26 deletions
diff --git a/cv/camera-dialog.cpp b/cv/camera-dialog.cpp index 1be54ece..c3e8f6fe 100644 --- a/cv/camera-dialog.cpp +++ b/cv/camera-dialog.cpp @@ -20,27 +20,19 @@ void camera_dialog::maybe_grab_frame(cv::VideoCapture& cap) } } -#ifdef _WIN32 -void camera_dialog::init_com_threading() -{ - HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); - if (FAILED(hr)) - qDebug() << "failed CoInitializeEx" << hr << "code" << GetLastError(); -} -#endif - camera_dialog::~camera_dialog() {} void camera_dialog::open_camera_settings(cv::VideoCapture* cap, const QString& camera_name, QMutex* camera_mtx) { #ifdef _WIN32 + init_com_threading(com_apartment); + if (cap) { QMutexLocker l(camera_mtx); if (cap->isOpened()) { - init_com_threading(); maybe_grab_frame(*cap); cap->set(cv::CAP_PROP_SETTINGS, 1); return; @@ -54,7 +46,6 @@ void camera_dialog::open_camera_settings(cv::VideoCapture* cap, const QString& c if (!t.isSingleShot()) QObject::connect(&t, &QTimer::timeout, [&]() -> void { delete_capture(); }); - init_com_threading(); fake_capture = cv::VideoCapture(camera_name_to_index(camera_name)); maybe_grab_frame(fake_capture); fake_capture.set(cv::CAP_PROP_SETTINGS, 1); diff --git a/cv/camera-dialog.hpp b/cv/camera-dialog.hpp index 15ae2bc9..3fd853c3 100644 --- a/cv/camera-dialog.hpp +++ b/cv/camera-dialog.hpp @@ -10,6 +10,7 @@ #include "opentrack-compat/camera-names.hpp" #include "opentrack-compat/sleep.hpp" +#include "opentrack-compat/win32-com.hpp" #ifdef __linux # include <QProcess> @@ -17,9 +18,6 @@ #ifdef _WIN32 # include <QTimer> -# include <objbase.h> -# include <winerror.h> -# include <windows.h> #endif #include <opencv2/videoio.hpp> @@ -28,10 +26,6 @@ class camera_dialog { static void maybe_grab_frame(cv::VideoCapture& cap); -#ifdef _WIN32 - static void init_com_threading(); -#endif - public: virtual ~camera_dialog(); void open_camera_settings(cv::VideoCapture*, const QString&, QMutex*); diff --git a/gui/main.cpp b/gui/main.cpp index eb040337..a9252c4d 100644 --- a/gui/main.cpp +++ b/gui/main.cpp @@ -10,6 +10,7 @@ #include "main-window.hpp" #include "opentrack-compat/options.hpp" +#include "opentrack-compat/win32-com.hpp" using namespace options; #include <QApplication> #include <QCommandLineParser> @@ -111,6 +112,7 @@ static void add_program_library_path() int main(int argc, char** argv) { #ifdef _WIN32 + init_com_threading(com_apartment); add_program_library_path(); #elif !defined(__linux) // workaround QTBUG-38598 diff --git a/opentrack-compat/camera-names.cpp b/opentrack-compat/camera-names.cpp index f17a259a..21ff3b52 100644 --- a/opentrack-compat/camera-names.cpp +++ b/opentrack-compat/camera-names.cpp @@ -2,8 +2,9 @@ #ifdef _WIN32 # define NO_DSHOW_STRSAFE -# include <windows.h> # include <dshow.h> +# include "win32-com.hpp" +# include <cwchar> #elif defined(__unix) || defined(__linux) || defined(__APPLE__) # include <unistd.h> #endif @@ -32,9 +33,7 @@ OPENTRACK_COMPAT_EXPORT QList<QString> get_camera_names() #if defined(_WIN32) // Create the System Device Enumerator. HRESULT hr; - hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); - if (FAILED(hr)) - qDebug() << "failed CoInitializeEx" << hr << GetLastError(); + init_com_threading(com_apartment); ICreateDevEnum *pSysDevEnum = NULL; hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void **)&pSysDevEnum); if (FAILED(hr)) @@ -61,7 +60,7 @@ OPENTRACK_COMPAT_EXPORT QList<QString> get_camera_names() if (SUCCEEDED(hr)) { // Display the name in your UI somehow. - QString str((QChar*)varName.bstrVal, wcslen(varName.bstrVal)); + QString str((QChar*)varName.bstrVal, int(std::wcslen(varName.bstrVal))); ret.append(str); } VariantClear(&varName); diff --git a/opentrack-dinput/dinput.cpp b/opentrack-dinput/dinput.cpp index 06b5e4f2..217df6a7 100644 --- a/opentrack-dinput/dinput.cpp +++ b/opentrack-dinput/dinput.cpp @@ -1,6 +1,7 @@ #ifdef _WIN32 #include "dinput.hpp" +#include "opentrack-compat/win32-com.hpp" #include <QDebug> std::atomic<int> dinput_handle::refcnt; @@ -9,9 +10,7 @@ dinput_handle::di_t dinput_handle::handle(dinput_handle::make_di()); LPDIRECTINPUT8& dinput_handle::init_di() { - HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); - if (FAILED(hr)) - qDebug() << "dinput: failed CoInitializeEx" << hr << GetLastError(); + init_com_threading(com_multithreaded); static LPDIRECTINPUT8 di_ = nullptr; if (di_ == nullptr) |