// // Copyright (c) 2019-2021 Ryujinx // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with this program. If not, see . // 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.ToSpan().CopyTo(Parameter.DownMixParameter.ToSpan()); } Parameter.DownMixParameter.ToSpan().CopyTo(DownMixCoefficients.AsSpan()); errorInfo = new BehaviourParameter.ErrorInfo(); outStatus = new SinkOutStatus(); } } }