From a82c1cb6e569f29b741b03c40e247a106b888a07 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Fri, 13 Jul 2012 23:34:46 +0200 Subject: [PATCH] (xbox 1) Changes to Xinput1 driver - still not working - WIP --- xbox1/xinput_xbox_input.c | 101 ++++++++++++++++++++++++++++---------- 1 file changed, 76 insertions(+), 25 deletions(-) diff --git a/xbox1/xinput_xbox_input.c b/xbox1/xinput_xbox_input.c index 192a00006f..de0d2c9622 100644 --- a/xbox1/xinput_xbox_input.c +++ b/xbox1/xinput_xbox_input.c @@ -28,36 +28,68 @@ static uint64_t state[4]; HANDLE gamepads[4]; +DWORD dwDeviceMask; +bool bInserted[4]; +bool bRemoved[4]; +XINPUT_CAPABILITIES caps[4]; static unsigned pads_connected; static void xinput_input_poll(void *data) { (void)data; + unsigned int dwInsertions, dwRemovals; + + XGetDeviceChanges(XDEVICE_TYPE_GAMEPAD, reinterpret_cast(&dwInsertions), reinterpret_cast(&dwRemovals)); pads_connected = 0; for (unsigned i = 0; i < 4; i++) { - XINPUT_STATE state_tmp; - unsigned long retval; - gamepads[i] = XInputOpen(XDEVICE_TYPE_GAMEPAD, i, XDEVICE_NO_SLOT, NULL); - if(gamepads[i] != NULL) - { - retval = XInputGetState(gamepads[i], &state_tmp); - pads_connected += (retval != ERROR_SUCCESS) ? 0 : 1; - state[i] = state_tmp.Gamepad.wButtons; - state[i] |= ((state_tmp.Gamepad.sThumbLX < -DEADZONE)) << 16; - state[i] |= ((state_tmp.Gamepad.sThumbLX > DEADZONE)) << 17; - state[i] |= ((state_tmp.Gamepad.sThumbLY > DEADZONE)) << 18; - state[i] |= ((state_tmp.Gamepad.sThumbLY < -DEADZONE)) << 19; - state[i] |= ((state_tmp.Gamepad.sThumbRX < -DEADZONE)) << 20; - state[i] |= ((state_tmp.Gamepad.sThumbRX > DEADZONE)) << 21; - state[i] |= ((state_tmp.Gamepad.sThumbRY > DEADZONE)) << 22; - state[i] |= ((state_tmp.Gamepad.sThumbRY < -DEADZONE)) << 23; - state[i] |= ((state_tmp.Gamepad.bAnalogButtons[XINPUT_GAMEPAD_LEFT_TRIGGER] > 128 ? 1 : 0)) << 24; - state[i] |= ((state_tmp.Gamepad.bAnalogButtons[XINPUT_GAMEPAD_RIGHT_TRIGGER] > 128 ? 1 : 0)) << 25; + // handle removed devices + bRemoved[i] = (dwRemovals & (1< DEADZONE)) << 17; + state[i] |= ((state_tmp.Gamepad.sThumbLY > DEADZONE)) << 18; + state[i] |= ((state_tmp.Gamepad.sThumbLY < -DEADZONE)) << 19; + state[i] |= ((state_tmp.Gamepad.sThumbRX < -DEADZONE)) << 20; + state[i] |= ((state_tmp.Gamepad.sThumbRX > DEADZONE)) << 21; + state[i] |= ((state_tmp.Gamepad.sThumbRY > DEADZONE)) << 22; + state[i] |= ((state_tmp.Gamepad.sThumbRY < -DEADZONE)) << 23; + state[i] |= ((state_tmp.Gamepad.bAnalogButtons[XINPUT_GAMEPAD_LEFT_TRIGGER] > 128 ? 1 : 0)) << 24; + state[i] |= ((state_tmp.Gamepad.bAnalogButtons[XINPUT_GAMEPAD_RIGHT_TRIGGER] > 128 ? 1 : 0)) << 25; + } } } @@ -79,14 +111,33 @@ static void xinput_input_free_input(void *data) static void* xinput_input_init(void) { - XDEVICE_PREALLOC_TYPE types[] = - { - {XDEVICE_TYPE_GAMEPAD, 4}, - {XDEVICE_TYPE_MEMORY_UNIT, 2} - }; + //XDEVICE_PREALLOC_TYPE types[] = + //{ + // {XDEVICE_TYPE_GAMEPAD, 4}, + // {XDEVICE_TYPE_MEMORY_UNIT, 2} + //}; - XInitDevices(sizeof(types) / sizeof(XDEVICE_PREALLOC_TYPE), - types ); + //XInitDevices(sizeof(types) / sizeof(XDEVICE_PREALLOC_TYPE), + //types ); + + XInitDevices(0, NULL); + + dwDeviceMask = XGetDevices(XDEVICE_TYPE_GAMEPAD); + + //Check the device status + switch(XGetDeviceEnumerationStatus()) + { + case XDEVICE_ENUMERATION_IDLE: + RARCH_LOG("XDEVICE_ENUMERATION_IDLE\n"); + break; + case XDEVICE_ENUMERATION_BUSY: + RARCH_LOG("XDEVICE_ENUMERATION_BUSY\n"); + break; + } + + while(XGetDeviceEnumerationStatus() == XDEVICE_ENUMERATION_BUSY) + { + } return (void*)-1; }