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

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

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

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

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

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

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

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


person vgrimmer    schedule 10.10.2012    source источник
comment
У меня нет под рукой соответствующего оборудования, но пробовали ли вы взглянуть на узлы IOService для различных джойстиков / геймпадов в IORegistryExplorer (или ioreg), чтобы увидеть, что у них общего? Затем соответствующим образом отфильтруйте устройства в вашем приложении / библиотеке.   -  person pmdj    schedule 11.10.2012
comment
Извините за поздний ответ. У меня под рукой два геймпада, один контроллер 360 от Microsoft и один от powerA. Некоторые значения являются общими, но я не видел, как на самом деле определить конфигурацию геймпада (количество кнопок, номер джойстика и т. Д.).   -  person vgrimmer    schedule 16.10.2012
comment
У двух контроллеров есть одна общая черта - это, вероятно, имя USB Prodcut как Controller. Я немного подозрительно доверяю слепо строковому значению. В любом случае, мне кажется, что мне понадобятся дополнительные знания из области IOService и IOUsb, чтобы увидеть, выполнимо ли это. Обновлю этот вопрос, когда у меня будет больше времени для работы над этим. Прямо сейчас HID менеджер работает с драйвером :)   -  person vgrimmer    schedule 16.10.2012


Ответы (1)


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

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

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

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

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

person vgrimmer    schedule 24.01.2013