diff --git a/src/LibRyujinx/JniExportedMethods.cs b/src/LibRyujinx/JniExportedMethods.cs index b2f98c9fe..efbc61e37 100644 --- a/src/LibRyujinx/JniExportedMethods.cs +++ b/src/LibRyujinx/JniExportedMethods.cs @@ -417,29 +417,27 @@ namespace LibRyujinx } [UnmanagedCallersOnly(EntryPoint = "Java_org_ryujinx_android_RyujinxNative_inputSetButtonPressed")] - public static void JniSetButtonPressed(JEnvRef jEnv, JObjectLocalRef jObj, JInt button, JStringLocalRef id) + public static void JniSetButtonPressed(JEnvRef jEnv, JObjectLocalRef jObj, JInt button, JInt id) { - SetButtonPressed((Ryujinx.Input.GamepadButtonInputId)(int)button, GetString(jEnv, id)); + SetButtonPressed((Ryujinx.Input.GamepadButtonInputId)(int)button, id); } [UnmanagedCallersOnly(EntryPoint = "Java_org_ryujinx_android_RyujinxNative_inputSetButtonReleased")] - public static void JniSetButtonReleased(JEnvRef jEnv, JObjectLocalRef jObj, JInt button, JStringLocalRef id) + public static void JniSetButtonReleased(JEnvRef jEnv, JObjectLocalRef jObj, JInt button, JInt id) { - SetButtonReleased((Ryujinx.Input.GamepadButtonInputId)(int)button, GetString(jEnv, id)); + SetButtonReleased((Ryujinx.Input.GamepadButtonInputId)(int)button, id); } [UnmanagedCallersOnly(EntryPoint = "Java_org_ryujinx_android_RyujinxNative_inputSetStickAxis")] - public static void JniSetStickAxis(JEnvRef jEnv, JObjectLocalRef jObj, JInt stick, JFloat x, JFloat y, JStringLocalRef id) + public static void JniSetStickAxis(JEnvRef jEnv, JObjectLocalRef jObj, JInt stick, JFloat x, JFloat y, JInt id) { - SetStickAxis((Ryujinx.Input.StickInputId)(int)stick, new System.Numerics.Vector2(x, y), GetString(jEnv, id)); + SetStickAxis((Ryujinx.Input.StickInputId)(int)stick, new System.Numerics.Vector2(x, y), id); } [UnmanagedCallersOnly(EntryPoint = "Java_org_ryujinx_android_RyujinxNative_inputConnectGamepad")] - public static JStringLocalRef JniConnectGamepad(JEnvRef jEnv, JObjectLocalRef jObj, JInt index) + public static JInt JniConnectGamepad(JEnvRef jEnv, JObjectLocalRef jObj, JInt index) { - var id = ConnectGamepad(index); - - return (id ?? "").AsSpan().WithSafeFixed(jEnv, CreateString); + return ConnectGamepad(index); } private static Stream OpenFile(int descriptor) diff --git a/src/LibRyujinx/LibRyujinx.Input.cs b/src/LibRyujinx/LibRyujinx.Input.cs index 806221002..d08b0697f 100644 --- a/src/LibRyujinx/LibRyujinx.Input.cs +++ b/src/LibRyujinx/LibRyujinx.Input.cs @@ -73,22 +73,22 @@ namespace LibRyujinx _virtualTouchScreen?.ReleaseTouch(); } - public static void SetButtonPressed(GamepadButtonInputId button, string id) + public static void SetButtonPressed(GamepadButtonInputId button, int id) { _gamepadDriver?.SetButtonPressed(button, id); } - public static void SetButtonReleased(GamepadButtonInputId button, string id) + public static void SetButtonReleased(GamepadButtonInputId button, int id) { _gamepadDriver?.SetButtonReleased(button, id); } - public static void SetStickAxis(StickInputId stick, Vector2 axes, string deviceId) + public static void SetStickAxis(StickInputId stick, Vector2 axes, int deviceId) { _gamepadDriver?.SetStickAxis(stick, axes, deviceId); } - public static string ConnectGamepad(int index) + public static int ConnectGamepad(int index) { var gamepad = _gamepadDriver?.GetGamepad(index); if (gamepad != null) @@ -103,7 +103,7 @@ namespace LibRyujinx _npadManager?.ReloadConfiguration(_configs.Where(x => x != null).ToList(), false, false); - return gamepad?.Id ?? string.Empty; + return int.TryParse(gamepad?.Id, out var idInt) ? idInt : -1; } private static InputConfig CreateDefaultInputConfig() @@ -223,32 +223,27 @@ namespace LibRyujinx } [UnmanagedCallersOnly(EntryPoint = "input_set_button_pressed")] - public static void SetButtonPressedNative(GamepadButtonInputId button, IntPtr idPtr) + public static void SetButtonPressedNative(GamepadButtonInputId button, int id) { - var id = Marshal.PtrToStringAnsi(idPtr); SetButtonPressed(button, id); } [UnmanagedCallersOnly(EntryPoint = "input_set_button_released")] - public static void SetButtonReleased(GamepadButtonInputId button, IntPtr idPtr) + public static void SetButtonReleasedNative(GamepadButtonInputId button, int id) { - var id = Marshal.PtrToStringAnsi(idPtr); SetButtonReleased(button, id); } [UnmanagedCallersOnly(EntryPoint = "input_set_stick_axis")] - public static void SetStickAxisNative(StickInputId stick, Vector2 axes, IntPtr idPtr) + public static void SetStickAxisNative(StickInputId stick, Vector2 axes, int id) { - var id = Marshal.PtrToStringAnsi(idPtr); SetStickAxis(stick, axes, id); } [UnmanagedCallersOnly(EntryPoint = "input_connect_gamepad")] public static IntPtr ConnectGamepadNative(int index) { - var id = ConnectGamepad(index); - - return Marshal.StringToHGlobalAnsi(id); + return ConnectGamepad(index); } } @@ -386,18 +381,18 @@ namespace LibRyujinx { private readonly int _controllerCount; - public ReadOnlySpan GamepadsIds => _gamePads.Keys.ToArray(); + public ReadOnlySpan GamepadsIds => _gamePads.Keys.Select(x => x.ToString()).ToArray(); - public string DriverName => "SDL2"; + public string DriverName => "Virtual"; public event Action OnGamepadConnected; public event Action OnGamepadDisconnected; - private Dictionary _gamePads; + private Dictionary _gamePads; public VirtualGamepadDriver(int controllerCount) { - _gamePads = new Dictionary(); + _gamePads = new Dictionary(); for (int joystickIndex = 0; joystickIndex < controllerCount; joystickIndex++) { HandleJoyStickConnected(joystickIndex); @@ -406,16 +401,10 @@ namespace LibRyujinx _controllerCount = controllerCount; } - private string GenerateGamepadId(int joystickIndex) - { - return "VirtualGamePad-" + joystickIndex; - } - private void HandleJoyStickConnected(int joystickDeviceId) { - string id = GenerateGamepadId(joystickDeviceId); - _gamePads[id] = new VirtualGamepad(this, id); - OnGamepadConnected?.Invoke(id); + _gamePads[joystickDeviceId] = new VirtualGamepad(this, joystickDeviceId); + OnGamepadConnected?.Invoke(joystickDeviceId.ToString()); } protected virtual void Dispose(bool disposing) @@ -440,16 +429,15 @@ namespace LibRyujinx public IGamepad GetGamepad(string id) { - return _gamePads[id]; + return _gamePads[int.Parse(id)]; } public IGamepad GetGamepad(int index) { - string id = GenerateGamepadId(index); - return _gamePads[id]; + return _gamePads[index]; } - public void SetStickAxis(StickInputId stick, Vector2 axes, string deviceId) + public void SetStickAxis(StickInputId stick, Vector2 axes, int deviceId) { if(_gamePads.TryGetValue(deviceId, out var gamePad)) { @@ -457,7 +445,7 @@ namespace LibRyujinx } } - public void SetButtonPressed(GamepadButtonInputId button, string deviceId) + public void SetButtonPressed(GamepadButtonInputId button, int deviceId) { if (_gamePads.TryGetValue(deviceId, out var gamePad)) { @@ -465,7 +453,7 @@ namespace LibRyujinx } } - public void SetButtonReleased(GamepadButtonInputId button, string deviceId) + public void SetButtonReleased(GamepadButtonInputId button, int deviceId) { if (_gamePads.TryGetValue(deviceId, out var gamePad)) { @@ -482,12 +470,13 @@ namespace LibRyujinx private Vector2[] _stickInputs; - public VirtualGamepad(VirtualGamepadDriver driver, string id) + public VirtualGamepad(VirtualGamepadDriver driver, int id) { _buttonInputs = new bool[(int)GamepadButtonInputId.Count]; _stickInputs = new Vector2[(int)StickInputId.Count]; _driver = driver; - Id = id; + Id = id.ToString(); + IdInt = id; } public void Dispose() { } @@ -495,6 +484,8 @@ namespace LibRyujinx public GamepadFeaturesFlag Features { get; } public string Id { get; } + internal readonly int IdInt; + public string Name => Id; public bool IsConnected { get; } public Vector2[] StickInputs { get => _stickInputs; set => _stickInputs = value; } diff --git a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/GameController.kt b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/GameController.kt index 08c3af72f..d3c5baa1b 100644 --- a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/GameController.kt +++ b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/GameController.kt @@ -47,7 +47,7 @@ typealias GamePadConfig = RadialGamePadConfig class GameController(var activity: Activity, var ryujinxNative: RyujinxNative = RyujinxNative()) { var leftGamePad: GamePad var rightGamePad: GamePad - var controllerId: String? = null + var controllerId: Int = -1 init { leftGamePad = GamePad(generateConfig(true), 16f, activity) @@ -92,12 +92,12 @@ class GameController(var activity: Activity, var ryujinxNative: RyujinxNative = } fun connect(){ - if(controllerId.isNullOrEmpty()) + if(controllerId == -1) controllerId = ryujinxNative.inputConnectGamepad(0) } private fun handleEvent(ev: Event) { - if(controllerId.isNullOrEmpty()) + if(controllerId == -1) controllerId = ryujinxNative.inputConnectGamepad(0) controllerId?.apply { diff --git a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/RyujinxNative.kt b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/RyujinxNative.kt index 437f16ed7..3c127e66a 100644 --- a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/RyujinxNative.kt +++ b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/RyujinxNative.kt @@ -43,9 +43,9 @@ class RyujinxNative { external fun inputSetTouchPoint(x: Int, y: Int): Unit external fun inputReleaseTouchPoint(): Unit external fun inputUpdate(): Unit - external fun inputSetButtonPressed(button: Int, id: String): Unit - external fun inputSetButtonReleased(button: Int, id: String): Unit - external fun inputConnectGamepad(index: Int): String - external fun inputSetStickAxis(stick: Int, x: Float, y: Float, id: String): Unit + external fun inputSetButtonPressed(button: Int, id: Int): Unit + external fun inputSetButtonReleased(button: Int, id: Int): Unit + external fun inputConnectGamepad(index: Int): Int + external fun inputSetStickAxis(stick: Int, x: Float, y: Float, id: Int): Unit external fun graphicsSetSurface(surface: Long): String } \ No newline at end of file