diff options
Diffstat (limited to 'src/Ryujinx.Audio/Renderer/Parameter')
5 files changed, 68 insertions, 4 deletions
diff --git a/src/Ryujinx.Audio/Renderer/Parameter/Effect/CompressorParameter.cs b/src/Ryujinx.Audio/Renderer/Parameter/Effect/CompressorParameter.cs index b403f137..c00118e4 100644 --- a/src/Ryujinx.Audio/Renderer/Parameter/Effect/CompressorParameter.cs +++ b/src/Ryujinx.Audio/Renderer/Parameter/Effect/CompressorParameter.cs @@ -90,9 +90,16 @@ namespace Ryujinx.Audio.Renderer.Parameter.Effect public bool MakeupGainEnabled; /// <summary> - /// Reserved/padding. + /// Indicate if the compressor effect should output statistics. /// </summary> - private Array2<byte> _reserved; + [MarshalAs(UnmanagedType.I1)] + public bool StatisticsEnabled; + + /// <summary> + /// Indicate to the DSP that the user did a statistics reset. + /// </summary> + [MarshalAs(UnmanagedType.I1)] + public bool StatisticsReset; /// <summary> /// Check if the <see cref="ChannelCount"/> is valid. diff --git a/src/Ryujinx.Audio/Renderer/Parameter/Effect/CompressorStatistics.cs b/src/Ryujinx.Audio/Renderer/Parameter/Effect/CompressorStatistics.cs new file mode 100644 index 00000000..65335e2d --- /dev/null +++ b/src/Ryujinx.Audio/Renderer/Parameter/Effect/CompressorStatistics.cs @@ -0,0 +1,38 @@ +using Ryujinx.Common.Memory; +using System.Runtime.InteropServices; + +namespace Ryujinx.Audio.Renderer.Parameter.Effect +{ + /// <summary> + /// Effect result state for <seealso cref="Common.EffectType.Compressor"/>. + /// </summary> + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct CompressorStatistics + { + /// <summary> + /// Maximum input mean value since last reset. + /// </summary> + public float MaximumMean; + + /// <summary> + /// Minimum output gain since last reset. + /// </summary> + public float MinimumGain; + + /// <summary> + /// Last processed input sample, per channel. + /// </summary> + public Array6<float> LastSamples; + + /// <summary> + /// Reset the statistics. + /// </summary> + /// <param name="channelCount">Number of channels to reset.</param> + public void Reset(ushort channelCount) + { + MaximumMean = 0.0f; + MinimumGain = 1.0f; + LastSamples.AsSpan()[..channelCount].Clear(); + } + } +} diff --git a/src/Ryujinx.Audio/Renderer/Parameter/ISplitterDestinationInParameter.cs b/src/Ryujinx.Audio/Renderer/Parameter/ISplitterDestinationInParameter.cs index 807232f2..7ee49f11 100644 --- a/src/Ryujinx.Audio/Renderer/Parameter/ISplitterDestinationInParameter.cs +++ b/src/Ryujinx.Audio/Renderer/Parameter/ISplitterDestinationInParameter.cs @@ -29,6 +29,11 @@ namespace Ryujinx.Audio.Renderer.Parameter bool IsUsed { get; } /// <summary> + /// Set to true to force resetting the previous mix volumes. + /// </summary> + bool ResetPrevVolume { get; } + + /// <summary> /// Mix buffer volumes. /// </summary> /// <remarks>Used when a splitter id is specified in the mix.</remarks> diff --git a/src/Ryujinx.Audio/Renderer/Parameter/SplitterDestinationInParameterVersion1.cs b/src/Ryujinx.Audio/Renderer/Parameter/SplitterDestinationInParameterVersion1.cs index 029c001e..f346efcb 100644 --- a/src/Ryujinx.Audio/Renderer/Parameter/SplitterDestinationInParameterVersion1.cs +++ b/src/Ryujinx.Audio/Renderer/Parameter/SplitterDestinationInParameterVersion1.cs @@ -38,9 +38,15 @@ namespace Ryujinx.Audio.Renderer.Parameter public bool IsUsed; /// <summary> + /// Set to true to force resetting the previous mix volumes. + /// </summary> + [MarshalAs(UnmanagedType.I1)] + public bool ResetPrevVolume; + + /// <summary> /// Reserved/padding. /// </summary> - private unsafe fixed byte _reserved[3]; + private unsafe fixed byte _reserved[2]; [StructLayout(LayoutKind.Sequential, Size = sizeof(float) * Constants.MixBufferCountMax, Pack = 1)] private struct MixArray { } @@ -58,6 +64,7 @@ namespace Ryujinx.Audio.Renderer.Parameter readonly Array2<BiquadFilterParameter> ISplitterDestinationInParameter.BiquadFilters => default; readonly bool ISplitterDestinationInParameter.IsUsed => IsUsed; + readonly bool ISplitterDestinationInParameter.ResetPrevVolume => ResetPrevVolume; /// <summary> /// The expected constant of any input header. diff --git a/src/Ryujinx.Audio/Renderer/Parameter/SplitterDestinationInParameterVersion2.cs b/src/Ryujinx.Audio/Renderer/Parameter/SplitterDestinationInParameterVersion2.cs index 312be8b7..1d867919 100644 --- a/src/Ryujinx.Audio/Renderer/Parameter/SplitterDestinationInParameterVersion2.cs +++ b/src/Ryujinx.Audio/Renderer/Parameter/SplitterDestinationInParameterVersion2.cs @@ -43,9 +43,15 @@ namespace Ryujinx.Audio.Renderer.Parameter public bool IsUsed; /// <summary> + /// Set to true to force resetting the previous mix volumes. + /// </summary> + [MarshalAs(UnmanagedType.I1)] + public bool ResetPrevVolume; + + /// <summary> /// Reserved/padding. /// </summary> - private unsafe fixed byte _reserved[11]; + private unsafe fixed byte _reserved[10]; [StructLayout(LayoutKind.Sequential, Size = sizeof(float) * Constants.MixBufferCountMax, Pack = 1)] private struct MixArray { } @@ -63,6 +69,7 @@ namespace Ryujinx.Audio.Renderer.Parameter readonly Array2<BiquadFilterParameter> ISplitterDestinationInParameter.BiquadFilters => BiquadFilters; readonly bool ISplitterDestinationInParameter.IsUsed => IsUsed; + readonly bool ISplitterDestinationInParameter.ResetPrevVolume => ResetPrevVolume; /// <summary> /// The expected constant of any input header. |
