obs-studio/build_dependencies/aja/include/ajalibraries/ajabase/pnp/mac/devicenotifier.h

97 lines
3.2 KiB
C
Raw Normal View History

2023-03-04 18:33:16 +01:00
/* SPDX-License-Identifier: MIT */
/**
@file devicenotifier.h
@brief Declares the MacOS-specific KonaNotifier and DeviceNotifier classes, which invoke
a client-registered callback function when devices are attached and/or detached.
@copyright (C) 2011-2021 AJA Video Systems, Inc.
**/
#if !defined (__DEVICE_NOTIFIER_H__)
#define __DEVICE_NOTIFIER_H__
#include <CoreFoundation/CoreFoundation.h>
#include <Carbon/Carbon.h>
#include <IOKit/IOMessage.h>
#include <IOKit/usb/IOUSBLib.h>
#include <vector>
#include <map>
#include <list>
#define kAJADeviceInitialOpen 0xAA1
#define kAJADeviceTerminate 0xAA2
/**
@brief Mac-specific device add/change/remove event notification callback function.
**/
typedef void (*DeviceClientCallback)(unsigned long message, void * refcon);
/**
@brief Mac-specific class that notifies clients when AJA devices are attached/detached, etc.
**/
class DeviceNotifier
{
// Instance Methods
public:
DeviceNotifier (DeviceClientCallback callback, void *refcon);
virtual ~DeviceNotifier ();
virtual bool Install (CFMutableDictionaryRef dict = NULL);
virtual void Uninstall ();
// alternate way to set callback
virtual void SetCallback (DeviceClientCallback callback, void *refcon);
protected:
// override these
inline virtual CFMutableDictionaryRef CreateMatchingDictionary () {return NULL;}
virtual CFMutableDictionaryRef CreateMatchingDictionary (CFStringRef deviceDriverName);
// callbacks
virtual void DeviceAdded (io_iterator_t iterator);
virtual void DeviceRemoved (io_iterator_t iterator);
virtual void DeviceChanged (io_service_t unitService, natural_t messageType, void* message);
// util
virtual void AddGeneralInterest (io_object_t service);
// Class Methods
public:
//static void SetDebugLogging (const uint64_t inWhichUserClientCommands);
static std::string MessageTypeToStr (const natural_t messageType);
// Non-Public Class Methods
static void DeviceAddedCallback ( DeviceNotifier* thisObject, io_iterator_t iterator);
static void DeviceRemovedCallback ( DeviceNotifier* thisObject, io_iterator_t iterator);
static void DeviceChangedCallback ( DeviceNotifier * thisObject,
io_service_t unitService,
natural_t messageType,
void * message);
// Instance Data
protected:
void * m_refcon;
DeviceClientCallback m_clientCallback;
mach_port_t m_masterPort;
IONotificationPortRef m_notificationPort;
CFMutableDictionaryRef m_matchingDictionary;
std::list<io_object_t> m_deviceMatchList;
std::list<io_object_t> m_deviceInterestList;
}; // DeviceNotifier
/**
@brief Subclass of DeviceNotifier that notifies clients when Kona/Corvid/Io/TTap devices are attached/detached.
**/
class KonaNotifier : public DeviceNotifier
{
public:
inline KonaNotifier (DeviceClientCallback callback, void *refcon)
: DeviceNotifier (callback, refcon) {}
inline virtual ~KonaNotifier () {}
virtual bool Install (CFMutableDictionaryRef dict = NULL);
};
#endif // __DEVICE_NOTIFIER_H__