diff --git a/bHapticsManager/BHapticsConnection.cs b/bHapticsManager/BHapticsConnection.cs index cfe246c..4b7c207 100644 --- a/bHapticsManager/BHapticsConnection.cs +++ b/bHapticsManager/BHapticsConnection.cs @@ -17,6 +17,7 @@ public class BHapticsConnection { private static ModernBHapticsWorkerThread _workerThread = null!; private static bool _isInitialized = false; + private static readonly object _initializeLock = new(); private static readonly object _shutdownLock = new(); private static bool _isShuttingDown = false; @@ -37,36 +38,38 @@ internal void RaiseDeviceDisconnected(LegacyBHaptics.PositionType position) { /// Called once during mod initialization. public static bool Initialize() { - if (_isInitialized) { - ResoniteMod.Warn("Already initialized - skipping duplicate connection"); - return true; - } - - // Connect to bHaptics Player - bool connected = ModernBHaptics.bHapticsManager.Connect("Resonite", "Resonite", true, 10); - - if (!connected) { - ResoniteMod.Error("Failed to connect to bHaptics Player!"); - ResoniteMod.Error("Make sure bHaptics Player is running and try restarting Resonite."); - return false; - } + lock (_initializeLock) { + if (_isInitialized) { + ResoniteMod.Warn("Already initialized - skipping duplicate connection"); + return true; + } + + // Connect to bHaptics Player + bool connected = ModernBHaptics.bHapticsManager.Connect("Resonite", "Resonite", true, 10); + + if (!connected) { + ResoniteMod.Error("Failed to connect to bHaptics Player!"); + ResoniteMod.Error("Make sure bHaptics Player is running and try restarting Resonite."); + return false; + } - _isInitialized = true; - ResoniteMod.Msg("bHapticsManager connected successfully!"); - - // Log connected devices - int deviceCount = ModernBHaptics.bHapticsManager.GetConnectedDeviceCount(); - ResoniteMod.Msg($"Connected devices: {deviceCount}"); - - foreach (ModernBHaptics.PositionID pos in Enum.GetValues(typeof(ModernBHaptics.PositionID))) { - if (ModernBHaptics.bHapticsManager.IsDeviceConnected(pos)) { - ResoniteMod.Debug($"Device {pos} ready"); - // Add to cache - DeviceCache[pos] = (true, DateTime.Now); + _isInitialized = true; + ResoniteMod.Msg("bHapticsManager connected successfully!"); + + // Log connected devices + int deviceCount = ModernBHaptics.bHapticsManager.GetConnectedDeviceCount(); + ResoniteMod.Msg($"Connected devices: {deviceCount}"); + + foreach (ModernBHaptics.PositionID pos in Enum.GetValues(typeof(ModernBHaptics.PositionID))) { + if (ModernBHaptics.bHapticsManager.IsDeviceConnected(pos)) { + ResoniteMod.Debug($"Device {pos} ready"); + // Add to cache + DeviceCache[pos] = (true, DateTime.Now); + } } - } - return true; + return true; + } } public List GetConnectedDevices() { @@ -185,7 +188,9 @@ public static void Shutdown() { ResoniteMod.Error($"Error clearing device cache: {ex}"); } - _isInitialized = false; + lock (_initializeLock) { + _isInitialized = false; + } ResoniteMod.Msg("bHaptics connection shutdown complete"); } catch (Exception ex) {