mirror of
https://github.com/moonlight-stream/moonlight-android.git
synced 2025-07-19 11:03:01 +00:00
Add deadzone preference
This commit is contained in:
parent
1b9846d519
commit
6338e7b8eb
@ -173,7 +173,7 @@ public class Game extends Activity implements SurfaceHolder.Callback,
|
|||||||
// Initialize the connection
|
// Initialize the connection
|
||||||
conn = new NvConnection(host, uniqueId, Game.this, config, PlatformBinding.getCryptoProvider(this));
|
conn = new NvConnection(host, uniqueId, Game.this, config, PlatformBinding.getCryptoProvider(this));
|
||||||
keybTranslator = new KeyboardTranslator(conn);
|
keybTranslator = new KeyboardTranslator(conn);
|
||||||
controllerHandler = new ControllerHandler(conn);
|
controllerHandler = new ControllerHandler(conn, prefConfig.deadzonePercentage);
|
||||||
|
|
||||||
SurfaceHolder sh = sv.getHolder();
|
SurfaceHolder sh = sv.getHolder();
|
||||||
if (prefConfig.stretchVideo || !decoderRenderer.isHardwareAccelerated()) {
|
if (prefConfig.stretchVideo || !decoderRenderer.isHardwareAccelerated()) {
|
||||||
|
@ -44,9 +44,11 @@ public class ControllerHandler {
|
|||||||
private HashMap<String, ControllerMapping> mappings = new HashMap<String, ControllerMapping>();
|
private HashMap<String, ControllerMapping> mappings = new HashMap<String, ControllerMapping>();
|
||||||
|
|
||||||
private NvConnection conn;
|
private NvConnection conn;
|
||||||
|
private double stickDeadzone;
|
||||||
|
|
||||||
public ControllerHandler(NvConnection conn) {
|
public ControllerHandler(NvConnection conn, int deadzonePercentage) {
|
||||||
this.conn = conn;
|
this.conn = conn;
|
||||||
|
this.stickDeadzone = (double)deadzonePercentage / 100.0;
|
||||||
|
|
||||||
// We want limelight-common to scale the axis values to match Xinput values
|
// We want limelight-common to scale the axis values to match Xinput values
|
||||||
ControllerPacket.enableAxisScaling = true;
|
ControllerPacket.enableAxisScaling = true;
|
||||||
@ -148,56 +150,12 @@ public class ControllerHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (mapping.leftStickXAxis != -1 && mapping.leftStickYAxis != -1) {
|
if (mapping.leftStickXAxis != -1 && mapping.leftStickYAxis != -1) {
|
||||||
InputDevice.MotionRange lsXRange = getMotionRangeForJoystickAxis(dev, mapping.leftStickXAxis);
|
mapping.leftStickDeadzoneRadius = (float) stickDeadzone;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mapping.rightStickXAxis != -1 && mapping.rightStickYAxis != -1) {
|
if (mapping.rightStickXAxis != -1 && mapping.rightStickYAxis != -1) {
|
||||||
InputDevice.MotionRange rsXRange = getMotionRangeForJoystickAxis(dev, mapping.rightStickXAxis);
|
mapping.rightStickDeadzoneRadius = (float) stickDeadzone;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return mapping;
|
return mapping;
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ public class PreferenceConfiguration {
|
|||||||
private static final String SOPS_PREF_STRING = "checkbox_enable_sops";
|
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 DISABLE_TOASTS_PREF_STRING = "checkbox_disable_warnings";
|
||||||
private static final String HOST_AUDIO_PREF_STRING = "checkbox_host_audio";
|
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_30 = 5;
|
||||||
private static final int BITRATE_DEFAULT_720_60 = 10;
|
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_SOPS = true;
|
||||||
private static final boolean DEFAULT_DISABLE_TOASTS = false;
|
private static final boolean DEFAULT_DISABLE_TOASTS = false;
|
||||||
private static final boolean DEFAULT_HOST_AUDIO = 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 FORCE_HARDWARE_DECODER = -1;
|
||||||
public static final int AUTOSELECT_DECODER = 0;
|
public static final int AUTOSELECT_DECODER = 0;
|
||||||
@ -33,6 +35,7 @@ public class PreferenceConfiguration {
|
|||||||
public int width, height, fps;
|
public int width, height, fps;
|
||||||
public int bitrate;
|
public int bitrate;
|
||||||
public int decoder;
|
public int decoder;
|
||||||
|
public int deadzonePercentage;
|
||||||
public boolean stretchVideo, enableSops, playHostAudio, disableWarnings;
|
public boolean stretchVideo, enableSops, playHostAudio, disableWarnings;
|
||||||
|
|
||||||
public static int getDefaultBitrate(String resFpsString) {
|
public static int getDefaultBitrate(String resFpsString) {
|
||||||
@ -130,6 +133,8 @@ public class PreferenceConfiguration {
|
|||||||
|
|
||||||
config.decoder = getDecoderValue(context);
|
config.decoder = getDecoderValue(context);
|
||||||
|
|
||||||
|
config.deadzonePercentage = prefs.getInt(DEADZONE_PREF_STRING, DEFAULT_DEADZONE);
|
||||||
|
|
||||||
// Checkbox preferences
|
// Checkbox preferences
|
||||||
config.disableWarnings = prefs.getBoolean(DISABLE_TOASTS_PREF_STRING, DEFAULT_DISABLE_TOASTS);
|
config.disableWarnings = prefs.getBoolean(DISABLE_TOASTS_PREF_STRING, DEFAULT_DISABLE_TOASTS);
|
||||||
config.enableSops = prefs.getBoolean(SOPS_PREF_STRING, DEFAULT_SOPS);
|
config.enableSops = prefs.getBoolean(SOPS_PREF_STRING, DEFAULT_SOPS);
|
||||||
|
@ -48,7 +48,7 @@ public class SeekBarPreference extends DialogPreference
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get default and max seekbar values
|
// 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);
|
maxValue = attrs.getAttributeIntValue(SCHEMA_URL, "max", 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,7 +80,7 @@ public class SeekBarPreference extends DialogPreference
|
|||||||
@Override
|
@Override
|
||||||
public void onProgressChanged(SeekBar seekBar, int value, boolean b) {
|
public void onProgressChanged(SeekBar seekBar, int value, boolean b) {
|
||||||
String t = String.valueOf(value);
|
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
|
@Override
|
||||||
|
@ -94,6 +94,10 @@
|
|||||||
<string name="title_checkbox_disable_warnings">Disable warning messages</string>
|
<string name="title_checkbox_disable_warnings">Disable warning messages</string>
|
||||||
<string name="summary_checkbox_disable_warnings">Disable on-screen connection warning messages while streaming</string>
|
<string name="summary_checkbox_disable_warnings">Disable on-screen connection warning messages while streaming</string>
|
||||||
|
|
||||||
|
<string name="category_gamepad_settings">Gamepad Settings</string>
|
||||||
|
<string name="title_seekbar_deadzone">Adjust analog stick deadzone</string>
|
||||||
|
<string name="suffix_seekbar_deadzone">%</string>
|
||||||
|
|
||||||
<string name="category_host_settings">Host Settings</string>
|
<string name="category_host_settings">Host Settings</string>
|
||||||
<string name="title_checkbox_enable_sops">Optimize game settings</string>
|
<string name="title_checkbox_enable_sops">Optimize game settings</string>
|
||||||
<string name="summary_checkbox_enable_sops">Allow GFE to modify game settings for optimal streaming</string>
|
<string name="summary_checkbox_enable_sops">Allow GFE to modify game settings for optimal streaming</string>
|
||||||
|
@ -26,6 +26,14 @@
|
|||||||
android:summary="@string/summary_checkbox_disable_warnings"
|
android:summary="@string/summary_checkbox_disable_warnings"
|
||||||
android:defaultValue="false" />
|
android:defaultValue="false" />
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
|
<PreferenceCategory android:title="@string/category_gamepad_settings">
|
||||||
|
<com.limelight.preferences.SeekBarPreference
|
||||||
|
android:key="seekbar_deadzone"
|
||||||
|
android:defaultValue="15"
|
||||||
|
android:max="50"
|
||||||
|
android:text="@string/suffix_seekbar_deadzone"
|
||||||
|
android:title="@string/title_seekbar_deadzone"/>
|
||||||
|
</PreferenceCategory>
|
||||||
<PreferenceCategory android:title="@string/category_host_settings">
|
<PreferenceCategory android:title="@string/category_host_settings">
|
||||||
<CheckBoxPreference
|
<CheckBoxPreference
|
||||||
android:key="checkbox_enable_sops"
|
android:key="checkbox_enable_sops"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user