using System; using System.Runtime.InteropServices; using RGB.NET.Core; using RGB.NET.Devices.Corsair.Native; namespace RGB.NET.Devices.Corsair { /// /// /// Represents the update-queue performing updates for corsair devices. /// public class CorsairDeviceUpdateQueue : UpdateQueue { #region Properties & Fields private int _deviceIndex; #endregion #region Constructors /// /// Initializes a new instance of the class. /// /// The update trigger used by this queue. /// The index used to identify the device. public CorsairDeviceUpdateQueue(IDeviceUpdateTrigger updateTrigger, int deviceIndex) : base(updateTrigger) { this._deviceIndex = deviceIndex; } #endregion #region Methods /// protected override void Update(in ReadOnlySpan<(object key, Color color)> dataSet) { int structSize = Marshal.SizeOf(typeof(_CorsairLedColor)); IntPtr ptr = Marshal.AllocHGlobal(structSize * dataSet.Length); IntPtr addPtr = new(ptr.ToInt64()); foreach ((object key, Color color) in dataSet) { _CorsairLedColor corsairColor = new() { ledId = (int)key, r = color.GetR(), g = color.GetG(), b = color.GetB() }; Marshal.StructureToPtr(corsairColor, addPtr, false); addPtr = new IntPtr(addPtr.ToInt64() + structSize); } _CUESDK.CorsairSetLedsColorsBufferByDeviceIndex(_deviceIndex, dataSet.Length, ptr); _CUESDK.CorsairSetLedsColorsFlushBuffer(); Marshal.FreeHGlobal(ptr); } #endregion } }