上一篇文章,介绍了OpenNI2底层与OpenCore的交互API以及各个驱动加载的过程,这篇文章介绍下OpenNI2底层驱动的实现;
上文中我们了解到底层驱动需要实现三个类DriverBase、DeviceBase、StreamBase,下面分析下各个类包含的功能同时结合DummyDevice分析下具体流程;
DriverBase
DriverServices 用于记录log
DriverBase 用于管理Device,包括设备发现,设备状态上报,以及deviceOpen、deviceClose等操作;
在DummyDevice 中 OzDriver 有一个m_devices的成员,用于保存连接在系统的设备信息,deviceOpen时会遍历其中的元素匹配uri,然后创建device后返回给OpenCore;m_devices中元素是在tryDevice中加入的;tryDevice扮演着设备发现的角色,在有些实现中是通过线程来发现设备的。
// log recorder
class DriverServices
{
public:
DriverServices(OniDriverServices* pDriverServices) : m_pDriverServices(pDriverServices) {}
void errorLoggerAppend(const char* format, ...)
void errorLoggerClear()
void log(int severity, const char* file, int line, const char* mask, const char* message)
private:
OniDriverServices* m_pDriverServices;
};
class DriverBase
{
public:
// 构造函数中传递记录log的DriverServices
DriverBase(OniDriverServices* pDriverServices) : m_services(pDriverServices)
{}
virtual ~DriverBase() {}
// 注册用于设备发现和状态上报的三个回调函数
virtual OniStatus initialize(DeviceConnectedCallback connectedCallback, DeviceDisconnectedCallback disconnectedCallback, DeviceStateChangedCallback deviceStateChangedCallback, void* pCookie)
{
m_deviceConnectedEvent = connectedCallback;
m_deviceDisconnectedEvent = disconnectedCallback;
m_deviceStateChangedEvent = deviceStateChangedCallback;
m_pCookie = pCookie;
return ONI_STATUS_OK;
}
// 设备打开和关闭操作
virtual DeviceBase* deviceOpen(const char* uri, const char* mode) = 0;
virtual void deviceClose(DeviceBase* pDevice) = 0;
virtual void shutdown() = 0;
virtual OniStatus tryDevice(const