From 664ab7fab68d61ac8de077b392fe9fbb8533c11a Mon Sep 17 00:00:00 2001 From: Meerkov Date: Tue, 20 Jul 2021 17:06:16 -0700 Subject: [PATCH] Wire up haptics in Mupen core (squashed PR #2683) * Wire up host haptics, but only for OpenTK which doesn't support it and I'm hijacking the Fast Forward hotkey too * Fix Mupen 64 Vibration DLL * Enable Mupen 64 Vibration for DirectInput * Remove unused SDL dep from Mupen input-bkm plugin this allows it to be built without checking out the deps submodule, I guess * Fix in Mupen lib projects * Remove "Debug" haptic channel and debug hotkey, prepare Mupen * Fix remaining merge conflicts * ...with the correct channel name and hopefully no dangling whitespace changes * Fix typo from resolving merge conflict, and off-by-one error Co-authored-by: YoshiRulz --- Assets/dll/mupen64plus-input-bkm.dll | Bin 10240 -> 13312 bytes .../mupen64plus-input-bkm.vcxproj | 1 + libmupen64plus/mupen64plus-input-bkm/plugin.c | 1 + .../Consoles/Nintendo/N64/N64Input.cs | 5 ++++- .../N64/NativeApi/mupen64plusInputApi.cs | 20 +++--------------- 5 files changed, 9 insertions(+), 18 deletions(-) diff --git a/Assets/dll/mupen64plus-input-bkm.dll b/Assets/dll/mupen64plus-input-bkm.dll index 434c6d1a03e60b6145befe3e5e2c1c0790a9481f..f3d8a91c1997b74ce09c819367dbeac718c9e2e2 100644 GIT binary patch literal 13312 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­34w@e z7Sa@oM%zQ-yNIw->Owvk_(B0P7!*TrKgMRUpwKOZB~b{D zYnY1hh>x*QA~L@#HGfkiHb0yc=fez<`26U?`3vW36TGAy|7|Bmx`a}WS4}I$Xj3R5 zLU-CT^gmw5h~|&S?~)R9OQ7pPGxqpq#(qaFYa-a2q3G%uhV8)rq?uR8w8iLX?hXqH zV!v564rBjh#%}u9<{7l&O;R!mOVGm8qJPWW3X?}-AyFuj@af!_(kt=g%|eKD4Zuan zfC1ANB_X*vAS65ENkpG8W`SA4F|PiwbYBOXRYGmukVJd|k&O^_)#j8abhW}jo)jh^ z5XNR1ypa?whsNxWv?oK!%@i6^ELx^TIJ%dt^26D9h-3FdTd&YAtzR!Bi&}ove*eEt zd--;5sPmVKQv4!TJiF*zGomcu^ckGjVDa43sh@(sa|@K_oRo`x2SvO=gL{E*2Tpm( zQ^-#q22T0PS(HbCCy<-`0p$tcBY@WU*H7) z9fijFCEy=*d<1abRT}+sfNeTXP}1>kz(;kQ;7@eC7qEH;V{bzyK^}$V6I`d`1iyzu zdOiW@Lf%REBEUmbz)x^QrxToZjmGmiz)c*^z{SWF0iQvs22OB9#|b`w9M=gt-6tj> zXC@sc0j@{!f{x#?*!?IC!0|hln&Z2HQ?5@ryaoIODSs!NAm!eK6Qq3kLEr=%P)-B? z^!Z1yfB{(!d=4%&eztUHP}AWL(eV!?j7M8r8)Nr=#Nn`XS$9{o_)}lw+=aDub2$M& zCw4?)>l^2;ZoPSa!(1*UBFzg$k^VH!-7KW$F1yKExio}dc95WN<{%)JYMd)2V>hP4 z8-%VX!~}G>GE3rD9S_;Retd*QL$+ z1Zl2WYCrT$AvH@z#Lapgl%((#38M%dfn;POGKlp;YP7MmxmnHXkSFAk37kvCEOBamOY3YK|$)Wqw1x34|f_3@C vr%wML`CXP>_FdJxxLw`5dUka`zVq>iA8*+0-p%h0?EXXG+4JO$ literal 10240 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 diff --git a/libmupen64plus/mupen64plus-input-bkm/mupen64plus-input-bkm/mupen64plus-input-bkm.vcxproj b/libmupen64plus/mupen64plus-input-bkm/mupen64plus-input-bkm/mupen64plus-input-bkm.vcxproj index 6d95c34e2d..deb25ec98c 100644 --- a/libmupen64plus/mupen64plus-input-bkm/mupen64plus-input-bkm/mupen64plus-input-bkm.vcxproj +++ b/libmupen64plus/mupen64plus-input-bkm/mupen64plus-input-bkm/mupen64plus-input-bkm.vcxproj @@ -21,6 +21,7 @@ {3D8BD211-6002-4698-B5C1-A0F3146B6ACF} mupen64plusinputbkm + 10.0 diff --git a/libmupen64plus/mupen64plus-input-bkm/plugin.c b/libmupen64plus/mupen64plus-input-bkm/plugin.c index 953a45a618..8e1a15965e 100644 --- a/libmupen64plus/mupen64plus-input-bkm/plugin.c +++ b/libmupen64plus/mupen64plus-input-bkm/plugin.c @@ -424,6 +424,7 @@ EXPORT void CALL SetInputCallback(int (*inputCallback)(int i)) ---------------------------------------------------------------------- */ EXPORT void CALL SetRumbleCallback(void (*rumbleCallback)(int Control, int on)) { + l_setrumbleCallback = rumbleCallback; } /* ---------------------------------------------------------------------- diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/N64/N64Input.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/N64/N64Input.cs index da9b5f13be..e40b871963 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/N64/N64Input.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/N64/N64Input.cs @@ -18,7 +18,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.N64 _emuCore = emuCore; _api = new mupen64plusInputApi(core); - _api.SetM64PInputCallback(GetControllerInput); + _api.SetM64PInputCallbacks(GetControllerInput, SetRumble); core.VInterrupt += ShiftInputPolledBools; for (int i = 0; i < controllerSettings.Length; ++i) @@ -86,6 +86,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.N64 return value; } + private void SetRumble(int player, int bIsActive) + => Controller.SetHapticChannelStrength($"P{player + 1} Rumble Pak", bIsActive == 0 ? 0 : int.MaxValue); + /// /// Read all buttons from a controller and translate them /// into a form the N64 understands diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/N64/NativeApi/mupen64plusInputApi.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/N64/NativeApi/mupen64plusInputApi.cs index 57094e9f22..259220cc70 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/N64/NativeApi/mupen64plusInputApi.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/N64/NativeApi/mupen64plusInputApi.cs @@ -58,11 +58,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.N64.NativeApi private readonly SetControllerConnected InpSetControllerConnected; - /// - /// Event fired when mupen changes rumble pak status - /// - private event RumbleCallback OnRumbleChange; - public mupen64plusInputApi(mupen64plusApi core) { T GetInputDelegate(string proc) where T : Delegate => mupen64plusApi.GetTypedDelegate(InpDll, proc); @@ -70,25 +65,16 @@ namespace BizHawk.Emulation.Cores.Nintendo.N64.NativeApi InpDll = core.AttachPlugin(mupen64plusApi.m64p_plugin_type.M64PLUGIN_INPUT, "mupen64plus-input-bkm.dll"); - mupen64plusApi.m64p_error result; InpSetInputCallback = GetInputDelegate("SetInputCallback"); InpSetRumbleCallback = GetInputDelegate("SetRumbleCallback"); InpSetControllerPakType = GetInputDelegate("SetControllerPakType"); InpSetControllerConnected = GetInputDelegate("SetControllerConnected"); - - m64pRumbleCallback = new RumbleCallback(FireOnRumbleChange); - result = InpSetRumbleCallback(m64pRumbleCallback); } - public void SetM64PInputCallback(InputCallback inputCallback) + public void SetM64PInputCallbacks(InputCallback inputCallback, RumbleCallback rumbleCallback) { - InpInputCallback = inputCallback; - InpSetInputCallback(InpInputCallback); - } - - private void FireOnRumbleChange(int Control, int on) - { - OnRumbleChange?.Invoke(Control, @on); + InpSetInputCallback(InpInputCallback = inputCallback); + _ = InpSetRumbleCallback(m64pRumbleCallback = rumbleCallback); } public void SetM64PControllerPakType(int controller, N64SyncSettings.N64ControllerSettings.N64ControllerPakType type)