mirror of
https://github.com/DarthAffe/RGB.NET.git
synced 2025-12-12 17:48:31 +00:00
Implemented recommended dispose pattern for DeviceProviders
This commit is contained in:
parent
56d77dee35
commit
fdc69fdac5
@ -12,6 +12,8 @@ public abstract class AbstractRGBDeviceProvider : IRGBDeviceProvider
|
||||
{
|
||||
#region Properties & Fields
|
||||
|
||||
private bool _isDisposed = false;
|
||||
|
||||
private readonly double _defaultUpdateRateHardLimit;
|
||||
|
||||
/// <inheritdoc />
|
||||
@ -60,6 +62,8 @@ public abstract class AbstractRGBDeviceProvider : IRGBDeviceProvider
|
||||
this._defaultUpdateRateHardLimit = defaultUpdateRateHardLimit;
|
||||
}
|
||||
|
||||
~AbstractRGBDeviceProvider() => Dispose(false);
|
||||
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
@ -67,6 +71,8 @@ public abstract class AbstractRGBDeviceProvider : IRGBDeviceProvider
|
||||
/// <inheritdoc />
|
||||
public bool Initialize(RGBDeviceType loadFilter = RGBDeviceType.All, bool throwExceptions = false)
|
||||
{
|
||||
if (_isDisposed) throw new ObjectDisposedException(GetType().FullName);
|
||||
|
||||
ThrowsExceptions = throwExceptions;
|
||||
|
||||
try
|
||||
@ -108,6 +114,8 @@ public abstract class AbstractRGBDeviceProvider : IRGBDeviceProvider
|
||||
/// <returns>The filtered collection of loaded devices.</returns>
|
||||
protected virtual IEnumerable<IRGBDevice> GetLoadedDevices(RGBDeviceType loadFilter)
|
||||
{
|
||||
if (_isDisposed) throw new ObjectDisposedException(GetType().FullName);
|
||||
|
||||
List<IRGBDevice> devices = new();
|
||||
foreach (IRGBDevice device in LoadDevices())
|
||||
{
|
||||
@ -152,6 +160,8 @@ public abstract class AbstractRGBDeviceProvider : IRGBDeviceProvider
|
||||
/// <returns>The update trigger mapped to the specified id.</returns>
|
||||
protected virtual IDeviceUpdateTrigger GetUpdateTrigger(int id = -1, double? updateRateHardLimit = null)
|
||||
{
|
||||
if (_isDisposed) throw new ObjectDisposedException(GetType().FullName);
|
||||
|
||||
if (!UpdateTriggerMapping.TryGetValue(id, out IDeviceUpdateTrigger? updaeTrigger))
|
||||
UpdateTriggerMapping[id] = (updaeTrigger = CreateUpdateTrigger(id, updateRateHardLimit ?? _defaultUpdateRateHardLimit));
|
||||
|
||||
@ -171,6 +181,8 @@ public abstract class AbstractRGBDeviceProvider : IRGBDeviceProvider
|
||||
/// </summary>
|
||||
protected virtual void Reset()
|
||||
{
|
||||
if (_isDisposed) throw new ObjectDisposedException(GetType().FullName);
|
||||
|
||||
foreach (IDeviceUpdateTrigger updateTrigger in UpdateTriggerMapping.Values)
|
||||
updateTrigger.Dispose();
|
||||
|
||||
@ -192,6 +204,8 @@ public abstract class AbstractRGBDeviceProvider : IRGBDeviceProvider
|
||||
/// <returns><c>true</c> if the device was added successfully; otherwise <c>false</c>.</returns>
|
||||
protected virtual bool AddDevice(IRGBDevice device)
|
||||
{
|
||||
if (_isDisposed) throw new ObjectDisposedException(GetType().FullName);
|
||||
|
||||
if (InternalDevices.Contains(device)) return false;
|
||||
|
||||
InternalDevices.Add(device);
|
||||
@ -207,6 +221,8 @@ public abstract class AbstractRGBDeviceProvider : IRGBDeviceProvider
|
||||
/// <returns><c>true</c> if the device was removed successfully; otherwise <c>false</c>.</returns>
|
||||
protected virtual bool RemoveDevice(IRGBDevice device)
|
||||
{
|
||||
if (_isDisposed) throw new ObjectDisposedException(GetType().FullName);
|
||||
|
||||
if (!InternalDevices.Remove(device)) return false;
|
||||
|
||||
try { OnDevicesChanged(DevicesChangedEventArgs.CreateDevicesRemovedArgs(device)); } catch { /* we don't want to throw due to bad event handlers */ }
|
||||
@ -241,12 +257,26 @@ public abstract class AbstractRGBDeviceProvider : IRGBDeviceProvider
|
||||
protected virtual void OnDevicesChanged(DevicesChangedEventArgs args) => DevicesChanged?.Invoke(this, args);
|
||||
|
||||
/// <inheritdoc />
|
||||
public virtual void Dispose()
|
||||
public void Dispose()
|
||||
{
|
||||
Reset();
|
||||
if (_isDisposed) return;
|
||||
|
||||
try
|
||||
{
|
||||
Dispose(true);
|
||||
}
|
||||
catch { /* don't throw in dispose! */ }
|
||||
|
||||
GC.SuppressFinalize(this);
|
||||
|
||||
_isDisposed = true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Disposes the object and frees all resources.
|
||||
/// </summary>
|
||||
/// <param name="disposing"><c>true</c> if explicitely called through the Dispose-Method, <c>false</c> if called by the destructor.</param>
|
||||
protected virtual void Dispose(bool disposing) => Reset();
|
||||
|
||||
#endregion
|
||||
}
|
||||
@ -80,15 +80,16 @@ public sealed class AsusDeviceProvider : AbstractRGBDeviceProvider
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void Dispose()
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose();
|
||||
base.Dispose(disposing);
|
||||
|
||||
try { _sdk?.ReleaseControl(0); }
|
||||
catch { /* at least we tried */ }
|
||||
|
||||
_devices = null;
|
||||
_sdk = null;
|
||||
_instance = null;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@ -94,12 +94,14 @@ public sealed class CoolerMasterDeviceProvider : AbstractRGBDeviceProvider
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void Dispose()
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose();
|
||||
base.Dispose(disposing);
|
||||
|
||||
try { _CoolerMasterSDK.Reload(); }
|
||||
catch { /* Unlucky.. */ }
|
||||
|
||||
_instance = null;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@ -300,12 +300,14 @@ public sealed class CorsairDeviceProvider : AbstractRGBDeviceProvider
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void Dispose()
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose();
|
||||
base.Dispose(disposing);
|
||||
|
||||
try { _CUESDK.CorsairDisconnect(); } catch { /* at least we tried */ }
|
||||
try { _CUESDK.UnloadCUESDK(); } catch { /* at least we tried */ }
|
||||
|
||||
_instance = null;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@ -86,5 +86,13 @@ public sealed class DMXDeviceProvider : AbstractRGBDeviceProvider
|
||||
return updateTrigger;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
|
||||
_instance = null;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@ -66,11 +66,13 @@ public sealed class DebugDeviceProvider : AbstractRGBDeviceProvider
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void Dispose()
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose();
|
||||
base.Dispose(disposing);
|
||||
|
||||
_fakeDeviceDefinitions.Clear();
|
||||
|
||||
_instance = null;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@ -254,9 +254,9 @@ public class LogitechDeviceProvider : AbstractRGBDeviceProvider
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void Dispose()
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose();
|
||||
base.Dispose(disposing);
|
||||
|
||||
try { _LogitechGSDK.LogiLedRestoreLighting(); }
|
||||
catch { /* at least we tried */ }
|
||||
@ -264,7 +264,7 @@ public class LogitechDeviceProvider : AbstractRGBDeviceProvider
|
||||
try { _LogitechGSDK.UnloadLogitechGSDK(); }
|
||||
catch { /* at least we tried */ }
|
||||
|
||||
GC.SuppressFinalize(this);
|
||||
_instance = null;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@ -98,14 +98,14 @@ public class MsiDeviceProvider : AbstractRGBDeviceProvider
|
||||
private void ThrowMsiError(int errorCode, bool isCritical = false) => Throw(new MysticLightException(errorCode, _MsiSDK.GetErrorMessage(errorCode)), isCritical);
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void Dispose()
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose();
|
||||
base.Dispose(disposing);
|
||||
|
||||
try { _MsiSDK.UnloadMsiSDK(); }
|
||||
catch { /* at least we tried */ }
|
||||
|
||||
GC.SuppressFinalize(this);
|
||||
|
||||
_instance = null;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@ -67,5 +67,13 @@ public sealed class NovationDeviceProvider : AbstractRGBDeviceProvider
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
|
||||
_instance = null;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@ -107,22 +107,22 @@ public sealed class OpenRGBDeviceProvider : AbstractRGBDeviceProvider
|
||||
continue;
|
||||
}
|
||||
|
||||
if (device.Zones.Length == 0)
|
||||
if (device.Zones.Length == 0)
|
||||
continue;
|
||||
if (device.Zones.All(z => z.LedCount == 0))
|
||||
if (device.Zones.All(z => z.LedCount == 0))
|
||||
continue;
|
||||
|
||||
OpenRGBUpdateQueue updateQueue = new(GetUpdateTrigger(), i, openRgb, device);
|
||||
|
||||
|
||||
bool anyZoneHasSegments = device.Zones.Any(z => z.Segments.Length > 0);
|
||||
bool splitDeviceByZones = anyZoneHasSegments || PerZoneDeviceFlag.HasFlag(Helper.GetRgbNetDeviceType(device.Type));
|
||||
bool splitDeviceByZones = anyZoneHasSegments || PerZoneDeviceFlag.HasFlag(Helper.GetRgbNetDeviceType(device.Type));
|
||||
|
||||
if (!splitDeviceByZones)
|
||||
{
|
||||
yield return new OpenRGBGenericDevice(new OpenRGBDeviceInfo(device), updateQueue);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
int totalLedCount = 0;
|
||||
|
||||
foreach (Zone zone in device.Zones)
|
||||
@ -149,9 +149,9 @@ public sealed class OpenRGBDeviceProvider : AbstractRGBDeviceProvider
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void Dispose()
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose();
|
||||
base.Dispose(disposing);
|
||||
|
||||
foreach (OpenRgbClient client in _clients)
|
||||
{
|
||||
@ -161,6 +161,8 @@ public sealed class OpenRGBDeviceProvider : AbstractRGBDeviceProvider
|
||||
|
||||
_clients.Clear();
|
||||
DeviceDefinitions.Clear();
|
||||
|
||||
_instance = null;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@ -126,5 +126,13 @@ public sealed class PicoPiDeviceProvider : AbstractRGBDeviceProvider
|
||||
_sdks.Clear();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
|
||||
_instance = null;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@ -342,15 +342,17 @@ public sealed class RazerDeviceProvider : AbstractRGBDeviceProvider
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void Dispose()
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose();
|
||||
base.Dispose(disposing);
|
||||
|
||||
TryUnInit();
|
||||
|
||||
// DarthAffe 03.03.2020: Fails with an access-violation - verify if an unload is already triggered by uninit
|
||||
//try { _RazerSDK.UnloadRazerSDK(); }
|
||||
//catch { /* at least we tried */ }
|
||||
|
||||
_instance = null;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@ -133,12 +133,14 @@ public sealed class SteelSeriesDeviceProvider : AbstractRGBDeviceProvider
|
||||
protected override IDeviceUpdateTrigger CreateUpdateTrigger(int id, double updateRateHardLimit) => new DeviceUpdateTrigger(updateRateHardLimit) { HeartbeatTimer = HEARTBEAT_TIMER };
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void Dispose()
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose();
|
||||
base.Dispose(disposing);
|
||||
|
||||
try { SteelSeriesSDK.Dispose(); }
|
||||
catch { /* shit happens */ }
|
||||
|
||||
_instance = null;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@ -70,11 +70,13 @@ public sealed class WS281XDeviceProvider : AbstractRGBDeviceProvider
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void Dispose()
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose();
|
||||
base.Dispose(disposing);
|
||||
|
||||
DeviceDefinitions.Clear();
|
||||
|
||||
_instance = null;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@ -94,15 +94,17 @@ public sealed class WootingDeviceProvider : AbstractRGBDeviceProvider
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void Dispose()
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose();
|
||||
base.Dispose(disposing);
|
||||
|
||||
lock (_WootingSDK.SdkLock)
|
||||
{
|
||||
try { _WootingSDK.UnloadWootingSDK(); }
|
||||
catch { /* at least we tried */ }
|
||||
}
|
||||
|
||||
_instance = null;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user