Горячая замена геймпада не работает

В OS X мои геймпады правильно распознаются в SDL_PollEvent() при запуске приложения. Тем не менее, когда я пытаюсь горячо подключить новые геймпады или удалить старые геймпады, SDL_PollEvent() тоже не срабатывает SDL_CONTROLLERDEVICEADDED или же SDL_CONTROLLERDEVICEREMOVED, Тот же код работает правильно в Windows, когда я подключаю игровые контроллеры.

Более интересным примечанием является то, что если я изменю размер окна моего приложения, горячее подключение работает. После события изменения размера все события горячего подключения запускаются. Кажется, что события геймпада помещаются в некую очередь ожидания, которая очищается, когда происходит событие изменения размера. мой SDL_PollEvent() код довольно стандартный, как показано ниже.

case SDL_CONTROLLERDEVICEADDED:
        if (SDL_IsGameController(e.cdevice.which))
        {
            SDL_GameController *pad = SDL_GameControllerOpen(e.cdevice.which);

            if (pad)
            {
                SDL_Joystick *joy = SDL_GameControllerGetJoystick(pad);
                int instanceID = SDL_JoystickInstanceID(joy);
                if(m_gameControllers.count(instanceID) == 0)
                {
                    m_gameControllers.insert(std::make_pair(instanceID, pad));
                }
            }
        }
    break;

    case SDL_CONTROLLERDEVICEREMOVED:
    {
        auto it = m_gameControllers.find(e.cdevice.which);
        if (it != m_gameControllers.end())
        {
            SDL_GameController* pad = m_gameControllers[e.cdevice.which];
            SDL_GameControllerClose(pad);
            m_gameControllers.erase(it);
        }
    }
    break;

Кто-нибудь еще испытывал это?

1 ответ

Решение

После некоторой борьбы я нашел решение: Позвонить SDL_PollEvent() из основного потока. Изначально я вызвал метод обработки геймпада из потока CVDisplayLink, который привел описанное поведение.

В моем случае решение было просто добавить dispatch_async вызовите мою функцию обработки геймпада.

dispatch_async(dispatch_get_main_queue(),^ { handleGamePad();});
Другие вопросы по тегам