在Mac OS X用户空间中支持游戏手柄和操纵杆

7
我已经搜索了几天如何在Mac上实现游戏手柄和操纵杆支持,所有我找到的资源似乎都建议使用预安装的驱动程序以及使用苹果的HID API,这很有效。但是这种方法的缺点是每个操纵杆和游戏手柄都需要另一个内核扩展来加载,以便被HID管理器识别,或者至少有一个不含代码的Info.plist文件,表明它符合先前安装的驱动程序。例如,当我在家里有一个360 Xbox驱动程序KEXT时,Microsoft的Xbox控制器可以使用,但Logitech的F710则不能。
苹果建议使用游戏手柄或操纵杆的应用程序应该能够在用户空间自己完成,而不引入任何KEXT相关的东西。有没有一种方法可以做到这一点呢?
我想到的是使用IORegistry或IOUSB API,在设备插入时获取设备,然后以某种方式获取设备的描述,然后使用该描述将设备注册为HID设备。然后就可以使用整个HID管理器了。

我是否走在正确的道路上?或者还有其他方法可以做到这一点?

由于IOKit API实际上提供了像kHIDUsage_GD_Joystick这样的关键字,而且还有一个ForceFeedback.h库,我认为苹果设计他们的HID API时考虑了操纵杆和力反馈。这是我抱有的微弱希望,认为这可能有效。

一些参考文献和开源项目:


我手头没有相关的硬件,但你是否尝试过在IORegistryExplorer(或ioreg)中查看各种游戏手柄的IOService节点,以了解它们的共同点?然后,相应地在您的应用/库中过滤设备。 - pmdj
抱歉回复晚了。我手头有两个游戏手柄,一个是微软的360控制器,另一个是powerA的。一些值是共享的,但我没有看到如何确定游戏手柄的配置(按钮数量、摇杆数量等)。 - vgrimmer
两个控制器共同拥有的一个特点可能是“USB产品名称”都是“控制器”。虽然我有点怀疑盲目信任字符串值,但无论如何,似乎我需要从IOService和IOUsb空间获取更多知识来确定是否可行。当我有更多时间来处理这个问题时,我会更新这个问题。现在,HID管理器可以与驱动程序一起使用 :) - vgrimmer
1个回答

2
经过重新审视,我发现解决方案是直接操作设备的文件描述符。libusb是一个非常好的库,它极大地简化了这个过程,并且它们支持Mac。
xboxdrv link 是使用libusb操作文件套接字的很好的例子。
伪代码应该如下所示:
  1. 枚举设备
  2. 检测内核驱动程序并尝试分离它
  3. 打开设备
  4. 进行初始传输
  5. 等待回调函数处理消息和错误
  6. 启动运行循环或选择fd以调用libusb_event_handle
请查看 link 以获取有关libusb的更多信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接