我正在为USB视频捕获设备开发驱动程序。首先,我开始使用CoreMediaIO样本:
https://developer.apple.com/library/content/samplecode/CoreMediaIO/Introduction/Intro.html
内核扩展基于IOVideoSample。它从USB设备获取数据并发送给助手。 Kext具有基于USB设备的IOKitPersonalities。所以设备是真实的,应该支持HotPlug。 Kext主类在插入设备时加载,在设备插入时卸载。
SampleAssistant仅更改为检测我的kext类。 PlugIn具有NoCMIOHardwarePluginLazyLoadingInfo
属性。
当所有视频捕获应用程序都关闭时 - hotplug运行良好。正在从kext调用终止函数,并且正在卸载kext对象而没有任何问题。
即使您使用设备中的流启动视频捕获应用,然后关闭它并插入设备 - hotplug也可以。
适用于QuickTime播放器。它可以找到一个流并显示一个图像,但是有一个问题。
当QuickTime(或任何其他视频捕获应用)工作并显示来自设备的流时 - hotplug无法正常工作。如果您尝试插拔设备,它将保留在系统中,USB端口将无法正常工作,直到您重新启动Mac。根据日志 - 终止功能根本没有被调用。似乎某些东西保留了与设备的链接。
我已经开始深入研究这个问题了。
首先,我发现SampleAssistant默认不支持hotplug。它仅通知设备到达(DeviceArrived)。我已添加"兴趣"仅通知和处理" kIOMessageSeviceIsTerminated"消息 - 执行DeviceRemoved函数并强制删除设备对象,但它没有帮助。
还有一个文件CMIO_DPA_Sample_Server_Stream.cpp
。如果你去Stream :: Start功能并删除" mIOSAStream.Open;
"和" mIOSAStream.Start();
" line - hotplug works。
您能告诉我们可以采取哪些措施来解决这个问题吗?