DeviceManager
中央设备管理器,用于穷举所有连接的 StreamDock 设备。必须创建此类的实例才能检测和使用 StreamDock 设备。
获取设备管理器实例
DeviceManager 使用单例模式,通过以下方式获取实例:
DeviceManager &manager = DeviceManager::instance();
enumerate()
检测连接的 StreamDock 设备。
返回一个包含所有连接的 StreamDock 设备的map,其中key为设备路径,value为设备对象。
manager.enumerator();
auto streamDocks = manager.getStreamDocks();
listen()
监听有无新的设备连接或者有设备断开。
在Linux平台上,此方法使用libudev监听设备插拔事件。
在Windows平台上,此方法使用Windows消息机制(WM_DEVICECHANGE)监听设备插拔事件。
stopListen()
停止设备监听线程。
manager.stopListen();
getStreamDocks()
获取当前所有连接的StreamDock设备。
auto& streamDocks = manager.getStreamDocks();
for (const auto& device : streamDocks) {
// device.first 是设备路径
// device.second 是设备对象
auto devicePath = device.first;
auto streamDock = device.second;
}
异步事件处理
// 启动设备读取循环
device->reader()->startReadLoop();
// 注册按键事件回调
device->reader()->registerReadCallback(1, []() {
std::cout << "Key 1 pressed" << std::endl;
}, RegisterEvent::KeyPress);
// 注册旋钮事件回调
device->reader()->registerReadCallback(16, []() {
std::cout << "Knob left rotation" << std::endl;
}, RegisterEvent::KnobLeft);
设备热插拔监听和回调
| 平台 | 文件 | 函数 | 位置 | 用途 |
|---|---|---|---|---|
| windows | devicemanager_win.cpp | WindowProc | DBT_DEVICEARRIVAL分支 | 设备插入处理 |
| windows | devicemanager_win.cpp | WindowProc | DBT_DEVICEREMOVECOMPLETE分支 | 设备移除处理 |
| Linux | devicemanager_linux.cpp | listen | action == "add" 分支 | 设备插入处理 |
| Linux | devicemanager_linux.cpp | listen | action == "remove" 分支 | 设备移除处理 |
注意 :添加处理逻辑时要注意:
- 保持线程安全(使用现有的
streamdocksMutex_) - 避免阻塞事件循环
- 异常处理要包裹现有逻辑
