diff --git a/modules/juce_audio_devices/native/juce_win32_Midi.cpp b/modules/juce_audio_devices/native/juce_win32_Midi.cpp index bc03b9e2d9..b2eeb1ac9a 100644 --- a/modules/juce_audio_devices/native/juce_win32_Midi.cpp +++ b/modules/juce_audio_devices/native/juce_win32_Midi.cpp @@ -834,7 +834,7 @@ private: } } - WinRTWrapper::ComPtr> iter; + ComSmartPtr> iter; auto hr = requestedProperties->QueryInterface (__uuidof (IIterable), (void**) iter.resetAndGetPointerAddress()); if (FAILED (hr)) @@ -924,7 +924,7 @@ private: String getGUIDFromInspectable (IInspectable& inspectable) { - WinRTWrapper::ComPtr> guidRef; + ComSmartPtr> guidRef; auto hr = inspectable.QueryInterface (__uuidof (IReference), (void**) guidRef.resetAndGetPointerAddress()); @@ -951,7 +951,7 @@ private: bool getBoolFromInspectable (IInspectable& inspectable) { - WinRTWrapper::ComPtr> boolRef; + ComSmartPtr> boolRef; auto hr = inspectable.QueryInterface (__uuidof (IReference), (void**) boolRef.resetAndGetPointerAddress()); @@ -978,7 +978,7 @@ private: struct DeviceEnumerationThread : public Thread { DeviceEnumerationThread (DeviceCallbackHandler& h, - WinRTWrapper::ComPtr& w, + ComSmartPtr& w, EventRegistrationToken& added, EventRegistrationToken& removed, EventRegistrationToken& updated) @@ -1012,12 +1012,12 @@ private: } DeviceCallbackHandler& handler; - WinRTWrapper::ComPtr& watcher; + ComSmartPtr& watcher; EventRegistrationToken& deviceAddedToken, deviceRemovedToken, deviceUpdatedToken; }; //============================================================================== - WinRTWrapper::ComPtr watcher; + ComSmartPtr watcher; EventRegistrationToken deviceAddedToken { 0 }, deviceRemovedToken { 0 }, @@ -1222,7 +1222,7 @@ private: template struct MidiIODeviceWatcher final : private DeviceCallbackHandler { - MidiIODeviceWatcher (WinRTWrapper::ComPtr& comFactory) + MidiIODeviceWatcher (ComSmartPtr& comFactory) : factory (comFactory) { } @@ -1407,7 +1407,7 @@ private: return {}; } - WinRTWrapper::ComPtr& factory; + ComSmartPtr& factory; Array connectedDevices; CriticalSection deviceChanges; @@ -1421,8 +1421,8 @@ private: struct OpenMidiPortThread : public Thread { OpenMidiPortThread (String threadName, String midiDeviceID, - WinRTWrapper::ComPtr& comFactory, - WinRTWrapper::ComPtr& comPort) + ComSmartPtr& comFactory, + ComSmartPtr& comPort) : Thread (threadName), deviceID (midiDeviceID), factory (comFactory), @@ -1438,7 +1438,7 @@ private: void run() override { WinRTWrapper::ScopedHString hDeviceId (deviceID); - WinRTWrapper::ComPtr> asyncOp; + ComSmartPtr> asyncOp; auto hr = factory->FromIdAsync (hDeviceId.get(), asyncOp.resetAndGetPointerAddress()); if (FAILED (hr)) @@ -1466,8 +1466,8 @@ private: } const String deviceID; - WinRTWrapper::ComPtr& factory; - WinRTWrapper::ComPtr& port; + ComSmartPtr& factory; + ComSmartPtr& port; WaitableEvent portOpened { true }; }; @@ -1552,7 +1552,7 @@ private: BLEDeviceWatcher& bleDeviceWatcher; WinRTMIDIDeviceInfo deviceInfo; bool isBLEDevice = false; - WinRTWrapper::ComPtr midiPort; + ComSmartPtr midiPort; }; //============================================================================== @@ -1637,19 +1637,19 @@ private: if (! isStarted) return S_OK; - WinRTWrapper::ComPtr message; + ComSmartPtr message; auto hr = args->get_Message (message.resetAndGetPointerAddress()); if (FAILED (hr)) return hr; - WinRTWrapper::ComPtr buffer; + ComSmartPtr buffer; hr = message->get_RawData (buffer.resetAndGetPointerAddress()); if (FAILED (hr)) return hr; - WinRTWrapper::ComPtr bufferByteAccess; + ComSmartPtr bufferByteAccess; hr = buffer->QueryInterface (bufferByteAccess.resetAndGetPointerAddress()); if (FAILED (hr)) @@ -1775,15 +1775,15 @@ private: String getDeviceName() override { return deviceInfo.name; } //============================================================================== - WinRTWrapper::ComPtr buffer; - WinRTWrapper::ComPtr bufferByteAccess; + ComSmartPtr buffer; + ComSmartPtr bufferByteAccess; uint8_t* bufferData = nullptr; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WinRTOutputWrapper); }; - WinRTWrapper::ComPtr midiInFactory; - WinRTWrapper::ComPtr midiOutFactory; + ComSmartPtr midiInFactory; + ComSmartPtr midiOutFactory; std::unique_ptr> inputDeviceWatcher; std::unique_ptr> outputDeviceWatcher; diff --git a/modules/juce_events/native/juce_win32_WinRTWrapper.cpp b/modules/juce_events/native/juce_win32_WinRTWrapper.cpp index 5d9bf8f70f..b1a4abc377 100644 --- a/modules/juce_events/native/juce_win32_WinRTWrapper.cpp +++ b/modules/juce_events/native/juce_win32_WinRTWrapper.cpp @@ -23,37 +23,6 @@ namespace juce { -WinRTWrapper::ScopedHString::ScopedHString (String str) -{ - if (WinRTWrapper::getInstance()->isInitialised()) - WinRTWrapper::getInstance()->createHString (str.toWideCharPointer(), - static_cast (str.length()), - &hstr); -} - -WinRTWrapper::ScopedHString::~ScopedHString() -{ - if (WinRTWrapper::getInstance()->isInitialised() && hstr != nullptr) - WinRTWrapper::getInstance()->deleteHString (hstr); -} - -WinRTWrapper::~WinRTWrapper() -{ - if (winRTHandle != nullptr) - ::FreeLibrary (winRTHandle); - - clearSingletonInstance(); -} - -String WinRTWrapper::hStringToString (HSTRING hstr) -{ - if (isInitialised()) - if (const wchar_t* str = getHStringRawBuffer (hstr, nullptr)) - return String (str); - - return {}; -} - WinRTWrapper::WinRTWrapper() { winRTHandle = ::LoadLibraryA ("api-ms-win-core-winrt-l1-1-0"); @@ -76,6 +45,38 @@ WinRTWrapper::WinRTWrapper() initialised = ! (status != S_OK && status != S_FALSE && status != 0x80010106L); } +WinRTWrapper::~WinRTWrapper() +{ + if (winRTHandle != nullptr) + ::FreeLibrary (winRTHandle); + + clearSingletonInstance(); +} + +WinRTWrapper::ScopedHString::ScopedHString (String str) +{ + if (WinRTWrapper::getInstance()->isInitialised()) + WinRTWrapper::getInstance()->createHString (str.toWideCharPointer(), + static_cast (str.length()), + &hstr); +} + +WinRTWrapper::ScopedHString::~ScopedHString() +{ + if (WinRTWrapper::getInstance()->isInitialised() && hstr != nullptr) + WinRTWrapper::getInstance()->deleteHString (hstr); +} + +String WinRTWrapper::hStringToString (HSTRING hstr) +{ + if (isInitialised()) + if (const wchar_t* str = getHStringRawBuffer (hstr, nullptr)) + return String (str); + + return {}; +} + + JUCE_IMPLEMENT_SINGLETON (WinRTWrapper) } diff --git a/modules/juce_events/native/juce_win32_WinRTWrapper.h b/modules/juce_events/native/juce_win32_WinRTWrapper.h index 3133b39144..a5b01d79bf 100644 --- a/modules/juce_events/native/juce_win32_WinRTWrapper.h +++ b/modules/juce_events/native/juce_win32_WinRTWrapper.h @@ -26,78 +26,21 @@ namespace juce class WinRTWrapper : public DeletedAtShutdown { public: - class ScopedHString - { - public: - ScopedHString (String); - - ~ScopedHString(); - - HSTRING get() const noexcept { return hstr; } - - private: - HSTRING hstr = nullptr; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ScopedHString) - }; - - template - class ComPtr - { - public: - ComPtr() noexcept {} - ComPtr (ComClass* obj) : p (obj) { if (p) p->AddRef(); } - ComPtr (const ComPtr& other) : p (other.p) { if (p) p->AddRef(); } - ~ComPtr() { release(); } - - operator ComClass*() const noexcept { return p; } - ComClass* get() const noexcept { return p; } - ComClass& operator*() const noexcept { return *p; } - ComClass* operator->() const noexcept { return p; } - - ComPtr& operator= (ComClass* const newP) - { - if (newP != nullptr) - newP->AddRef(); - - release(); - p = newP; - return *this; - } - - ComPtr& operator= (const ComPtr& newP) { return operator= (newP.p); } - - ComClass** resetAndGetPointerAddress() - { - release(); - p = nullptr; - return &p; - } - - private: - ComClass* p = nullptr; - - void release() { if (p != nullptr) p->Release(); } - - ComClass** operator&() noexcept; // private to avoid it being used accidentally - }; + //============================================================================== + ~WinRTWrapper(); + bool isInitialised() const noexcept { return initialised; } JUCE_DECLARE_SINGLETON (WinRTWrapper, true) - ~WinRTWrapper(); - - String hStringToString (HSTRING); - - bool isInitialised() const noexcept { return initialised; } - + //============================================================================== template - ComPtr activateInstance (const wchar_t* runtimeClassID, REFCLSID classUUID) + ComSmartPtr activateInstance (const wchar_t* runtimeClassID, REFCLSID classUUID) { - ComPtr result; + ComSmartPtr result; if (isInitialised()) { - ComPtr inspectable; + ComSmartPtr inspectable; ScopedHString runtimeClass (runtimeClassID); auto hr = roActivateInstance (runtimeClass.get(), inspectable.resetAndGetPointerAddress()); @@ -109,9 +52,9 @@ public: } template - ComPtr getWRLFactory (const wchar_t* runtimeClassID) + ComSmartPtr getWRLFactory (const wchar_t* runtimeClassID) { - ComPtr comPtr; + ComSmartPtr comPtr; if (isInitialised()) { @@ -124,9 +67,27 @@ public: return comPtr; } + //============================================================================== + class ScopedHString + { + public: + ScopedHString (String); + ~ScopedHString(); + + HSTRING get() const noexcept { return hstr; } + + private: + HSTRING hstr = nullptr; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ScopedHString) + }; + + String hStringToString (HSTRING); + private: WinRTWrapper(); + //============================================================================== HMODULE winRTHandle = nullptr; bool initialised = false; @@ -143,6 +104,9 @@ private: WindowsGetStringRawBufferFuncPtr getHStringRawBuffer = nullptr; RoActivateInstanceFuncPtr roActivateInstance = nullptr; RoGetActivationFactoryFuncPtr roGetActivationFactory = nullptr; + + //============================================================================== + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WinRTWrapper) }; } // namespace juce