diff --git a/Assets/dll/mupen64plus-input-bkm.dll b/Assets/dll/mupen64plus-input-bkm.dll
index 434c6d1a03..f3d8a91c19 100644
Binary files a/Assets/dll/mupen64plus-input-bkm.dll and b/Assets/dll/mupen64plus-input-bkm.dll differ
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)