Fix savestate and rumble

* When you switch from mempak to rumble , rumble pack is never initialized.

* Rumble stops working after loading a savestate.

* No shortcut working when you have 4 xinput controller plugged.

There is a performance hit when you check for a controller that wasn't attached last time you called it.
This fix minimizes a performance issue with XInput on Windows when checking for a disconnected controller.

If you get ERROR_DEVICE_NOT_CONNECTED from XInputGetState, you shouldn't call that slot for a little while.
This commit is contained in:
pcca-matrix 2020-06-14 11:19:49 +02:00
parent 32fe7b7672
commit da734b552a
3 changed files with 15 additions and 5 deletions

View File

@ -409,7 +409,7 @@ EXPORT void CALL InitiateControllers(
if (g_pcControllers[i].fXInput)
{
InitiateXInputController(&g_pcControllers[i].xiController, i);
continue;
//continue;
}
// Search for right Controller
@ -923,7 +923,7 @@ void FillControls(CONTROL * Controls)
{
case PAK_MEM:
Controls[i].Plugin = PLUGIN_MEMPAK;
Controls[i].RawData = false;
//Controls[i].RawData = false;
break;
case PAK_RUMBLE:
Controls[i].Plugin = PLUGIN_RUMBLE_PAK;
@ -1053,7 +1053,7 @@ void DoShortcut( int iControl, int iShortcut )
{
EnterCriticalSection( &g_critical );
g_pcControllers[iControl].PakType = PAK_RUMBLE;
g_pcControllers[iControl].fPakInitialized = false;
g_pcControllers[iControl].fPakInitialized = true;
if( g_pcControllers[iControl].fRawData )
if (CreateEffectHandle( iControl, g_pcControllers[iControl].bRumbleTyp, g_pcControllers[iControl].bRumbleStrength ) )

View File

@ -155,6 +155,8 @@ typedef struct _CONTROLLER // AN N64 CONTROLLER
unsigned bBackgroundInput; // allow input while main window isn't focused?
unsigned XcheckTime; // checks for newly connected gamepads timer
BYTE bRumbleTyp; // what type of rumble effect? none, constant, ramp, or direct?
GUID guidFFDevice; // GUID of the device that rumble gets sent to

View File

@ -178,13 +178,21 @@ void GetXInputControllerKeys( const int indexController, LPDWORD Keys )
if ( !gController->bConfigured )
return;
ULONGLONG time = GetTickCount() / 1000;
if (g_pcControllers[indexController].XcheckTime != NULL && (time - g_pcControllers[indexController].XcheckTime) < 3)
return;
DWORD result;
XINPUT_STATE state;
result = fnXInputGetState(gController->nControl, &state);
if( result != ERROR_SUCCESS )
return;
if (result == ERROR_DEVICE_NOT_CONNECTED) {
g_pcControllers[indexController].XcheckTime = time;
}
else {
g_pcControllers[indexController].XcheckTime = NULL;
}
DWORD wButtons = state.Gamepad.wButtons;