вторник, 13 августа 2013 г.

Dev: Как я пытался прикрутить беспроводную гарнитуру от Xbox 360 на OS X

Когда я сижу за ноутом, я использую свои Tritton Warhead 7.1, которые купил для игры на боксе,  и когда я временами играю в Dota2 для голосового чата хочется использовать гарнитуру из триттона, а не встроенный в макбук микрофон. Но триттон использует оригинальный Xbox 360 интерфейс для передачи колоса по 2.4ГГц каналу, а значит не все так просто. Скажу сразу у меня пока ничего не получилось, и действия приостановлены из-за некоторых обстоятельств, о которых я напишу ниже.



Для подключения гарнитуры к макбуку будет исопользоваться единственное возможное решение Xbox 360 Controller Wireless Receiver for Windows - USB приемник для беспроводных джоев/гарнитур от бокса. По понятным причинам у меня в руках была его китайская реплика, а не оригинальный от MS, что в последствии послужило причиной неудачи вероятно.

Итак проблема подключения гарнитуры бокса через USB ресивер к linux/os x существовала с 2007 года, решена они так и не была. Максимум что есть это дрова на джой, но не на гарнитуру.

Для отправной точки я нашел сырцы некоего итальянца: http://osx-wireless-gaming-receiver-driver.googlecode.com/
Чел красавец, но какашка. Драйвер написан на С++, автор, распарсил проткоол пейринга гарнитуры с ресивером и его реализовал, реализовал даже IOAudioDevice класс для гарнитуры, НО не сделал реализацию IOAudioEngine - самое главное для того чтобы ОС смогла работать с подключенным звуковым устройством.
Также были проблемы компиляции и установки драйвера ибо писался он для старой 32 OS X.

До того как я кинулся в дебри реализации IOAudioEngine, я постарался установить реализованное и проверить его работу по дебаг логу.
После компиляции драйвера в X code мы получаем пакет драйвера *.kext
естественно сразу он не подцепился ибо в Info.plist были указаны старые версии 32 системых либ, чтобы понять что подцеплять делаем команду:

hicamacwf:Debug icanit$ kextlibs XBox360Wireless.kext
For all architectures:
    com.apple.iokit.IOAudioFamily = 1.8.9f11
    com.apple.iokit.IOUSBFamily = 5.6
    com.apple.kpi.iokit = 12.4
    com.apple.kpi.libkern = 12.4
    com.apple.kpi.mach = 12.4
В ответ получим либы которые нужно будет указать в Info.plist
Также не забываем забацать:
sudo chown -R root:wheel XBox360Wireless.kext
Иначе система не загрузит этот пакет драйвера.
Ну и на последок устанавливаем его в системе:
sudo mv XBox360Wireless.kext "/System/Library/Extensions/XBox360Wireless.kext"
Во вторых, чтобы дарйвер работал с китайским устройством тамже надо замапить наш кривой USB productId от китайца:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idVendor</key>
<integer>1118</integer>
<key>idProduct</key>
<integer>657</integer>
<key>CFBundleIdentifier</key>
<string>com.apple.driver.AppleUSBComposite</string>
<key>IOClass</key>
<string>IOUSBCompositeDriver</string>
<key>IOKitDebug</key>
<integer>65535</integer>
</dict>
</plist>

Да, ресивер представляет из себя стандартное составное USB устройство с уже интересующими нас интерфейсами - менеджером пейринга устройств и самими интерфейсами утсройств: джои/гарнитуры.

Дабы понять что у меня отсутсвует реализация IOAudioEngine да и собственно корректная реализация IOAudioDevice мне пришлось обратиться к документации.
https://developer.apple.com/library/mac/documentation/DeviceDrivers/Conceptual/WritingAudioDrivers/WritingAudioDrivers.pdf
Скажу четсно, это один из немногих раз, когда я читал настолько понятную, гуманную и добрую документацию, что мне хотелось плакать от счастья и сразу бежать писать реализация драйверов аудио утсрйоств. По работе я часто сталкиваюсь с документациями различными и от них хочется рыдать в муках, биться в об стену или умереть долго и мучительно, лишь бы развидеть их.

И вот тут, прежде чем реализовывать уже сам вывод аудио потока, я решил оценить качество звука и послушать гарнитуру через Windows.

В голосе были щелчки и помехи, если подключать триттон через USB Receiver.
Если подключать проводную гарнитуру к контроллеру Xbox 360 безпроводному то помех и щелчком нет. Позже я проверил, что при подключении триттона к Xbox 360 тоже помех и щелчков нет. Вывод: конфликт на уровне беспроводного взаимодействия гарнитуры и китайского USB ресивера, отключение всех источников помех 2.4ГГц(wifi/bluetooth радио телефоны итд) не помогает ни капли.

Из-за я временно приостановил дальнейшие работы по этой теме,  ибо оригинальный ресивер от МС может и не помочь, да еще его и найти надо, а на ибее только китайские.
В любом случае, даже не смотря на неудачу, я счастлив, ибо я прочитал такую чудесную документацию, спасибо Apple.

P.S. еще мне встретилась и понравилась книжка OS X iOS Kernel Programming, но после документации от Apple она была полезна только примерами.

Комментариев нет:

Отправить комментарий