Catch and recover from exceptions thrown by OpenTK gamepad poll calls
This commit is contained in:
parent
04bf9d0ec2
commit
02de3588a6
|
@ -2,6 +2,8 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
|
||||||
|
using BizHawk.Common;
|
||||||
|
|
||||||
using OpenTK.Input;
|
using OpenTK.Input;
|
||||||
|
|
||||||
using OpenTKGamePad = OpenTK.Input.GamePad;
|
using OpenTKGamePad = OpenTK.Input.GamePad;
|
||||||
|
@ -41,38 +43,41 @@ namespace BizHawk.Bizware.OpenTK3
|
||||||
|
|
||||||
public static void UpdateAll()
|
public static void UpdateAll()
|
||||||
{
|
{
|
||||||
|
static void DropAt(int knownAsIndex, IList<OTK_GamePad> devices)
|
||||||
|
{
|
||||||
|
var known = devices[knownAsIndex];
|
||||||
|
Console.WriteLine($"Dropped gamepad #{knownAsIndex}, was port#{known._deviceIndex} ({known._name}) via OpenTK");
|
||||||
|
devices.RemoveAt(knownAsIndex);
|
||||||
|
}
|
||||||
if (!initialized) return;
|
if (!initialized) return;
|
||||||
lock (_syncObj)
|
lock (_syncObj)
|
||||||
{
|
{
|
||||||
for (var tryIndex = 0; tryIndex < MAX_GAMEPADS; tryIndex++)
|
for (var tryIndex = 0; tryIndex < MAX_GAMEPADS; tryIndex++)
|
||||||
{
|
{
|
||||||
var isConnectedAtIndex = OpenTKGamePad.GetState(tryIndex).IsConnected || Joystick.GetState(tryIndex).IsConnected;
|
|
||||||
var knownAsIndex = Devices.FindIndex(dev => dev._deviceIndex == tryIndex);
|
var knownAsIndex = Devices.FindIndex(dev => dev._deviceIndex == tryIndex);
|
||||||
if (knownAsIndex != -1)
|
try
|
||||||
{
|
{
|
||||||
if (isConnectedAtIndex)
|
var isConnectedAtIndex = OpenTKGamePad.GetState(tryIndex).IsConnected || Joystick.GetState(tryIndex).IsConnected;
|
||||||
|
if (knownAsIndex != -1)
|
||||||
{
|
{
|
||||||
Devices[knownAsIndex].Update();
|
if (isConnectedAtIndex) Devices[knownAsIndex].Update();
|
||||||
|
else DropAt(knownAsIndex, Devices);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var known = Devices[knownAsIndex];
|
if (isConnectedAtIndex)
|
||||||
Console.WriteLine($"Dropped gamepad #{knownAsIndex}, was port#{known._deviceIndex} ({known._name}) via OpenTK");
|
{
|
||||||
Devices.RemoveAt(knownAsIndex);
|
var newConn = new OTK_GamePad(tryIndex, Devices.Count);
|
||||||
|
Devices.Insert(tryIndex, newConn); // try and keep our indices in line with the OpenTK ones
|
||||||
|
Console.WriteLine($"Connected new gamepad #{tryIndex}, port#{newConn._deviceIndex} ({newConn._name}) via OpenTK");
|
||||||
|
}
|
||||||
|
// else was and remains disconnected, move along
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
if (isConnectedAtIndex)
|
Util.DebugWriteLine($"caught {e.GetType().FullName} while enumerating OpenTK gamepads");
|
||||||
{
|
if (knownAsIndex != -1) DropAt(knownAsIndex, Devices);
|
||||||
var newConn = new OTK_GamePad(tryIndex, Devices.Count);
|
|
||||||
Devices.Insert(tryIndex, newConn); // try and keep our indices in line with the OpenTK ones
|
|
||||||
Console.WriteLine($"Connected new gamepad #{tryIndex}, port#{newConn._deviceIndex} ({newConn._name}) via OpenTK");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// was and is disconnected, move along
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue