Reverted change to the cached input states

This commit is contained in:
x1nixmzeng 2018-03-24 19:03:12 +00:00
parent 2fb4ea73de
commit ee0df62039
2 changed files with 74 additions and 10 deletions

View File

@ -521,8 +521,8 @@ DWORD WINAPI XTL::EMUPATCH(XInputGetCapabilities)
if(dwPort == 0)
{
pCapabilities->SubType = XINPUT_DEVSUBTYPE_GC_GAMEPAD;
ZeroMemory(&pCapabilities->Gamepad, sizeof(XINPUT_GAMEPAD));
ZeroMemory(&pCapabilities->Rumble, sizeof(XINPUT_RUMBLE));
pCapabilities->In.Gamepad = {};
pCapabilities->Out.Rumble = {};
ret = ERROR_SUCCESS;
}
@ -611,14 +611,64 @@ DWORD WINAPI XTL::EMUPATCH(XInputSetState)
if(pph != NULL)
{
int v;
//
// Check if this device is already being polled
//
bool found = false;
for(v=0;v<XINPUT_SETSTATE_SLOTS;v++)
{
if(g_pXInputSetStateStatus[v].hDevice == hDevice)
{
found = true;
if(pFeedback->Header.dwStatus == ERROR_SUCCESS)
{
ret = ERROR_SUCCESS;
// remove from slot
g_pXInputSetStateStatus[v].hDevice = NULL;
g_pXInputSetStateStatus[v].pFeedback = NULL;
g_pXInputSetStateStatus[v].dwLatency = 0;
}
}
}
//
// If device was not already slotted, queue it
//
if(!found)
{
for(v=0;v<XINPUT_SETSTATE_SLOTS;v++)
{
if(g_pXInputSetStateStatus[v].hDevice == 0)
{
g_pXInputSetStateStatus[v].hDevice = hDevice;
g_pXInputSetStateStatus[v].dwLatency = 0;
g_pXInputSetStateStatus[v].pFeedback = pFeedback;
pFeedback->Header.dwStatus = ERROR_IO_PENDING;
break;
}
}
if(v == XINPUT_SETSTATE_SLOTS)
{
CxbxKrnlCleanup("Ran out of XInputSetStateStatus slots!");
}
}
if (pph->dwPort == 0)
{
if (g_XInputEnabled)
{
XTL::EmuXInputSetState(pFeedback);
}
ret = ERROR_SUCCESS;
}
}

View File

@ -202,8 +202,18 @@ typedef struct _XINPUT_CAPABILITIES
{
BYTE SubType;
WORD Reserved;
XINPUT_GAMEPAD Gamepad;
XINPUT_RUMBLE Rumble;
union
{
XINPUT_GAMEPAD Gamepad;
}
In;
union
{
XINPUT_RUMBLE Rumble;
}
Out;
}
XINPUT_CAPABILITIES, *PXINPUT_CAPABILITIES;
@ -259,23 +269,27 @@ XINPUT_STATE, *PXINPUT_STATE;
// ******************************************************************
// * XINPUT_FEEDBACK_HEADER
// ******************************************************************
#pragma pack(1)
#include "AlignPrefix1.h"
typedef struct _XINPUT_FEEDBACK_HEADER
{
DWORD dwStatus;
HANDLE OPTIONAL hEvent;
BYTE Reserved[58];
}
#include "AlignPosfix1.h"
XINPUT_FEEDBACK_HEADER, *PXINPUT_FEEDBACK_HEADER;
#pragma pack()
// ******************************************************************
// * XINPUT_FEEDBACK
// ******************************************************************
typedef struct _XINPUT_FEEDBACK
{
XINPUT_FEEDBACK_HEADER Header;
XINPUT_RUMBLE Rumble;
XINPUT_FEEDBACK_HEADER Header;
union
{
XINPUT_RUMBLE Rumble;
};
}
XINPUT_FEEDBACK, *PXINPUT_FEEDBACK;