12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- #pragma once
- #include <obs-module.h>
- #include "platform.hpp"
- #include <vector>
- #include <mutex>
- class DeckLinkDevice;
- typedef void (*DeviceChangeCallback)(void *param, DeckLinkDevice *device, bool added);
- struct DeviceChangeInfo {
- DeviceChangeCallback callback;
- void *param;
- };
- class DeckLinkDeviceDiscovery : public IDeckLinkDeviceNotificationCallback {
- protected:
- ComPtr<IDeckLinkDiscovery> discovery;
- long refCount = 1;
- bool initialized = false;
- std::recursive_mutex deviceMutex;
- std::vector<DeckLinkDevice *> devices;
- std::vector<DeviceChangeInfo> callbacks;
- public:
- DeckLinkDeviceDiscovery();
- virtual ~DeckLinkDeviceDiscovery(void);
- bool Init();
- HRESULT STDMETHODCALLTYPE DeckLinkDeviceArrived(IDeckLink *device);
- HRESULT STDMETHODCALLTYPE DeckLinkDeviceRemoved(IDeckLink *device);
- inline void AddCallback(DeviceChangeCallback callback, void *param)
- {
- std::lock_guard<std::recursive_mutex> lock(deviceMutex);
- DeviceChangeInfo info;
- info.callback = callback;
- info.param = param;
- for (DeviceChangeInfo &curCB : callbacks) {
- if (curCB.callback == callback && curCB.param == param)
- return;
- }
- callbacks.push_back(info);
- }
- inline void RemoveCallback(DeviceChangeCallback callback, void *param)
- {
- std::lock_guard<std::recursive_mutex> lock(deviceMutex);
- for (size_t i = 0; i < callbacks.size(); i++) {
- DeviceChangeInfo &curCB = callbacks[i];
- if (curCB.callback == callback && curCB.param == param) {
- callbacks.erase(callbacks.begin() + i);
- return;
- }
- }
- }
- DeckLinkDevice *FindByHash(const char *hash);
- inline void Lock() { deviceMutex.lock(); }
- inline void Unlock() { deviceMutex.unlock(); }
- inline const std::vector<DeckLinkDevice *> &GetDevices() const { return devices; }
- ULONG STDMETHODCALLTYPE AddRef(void);
- HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, LPVOID *ppv);
- ULONG STDMETHODCALLTYPE Release(void);
- };
|