using Ryujinx.Audio.Renderer.Common; using Ryujinx.Audio.Renderer.Parameter; using Ryujinx.Audio.Renderer.Parameter.Sink; using Ryujinx.Audio.Renderer.Server.MemoryPool; using Ryujinx.Audio.Renderer.Server.Upsampler; using System; using System.Diagnostics; using System.Runtime.InteropServices; namespace Ryujinx.Audio.Renderer.Server.Sink { /// /// Server information for a device sink. /// public class DeviceSink : BaseSink { /// /// The downmix coefficients. /// public float[] DownMixCoefficients; /// /// The device parameters. /// public DeviceParameter Parameter; /// /// The upsampler instance used by this sink. /// /// Null if no upsampling is needed. public UpsamplerState UpsamplerState; /// /// Create a new . /// public DeviceSink() { DownMixCoefficients = new float[4]; } public override void CleanUp() { UpsamplerState?.Release(); UpsamplerState = null; base.CleanUp(); } public override SinkType TargetSinkType => SinkType.Device; public override void Update(out BehaviourParameter.ErrorInfo errorInfo, ref SinkInParameter parameter, ref SinkOutStatus outStatus, PoolMapper mapper) { Debug.Assert(IsTypeValid(ref parameter)); ref DeviceParameter inputDeviceParameter = ref MemoryMarshal.Cast(parameter.SpecificData)[0]; if (parameter.IsUsed != IsUsed) { UpdateStandardParameter(ref parameter); Parameter = inputDeviceParameter; } else { Parameter.DownMixParameterEnabled = inputDeviceParameter.DownMixParameterEnabled; inputDeviceParameter.DownMixParameter.AsSpan().CopyTo(Parameter.DownMixParameter.AsSpan()); } Parameter.DownMixParameter.AsSpan().CopyTo(DownMixCoefficients.AsSpan()); errorInfo = new BehaviourParameter.ErrorInfo(); outStatus = new SinkOutStatus(); } } }