Поддержка геймпада и джойстика на Mac OS X в пространстве пользователя

Я искал, как сделать поддержку геймпада и джойстика на Mac в течение нескольких дней, и все ресурсы, которые я нашел, похоже, предлагают предустановленный драйвер вместе с использованием HID API Apple, который работает.

недостатком этого подхода является то, что каждый джойстик и геймпад требуют загрузки другого расширения ядра, поэтому его может распознать HID manager или, по крайней мере, код меньше Info.plist говоря, что он соответствует ранее установленному драйверу. Например, когда у меня есть драйвер 360 Xbox KEXT в доме будет работать контроллер Xbox от Microsoft, но не Logitech (я попробовал F710).

как Apple предлагает приложение, которое использует геймпад или джойстик, должно иметь возможность делать себя в пользовательском пространстве без введения каких-либо материалов KEXT. Есть ли способ сделать это?

то, что я имел в виду, было что-то вроде использования IOREGISTRY или IOUSB API, чтобы получить устройство, когда они подключаются (USB Prober показывает его на наименьший.) Затем как-то получить описание устройства, а затем использовать это описание, чтобы зарегистрировать устройство как скрытый. Тогда можно использовать весь менеджер HID.

Я на правильном пути? Или есть другой способ сделать это?

поскольку IOKit API фактически предоставил ключевые слова, такие как kHIDUsage_GD_Joystick, и есть принудительная обратная связь.H library, я полагаю, Apple разработала свой HID API с джойстиком и силовой обратной связью. У меня была слабая надежда, что это возможно. работа.

некоторая справочная документация и проект с открытым исходным кодом:

1 ответов


после пересмотра этого я обнаружил, что решение работает непосредственно на файловых дескрипторах устройства. libusb-отличная библиотека, которая значительно упрощает вашу жизнь, и они поддерживают Mac.

xboxdrv ссылке - отличный пример работы с файловым сокетом с помощью libusb.

в псевдо-коде это должно выглядеть так:

  1. перечислить устройства
  2. обнаружить драйвер ядра и отсоединить его, если возможно
  3. открыть устройство
  4. файл с начальной передачи
  5. подождите функции обратного вызова для правильной обработки msg и ошибки
  6. запустить цикл запуска или выбрать FD для вызова libusb_event_handle

Проверьте libusb для получения дополнительной информации ссылке.