Man, this is pretty discouraging. Just dropped a decent amount of cash trying to round up the necessary usb cables and old controllers. I would be surprised if there isn't somebody out there who knows how to make this happen. I'll keep working on it, although I'm not the most computer savvy guy but I hate to waste money and not see my vision come through.
There really isn't. Windows has a somewhat convoluted way of tracking USB controllers, and the APIs that the emulators are incorrectly using have no defined order things get returned in. I've looked into it in quite a bit of detail.
From what I can tell, your only options are:
- Get the code for all of your emulators, fix their broken controller handling to be GUID and not ID/offset based
- Write a tool like ControllerRemapper for all of your emulators individually (although you may get lucky and some may be GUID based)
- Use something like vJoy to remap the controllers to virtual controllers which hopefully are stable (note, there's no guarantee of that, either)
- Use the Detours library and remote code injection to patch the API calls to reorder the controllers in a controllable way. (This is probably the "best" option but its extremely complicated coding.)
- Downgrade to XP where JoyIDs works.
- Don't use external controllers.
And with HyperSpin unless you got lucky and your P1/P2 controls ended up 0 and 1, you'll need a program to map the joystick buttons to keyboard events because HyperSpin's joystick handling is even more fundamentally broken than the emulators' handling.
I'm having to write a tool like ControllerRemapper for MAME anyway, so that's probably the initial pass I'm going to do. (I have an added complexity that which stick and buttons are P1/P2 vary depending on the game, so I need more sophisticated logic setting up my MAME defaults anyway.)
I haven't solved my HyperSpin problem, though.
Now another more extreme option would be to use Linux. I think there's some pretty substantial downsides of that, but the upside is the controllers map in a more reliable way and worst-case you can use symbolic links to the devices to switch them around.
I may end up nixing the external controller idea, though, because there just doesn't seem to be a reliable way to do it.