obs-studio/plugins/decklink/decklink-device-discovery.hpp
jp9000 f53df7da64 clang-format: Apply formatting
Code submissions have continually suffered from formatting
inconsistencies that constantly have to be addressed.  Using
clang-format simplifies this by making code formatting more consistent,
and allows automation of the code formatting so that maintainers can
focus more on the code itself instead of code formatting.
2019-06-23 23:49:10 -07:00

82 lines
1.9 KiB
C++

#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);
};