Поддерживает ли SDL в Linux более одного геймпада/джойстика?

У меня есть дешевый контроллер PS3 и контроллер NEO-GEO X. Они оба обнаружены, например. Fedora 20 и Lubuntu 14.04. Они появляются в lsusb

Bus 001 Device 012: ID 0e8f:0003 GreenAsia Inc. MaxFire Blaze2
Bus 001 Device 016: ID 1292:4e47 Innomedia

Устройства отображаются под /dev/input. Запуск udevadm на них обоих показывает, что устройство GreenAsia использует драйвер pantherlord, тогда как другое устройство использует hid-generic.

Если я запускаю следующий тестовый код, SDL сообщает только об устройстве GreenAsia. Если я отключу его, то будет обнаружено другое устройство. Это известное ограничение SDL или какая-то другая проблема?

// from http://www.libsdl.org/release/SDL-1.2.15/docs/html/guideinput.html
#include "SDL/SDL.h"

int main () {
    if (SDL_Init( SDL_INIT_VIDEO | SDL_INIT_JOYSTICK ) < 0)
    {
        fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
        exit(1);
    }
    printf("%i joysticks were found.\n\n", SDL_NumJoysticks() );
    printf("The names of the joysticks are:\n");

    for( int i=0; i < SDL_NumJoysticks(); i++ ) 
    {
        printf("    %s\n", SDL_JoystickName(i));
    }
   return 0;
}

person wreckgar23    schedule 12.04.2015    source источник
comment
Должен работать нормально. Можете ли вы одновременно видеть необработанные выходные данные обоих событий? Самый простой способ сделать это — выполнить команду cat /dev/input/‹device› для каждого устройства в двух терминалах, а затем нажать кнопки на обоих.   -  person Brian McFarland    schedule 12.04.2015
comment
Кроме того, к вашему сведению, SDL2 представила новый уровень абстракции геймпада, который значительно упрощает работу с такими устройствами. Однако он построен на основе API джойстика, поэтому переключение, вероятно, не решит вашу проблему.   -  person Brian McFarland    schedule 12.04.2015
comment
@BrianMcFarland Привет, я могу подключить оба устройства и одновременно получать информацию от них обоих. Моя тестовая программа может обнаружить только по одному, и я получаю такое же поведение с MAME и другими эмуляторами.   -  person wreckgar23    schedule 13.04.2015
comment
В этот момент я бы, вероятно, попробовал следующее: 1) явно указать оба джойстика с помощью переменной env SDL_JOYSTICK_DEVICE (':' разделенные пути abs) или 2) построить SDL из исходного кода и пройти через src/linux/SDL_sysjoystick.c:SDL_SYS_JoystickInit(). Просматривая код, я не понимаю, почему он не работает, но отладка не должна быть слишком сложной, поскольку теперь вы фактически исключили проблемы с драйверами.   -  person Brian McFarland    schedule 14.04.2015
comment
@BrianMcFarland еще не прошел код, но установка обоих джойстиков в переменной SDL_JOYSTICK_DEVICE дает мне 3 джойстика в списке! (один из джойстиков указан дважды). Таким образом, обходной путь, по крайней мере, состоит в том, чтобы выяснить, какой джойстик не подхватывается SDL, и установить для него эту переменную среды.   -  person wreckgar23    schedule 14.04.2015


Ответы (1)


Ответ на мой вопрос кажется «нет», если только один из джойстиков сопоставляется с устройством /dev/input/event13 или подобным, что в моем случае происходит с моим контроллером PS3.

В SDL_SYS_JoystickInit есть следующий код

#if SDL_INPUT_LINUXEV
        /* This is a special case...
           If the event devices are valid then the joystick devices
           will be duplicates but without extra information about their
           hats or balls. Unfortunately, the event devices can't
           currently be calibrated, so it's a win-lose situation.
           So : /dev/input/eventX = /dev/input/jsY = /dev/jsY
        */
        if ( (i == 0) && (numjoysticks > 0) )
            break;
#endif

Когда i равно 0, он ищет устройства «события». Мой контроллер PS3 получает устройства /dev/input/event13 и /dev/input/js1, но мой контроллер NEO-GEO X имеет только устройство /dev/input/js0, поэтому прерывание цикла приводит к его игнорированию.

Обходной путь в этом случае — добавить устройство, не имеющее соответствующего «событийного» устройства, в SDL_JOYSTICK_DEVICE.

Спасибо Брайану МакФарланду за помощь в том, чтобы разобраться в этом.

person wreckgar23    schedule 16.05.2015