1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
#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);
};
|