diff --git a/app/src/main/java/com/limelight/Game.java b/app/src/main/java/com/limelight/Game.java index aaf9d617..824f6e27 100644 --- a/app/src/main/java/com/limelight/Game.java +++ b/app/src/main/java/com/limelight/Game.java @@ -173,7 +173,7 @@ public class Game extends Activity implements SurfaceHolder.Callback, // Initialize the connection conn = new NvConnection(host, uniqueId, Game.this, config, PlatformBinding.getCryptoProvider(this)); keybTranslator = new KeyboardTranslator(conn); - controllerHandler = new ControllerHandler(conn); + controllerHandler = new ControllerHandler(conn, prefConfig.deadzonePercentage); SurfaceHolder sh = sv.getHolder(); if (prefConfig.stretchVideo || !decoderRenderer.isHardwareAccelerated()) { diff --git a/app/src/main/java/com/limelight/binding/input/ControllerHandler.java b/app/src/main/java/com/limelight/binding/input/ControllerHandler.java index efa1f1e2..b11b3e5c 100644 --- a/app/src/main/java/com/limelight/binding/input/ControllerHandler.java +++ b/app/src/main/java/com/limelight/binding/input/ControllerHandler.java @@ -44,9 +44,11 @@ public class ControllerHandler { private HashMap mappings = new HashMap(); private NvConnection conn; + private double stickDeadzone; - public ControllerHandler(NvConnection conn) { + public ControllerHandler(NvConnection conn, int deadzonePercentage) { this.conn = conn; + this.stickDeadzone = (double)deadzonePercentage / 100.0; // We want limelight-common to scale the axis values to match Xinput values ControllerPacket.enableAxisScaling = true; @@ -148,56 +150,12 @@ public class ControllerHandler { } if (mapping.leftStickXAxis != -1 && mapping.leftStickYAxis != -1) { - InputDevice.MotionRange lsXRange = getMotionRangeForJoystickAxis(dev, mapping.leftStickXAxis); - InputDevice.MotionRange lsYRange = getMotionRangeForJoystickAxis(dev, mapping.leftStickYAxis); - if (lsXRange != null && lsYRange != null) { - // The flat values should never be negative but we'll deal with it if they are - mapping.leftStickDeadzoneRadius = Math.max(Math.abs(lsXRange.getFlat()), - Math.abs(lsYRange.getFlat())); - - // Some devices (certain OUYAs at least) report a deadzone that's larger - // than the entire range of their axis likely due to some system software bug. - // If we see a very large deadzone, simply ignore the value and use our default. - if (mapping.leftStickDeadzoneRadius > 0.5f) { - mapping.leftStickDeadzoneRadius = 0; - } - - // If there isn't a (reasonable) deadzone at all, use 20% - if (mapping.leftStickDeadzoneRadius < 0.02f) { - mapping.leftStickDeadzoneRadius = 0.20f; - } - // Check that the deadzone is 15% at minimum - else if (mapping.leftStickDeadzoneRadius < 0.15f) { - mapping.leftStickDeadzoneRadius = 0.15f; - } - } + mapping.leftStickDeadzoneRadius = (float) stickDeadzone; } if (mapping.rightStickXAxis != -1 && mapping.rightStickYAxis != -1) { - InputDevice.MotionRange rsXRange = getMotionRangeForJoystickAxis(dev, mapping.rightStickXAxis); - InputDevice.MotionRange rsYRange = getMotionRangeForJoystickAxis(dev, mapping.rightStickYAxis); - if (rsXRange != null && rsYRange != null) { - // The flat values should never be negative but we'll deal with it if they are - mapping.rightStickDeadzoneRadius = Math.max(Math.abs(rsXRange.getFlat()), - Math.abs(rsYRange.getFlat())); - - // Some devices (certain OUYAs at least) report a deadzone that's larger - // than the entire range of their axis likely due to some system software bug. - // If we see a very large deadzone, simply ignore the value and use our default. - if (mapping.rightStickDeadzoneRadius > 0.5f) { - mapping.rightStickDeadzoneRadius = 0; - } - - // If there isn't a (reasonable) deadzone at all, use 20% - if (mapping.rightStickDeadzoneRadius < 0.02f) { - mapping.rightStickDeadzoneRadius = 0.20f; - } - // Check that the deadzone is 15% at minimum - else if (mapping.rightStickDeadzoneRadius < 0.15f) { - mapping.rightStickDeadzoneRadius = 0.15f; - } - } - } + mapping.rightStickDeadzoneRadius = (float) stickDeadzone; + } return mapping; } diff --git a/app/src/main/java/com/limelight/preferences/PreferenceConfiguration.java b/app/src/main/java/com/limelight/preferences/PreferenceConfiguration.java index ec5e45c2..fbcfa423 100644 --- a/app/src/main/java/com/limelight/preferences/PreferenceConfiguration.java +++ b/app/src/main/java/com/limelight/preferences/PreferenceConfiguration.java @@ -12,6 +12,7 @@ public class PreferenceConfiguration { private static final String SOPS_PREF_STRING = "checkbox_enable_sops"; private static final String DISABLE_TOASTS_PREF_STRING = "checkbox_disable_warnings"; private static final String HOST_AUDIO_PREF_STRING = "checkbox_host_audio"; + private static final String DEADZONE_PREF_STRING = "seekbar_deadzone"; private static final int BITRATE_DEFAULT_720_30 = 5; private static final int BITRATE_DEFAULT_720_60 = 10; @@ -25,6 +26,7 @@ public class PreferenceConfiguration { private static final boolean DEFAULT_SOPS = true; private static final boolean DEFAULT_DISABLE_TOASTS = false; private static final boolean DEFAULT_HOST_AUDIO = false; + private static final int DEFAULT_DEADZONE = 15; public static final int FORCE_HARDWARE_DECODER = -1; public static final int AUTOSELECT_DECODER = 0; @@ -33,6 +35,7 @@ public class PreferenceConfiguration { public int width, height, fps; public int bitrate; public int decoder; + public int deadzonePercentage; public boolean stretchVideo, enableSops, playHostAudio, disableWarnings; public static int getDefaultBitrate(String resFpsString) { @@ -130,6 +133,8 @@ public class PreferenceConfiguration { config.decoder = getDecoderValue(context); + config.deadzonePercentage = prefs.getInt(DEADZONE_PREF_STRING, DEFAULT_DEADZONE); + // Checkbox preferences config.disableWarnings = prefs.getBoolean(DISABLE_TOASTS_PREF_STRING, DEFAULT_DISABLE_TOASTS); config.enableSops = prefs.getBoolean(SOPS_PREF_STRING, DEFAULT_SOPS); diff --git a/app/src/main/java/com/limelight/preferences/SeekBarPreference.java b/app/src/main/java/com/limelight/preferences/SeekBarPreference.java index 3c57b5af..7e2b6ace 100644 --- a/app/src/main/java/com/limelight/preferences/SeekBarPreference.java +++ b/app/src/main/java/com/limelight/preferences/SeekBarPreference.java @@ -48,7 +48,7 @@ public class SeekBarPreference extends DialogPreference } // Get default and max seekbar values - defaultValue = PreferenceConfiguration.getDefaultBitrate(context); + defaultValue = attrs.getAttributeIntValue(SCHEMA_URL, "defaultValue", PreferenceConfiguration.getDefaultBitrate(context)); maxValue = attrs.getAttributeIntValue(SCHEMA_URL, "max", 100); } @@ -80,7 +80,7 @@ public class SeekBarPreference extends DialogPreference @Override public void onProgressChanged(SeekBar seekBar, int value, boolean b) { String t = String.valueOf(value); - valueText.setText(suffix == null ? t : t.concat(" " + suffix)); + valueText.setText(suffix == null ? t : t.concat(suffix.length() > 1 ? " "+suffix : suffix)); } @Override diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index eba452e5..993a3e5c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -94,6 +94,10 @@ Disable warning messages Disable on-screen connection warning messages while streaming + Gamepad Settings + Adjust analog stick deadzone + % + Host Settings Optimize game settings Allow GFE to modify game settings for optimal streaming diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 5e1cb8c6..5a158cdd 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -26,6 +26,14 @@ android:summary="@string/summary_checkbox_disable_warnings" android:defaultValue="false" /> + + +