forked from eden-emu/eden
		
	android: Reorder controller indexes and only use controllers
Before we could ignore controller inputs by forwarding them to player two if a non-controller was connected before and recognized as an input device.
This commit is contained in:
		
							parent
							
								
									94d24c3b42
								
							
						
					
					
						commit
						9cdb6b1180
					
				
					 2 changed files with 50 additions and 6 deletions
				
			
		|  | @ -64,6 +64,8 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener { | |||
|     private var motionTimestamp: Long = 0 | ||||
|     private var flipMotionOrientation: Boolean = false | ||||
| 
 | ||||
|     private var controllerIds = InputHandler.getGameControllerIds() | ||||
| 
 | ||||
|     private val actionPause = "ACTION_EMULATOR_PAUSE" | ||||
|     private val actionPlay = "ACTION_EMULATOR_PLAY" | ||||
|     private val actionMute = "ACTION_EMULATOR_MUTE" | ||||
|  | @ -155,6 +157,7 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener { | |||
|         super.onResume() | ||||
|         nfcReader.startScanning() | ||||
|         startMotionSensorListener() | ||||
|         InputHandler.updateControllerIds() | ||||
| 
 | ||||
|         buildPictureInPictureParams() | ||||
|     } | ||||
|  |  | |||
|  | @ -3,17 +3,24 @@ | |||
| 
 | ||||
| package org.yuzu.yuzu_emu.utils | ||||
| 
 | ||||
| import android.view.InputDevice | ||||
| import android.view.KeyEvent | ||||
| import android.view.MotionEvent | ||||
| import kotlin.math.sqrt | ||||
| import org.yuzu.yuzu_emu.NativeLibrary | ||||
| 
 | ||||
| object InputHandler { | ||||
|     private var controllerIds = getGameControllerIds() | ||||
| 
 | ||||
|     fun initialize() { | ||||
|         // Connect first controller | ||||
|         NativeLibrary.onGamePadConnectEvent(getPlayerNumber(NativeLibrary.Player1Device)) | ||||
|     } | ||||
| 
 | ||||
|     fun updateControllerIds() { | ||||
|         controllerIds = getGameControllerIds() | ||||
|     } | ||||
| 
 | ||||
|     fun dispatchKeyEvent(event: KeyEvent): Boolean { | ||||
|         val button: Int = when (event.device.vendorId) { | ||||
|             0x045E -> getInputXboxButtonKey(event.keyCode) | ||||
|  | @ -35,7 +42,7 @@ object InputHandler { | |||
|         } | ||||
| 
 | ||||
|         return NativeLibrary.onGamePadButtonEvent( | ||||
|             getPlayerNumber(event.device.controllerNumber), | ||||
|             getPlayerNumber(event.device.controllerNumber, event.deviceId), | ||||
|             button, | ||||
|             action | ||||
|         ) | ||||
|  | @ -58,9 +65,14 @@ object InputHandler { | |||
|         return true | ||||
|     } | ||||
| 
 | ||||
|     private fun getPlayerNumber(index: Int): Int { | ||||
|     private fun getPlayerNumber(index: Int, deviceId: Int = -1): Int { | ||||
|         var deviceIndex = index | ||||
|         if (deviceId != -1) { | ||||
|             deviceIndex = controllerIds[deviceId]!! | ||||
|         } | ||||
| 
 | ||||
|         // TODO: Joycons are handled as different controllers. Find a way to merge them. | ||||
|         return when (index) { | ||||
|         return when (deviceIndex) { | ||||
|             2 -> NativeLibrary.Player2Device | ||||
|             3 -> NativeLibrary.Player3Device | ||||
|             4 -> NativeLibrary.Player4Device | ||||
|  | @ -238,7 +250,7 @@ object InputHandler { | |||
|     } | ||||
| 
 | ||||
|     private fun setGenericAxisInput(event: MotionEvent, axis: Int) { | ||||
|         val playerNumber = getPlayerNumber(event.device.controllerNumber) | ||||
|         val playerNumber = getPlayerNumber(event.device.controllerNumber, event.deviceId) | ||||
| 
 | ||||
|         when (axis) { | ||||
|             MotionEvent.AXIS_X, MotionEvent.AXIS_Y -> | ||||
|  | @ -297,7 +309,7 @@ object InputHandler { | |||
| 
 | ||||
|     private fun setJoyconAxisInput(event: MotionEvent, axis: Int) { | ||||
|         // Joycon support is half dead. Right joystick doesn't work | ||||
|         val playerNumber = getPlayerNumber(event.device.controllerNumber) | ||||
|         val playerNumber = getPlayerNumber(event.device.controllerNumber, event.deviceId) | ||||
| 
 | ||||
|         when (axis) { | ||||
|             MotionEvent.AXIS_X, MotionEvent.AXIS_Y -> | ||||
|  | @ -325,7 +337,7 @@ object InputHandler { | |||
|     } | ||||
| 
 | ||||
|     private fun setRazerAxisInput(event: MotionEvent, axis: Int) { | ||||
|         val playerNumber = getPlayerNumber(event.device.controllerNumber) | ||||
|         val playerNumber = getPlayerNumber(event.device.controllerNumber, event.deviceId) | ||||
| 
 | ||||
|         when (axis) { | ||||
|             MotionEvent.AXIS_X, MotionEvent.AXIS_Y -> | ||||
|  | @ -362,4 +374,33 @@ object InputHandler { | |||
|                 ) | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     fun getGameControllerIds(): Map<Int, Int> { | ||||
|         val gameControllerDeviceIds = mutableMapOf<Int, Int>() | ||||
|         val deviceIds = InputDevice.getDeviceIds() | ||||
|         var controllerSlot = 1 | ||||
|         deviceIds.forEach { deviceId -> | ||||
|             InputDevice.getDevice(deviceId)?.apply { | ||||
|                 // Don't over-assign controllers | ||||
|                 if (controllerSlot >= 8) { | ||||
|                     return gameControllerDeviceIds | ||||
|                 } | ||||
| 
 | ||||
|                 // Verify that the device has gamepad buttons, control sticks, or both. | ||||
|                 if (sources and InputDevice.SOURCE_GAMEPAD == InputDevice.SOURCE_GAMEPAD || | ||||
|                     sources and InputDevice.SOURCE_JOYSTICK == InputDevice.SOURCE_JOYSTICK | ||||
|                 ) { | ||||
|                     // This device is a game controller. Store its device ID. | ||||
|                     if (deviceId and id and vendorId and productId != 0) { | ||||
|                         // Additionally filter out devices that have no ID | ||||
|                         gameControllerDeviceIds | ||||
|                             .takeIf { !it.contains(deviceId) } | ||||
|                             ?.put(deviceId, controllerSlot) | ||||
|                         controllerSlot++ | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         return gameControllerDeviceIds | ||||
|     } | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Charles Lombardo
						Charles Lombardo