| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- //
- // Copyright (c) 2019-2020 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 <https://www.gnu.org/licenses/>.
- //
- 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
- {
- /// <summary>
- /// Server information for a device sink.
- /// </summary>
- public class DeviceSink : BaseSink
- {
- /// <summary>
- /// The downmix coefficients.
- /// </summary>
- public float[] DownMixCoefficients;
- /// <summary>
- /// The device parameters.
- /// </summary>
- public DeviceParameter Parameter;
- /// <summary>
- /// The upsampler instance used by this sink.
- /// </summary>
- /// <remarks>Null if no upsampling is needed.</remarks>
- public UpsamplerState UpsamplerState;
- /// <summary>
- /// Create a new <see cref="DeviceSink"/>.
- /// </summary>
- 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<byte, DeviceParameter>(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();
- }
- }
- }
|