【发布时间】:2015-04-12 13:26:31
【问题描述】:
我有一个便宜的 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;
}
【问题讨论】:
-
应该可以正常工作。你能同时看到两者的原始事件输出吗?最简单的方法是为两个终端中的每个设备“cat /dev/input/
”,然后按下两个终端上的按钮。 -
另外,仅供参考,SDL2 引入了一个新的 Gamepad 抽象层,可以更轻松地使用这些设备。不过它是建立在操纵杆 API 之上的,因此切换可能无法解决您的问题。
-
@BrianMcFarland 嗨,我可以同时对两个设备进行分类并从它们那里获取输入。我的测试程序一次只能检测到一个,并且我在 MAME 和其他模拟器中得到相同的行为
-
此时,我可能会尝试以下操作:1) 使用
SDL_JOYSTICK_DEVICEenv 变量(':' 分隔的 abs 路径)明确指定两个操纵杆,或 2) 从源代码构建 SDL并逐步通过src/linux/SDL_sysjoystick.c:SDL_SYS_JoystickInit()。浏览代码,我不明白为什么它不起作用,但调试起来应该不会太难,因为您现在已经有效地排除了驱动程序问题。 -
@BrianMcFarland 还没有逐步完成代码,但是在
SDL_JOYSTICK_DEVICE变量中设置两个摇杆会给我列出 3 个操纵杆! (其中一个操纵杆列出了两次)。因此,至少一种解决方法是找出 SDL 未拾取哪个操纵杆并将其设置为该环境变量。
标签: c linux sdl joystick gamepad