SDL: Fixed non-Apple builds

From 86bc65a74122d13fc9ae8ef1b4c2961e69d59ee2 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Sun, 7 Nov 2021 11:35:12 -0800
Subject: [PATCH] Fixed non-Apple builds

---
 src/joystick/SDL_gamecontroller.c       | 22 ++++++++++++++++++++++
 src/joystick/hidapi/SDL_hidapi_switch.c | 24 ++++++++++++++++++++----
 src/joystick/iphoneos/SDL_mfijoystick.m |  6 ++----
 3 files changed, 44 insertions(+), 8 deletions(-)

diff --git a/src/joystick/SDL_gamecontroller.c b/src/joystick/SDL_gamecontroller.c
index e6ae4fb8f5..d65439b6c2 100644
--- a/src/joystick/SDL_gamecontroller.c
+++ b/src/joystick/SDL_gamecontroller.c
@@ -2675,4 +2675,26 @@ SDL_GameControllerHandleDelayedGuideButton(SDL_Joystick *joystick)
     }
 }
 
+const char *
+SDL_GameControllerGetAppleSFSymbolsNameForButton(SDL_GameController *gamecontroller, SDL_GameControllerButton button)
+{
+#if defined(SDL_JOYSTICK_MFI)
+    const char *IOS_SDL_GameControllerGetAppleSFSymbolsNameForButton(SDL_GameController *gamecontroller, SDL_GameControllerButton button);
+    return IOS_SDL_GameControllerGetAppleSFSymbolsNameForButton(gamecontroller, button);
+#else
+    return NULL;
+#endif
+}
+
+const char *
+SDL_GameControllerGetAppleSFSymbolsNameForAxis(SDL_GameController *gamecontroller, SDL_GameControllerAxis axis)
+{
+#if defined(SDL_JOYSTICK_MFI)
+    const char *IOS_SDL_GameControllerGetAppleSFSymbolsNameForAxis(SDL_GameController *gamecontroller, SDL_GameControllerAxis axis);
+    return IOS_SDL_GameControllerGetAppleSFSymbolsNameForAxis(gamecontroller, axis);
+#else
+    return NULL;
+#endif
+}
+
 /* vi: set ts=4 sw=4 expandtab: */
diff --git a/src/joystick/hidapi/SDL_hidapi_switch.c b/src/joystick/hidapi/SDL_hidapi_switch.c
index 70fa710c82..f26ec2481c 100644
--- a/src/joystick/hidapi/SDL_hidapi_switch.c
+++ b/src/joystick/hidapi/SDL_hidapi_switch.c
@@ -1006,11 +1006,27 @@ HIDAPI_DriverSwitch_ActuallyRumbleJoystick(SDL_DriverSwitch_Context *ctx, Uint16
      *
      * More information about these values can be found here:
      * https://github.com/dekuNukem/Nintendo_Switch_Reverse_Engineering/blob/master/rumble_data_table.md
+     *
+     * The switch's rumble doesn't act like a traditional controller with two separate motors attached to
+     * different sized weights. Instead, the two values are like two sine waves that get added together.
+     * You can play around with different combinations here https://www.desmos.com/calculator/0lqas9aq89
+     * There's a fairly narrow frequency range around 100-250Hz that really shakes the controller,
+     * everything else is quite weak. To get a low frequency rumble, you can offset two frequencies
+     * by a target low rumble frequency, which gets you a very noticeable variation in amplitude.
+     * (It'll be much clearer if you click that link and play around a bit)
+     * I picked 0xA4 and 0x3E based on a sweep of values ~40hz apart, because they produced the least rattle
+     * in my controller. This may not extend to other Switch controllers, however.
      */
-    const Uint16 k_usHighFreq = 0x0074;
-    const Uint8  k_ucHighFreqAmp = EncodeRumbleHighAmplitude(high_frequency_rumble);
-    const Uint8  k_ucLowFreq = 0x3D;
-    const Uint16 k_usLowFreqAmp = EncodeRumbleLowAmplitude(low_frequency_rumble);
+
+    /* Maximum low frequency is reached when both values are the same */
+    /* Maximum high frequency is reached with one value at zero */
+    const Uint32 lowOutput = low_frequency_rumble + high_frequency_rumble;
+    const Uint16 highOutput = low_frequency_rumble;
+
+    const Uint16 k_usHighFreq = 0xA4; /* ~194.4Hz */
+    const Uint8  k_ucHighFreqAmp = EncodeRumbleHighAmplitude(highOutput);
+    const Uint8  k_ucLowFreq = 0x3E; /* ~153.2Hz */
+    const Uint16 k_usLowFreqAmp = EncodeRumbleLowAmplitude(SDL_min(lowOutput, SDL_MAX_UINT16));
 
     if (low_frequency_rumble || high_frequency_rumble) {
         EncodeRumble(&ctx->m_RumblePacket.rumbleData[0], k_usHighFreq, k_ucHighFreqAmp, k_ucLowFreq, k_usLowFreqAmp);
diff --git a/src/joystick/iphoneos/SDL_mfijoystick.m b/src/joystick/iphoneos/SDL_mfijoystick.m
index aa01657584..74cb39b9c8 100644
--- a/src/joystick/iphoneos/SDL_mfijoystick.m
+++ b/src/joystick/iphoneos/SDL_mfijoystick.m
@@ -1585,7 +1585,7 @@ SDL_bool IOS_SupportedHIDDevice(IOHIDDeviceRef device)
 static char elementName[256];
 
 const char *
-SDL_GameControllerGetAppleSFSymbolsNameForButton(SDL_GameController *gamecontroller, SDL_GameControllerButton button)
+IOS_GameControllerGetAppleSFSymbolsNameForButton(SDL_GameController *gamecontroller, SDL_GameControllerButton button)
 {
     elementName[0] = '\0';
 #if defined(SDL_JOYSTICK_MFI) && defined(ENABLE_PHYSICAL_INPUT_PROFILE)
@@ -1697,9 +1697,8 @@ SDL_bool IOS_SupportedHIDDevice(IOHIDDeviceRef device)
     return elementName;
 }
 
-
 const char *
-SDL_GameControllerGetAppleSFSymbolsNameForAxis(SDL_GameController *gamecontroller, SDL_GameControllerAxis axis)
+IOS_GameControllerGetAppleSFSymbolsNameForAxis(SDL_GameController *gamecontroller, SDL_GameControllerAxis axis)
 {
     elementName[0] = '\0';
 #if defined(SDL_JOYSTICK_MFI) && defined(ENABLE_PHYSICAL_INPUT_PROFILE)
@@ -1739,7 +1738,6 @@ SDL_bool IOS_SupportedHIDDevice(IOHIDDeviceRef device)
 }
 
 
-
 SDL_JoystickDriver SDL_IOS_JoystickDriver =
 {
     IOS_JoystickInit,