diff options
| author | Mary-nyan <mary@mary.zone> | 2022-12-06 15:04:25 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-12-06 15:04:25 +0100 |
| commit | 40311310d1a6d2fde2ee9f04bfa1f21ced7cbee2 (patch) | |
| tree | beec52c0a73006552aae3b1d9538240ddc89e6ae /Ryujinx.Audio/Renderer/Server/Effect | |
| parent | dde9bb5c69d2e1a70df82af8accd3d01fb94b78d (diff) | |
amadeus: Add missing compressor effect from REV11 (#4010)
* amadeus: Add missing compressor effect from REV11
This was in my reversing notes but seems I completely forgot to
implement it
Also took the opportunity to simplify the Limiter effect a bit.
* Remove some outdated comment
* Address gdkchan's comments
Diffstat (limited to 'Ryujinx.Audio/Renderer/Server/Effect')
| -rw-r--r-- | Ryujinx.Audio/Renderer/Server/Effect/BaseEffect.cs | 2 | ||||
| -rw-r--r-- | Ryujinx.Audio/Renderer/Server/Effect/CompressorEffect.cs | 67 |
2 files changed, 69 insertions, 0 deletions
diff --git a/Ryujinx.Audio/Renderer/Server/Effect/BaseEffect.cs b/Ryujinx.Audio/Renderer/Server/Effect/BaseEffect.cs index 35314aca..825b3bf7 100644 --- a/Ryujinx.Audio/Renderer/Server/Effect/BaseEffect.cs +++ b/Ryujinx.Audio/Renderer/Server/Effect/BaseEffect.cs @@ -262,6 +262,8 @@ namespace Ryujinx.Audio.Renderer.Server.Effect return PerformanceDetailType.Limiter; case EffectType.CaptureBuffer: return PerformanceDetailType.CaptureBuffer; + case EffectType.Compressor: + return PerformanceDetailType.Compressor; default: throw new NotImplementedException($"{Type}"); } diff --git a/Ryujinx.Audio/Renderer/Server/Effect/CompressorEffect.cs b/Ryujinx.Audio/Renderer/Server/Effect/CompressorEffect.cs new file mode 100644 index 00000000..f4e5ae82 --- /dev/null +++ b/Ryujinx.Audio/Renderer/Server/Effect/CompressorEffect.cs @@ -0,0 +1,67 @@ +using Ryujinx.Audio.Renderer.Common; +using Ryujinx.Audio.Renderer.Dsp.State; +using Ryujinx.Audio.Renderer.Parameter.Effect; +using Ryujinx.Audio.Renderer.Parameter; +using Ryujinx.Audio.Renderer.Server.MemoryPool; +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; + +namespace Ryujinx.Audio.Renderer.Server.Effect +{ + /// <summary> + /// Server state for a compressor effect. + /// </summary> + public class CompressorEffect : BaseEffect + { + /// <summary> + /// The compressor parameter. + /// </summary> + public CompressorParameter Parameter; + + /// <summary> + /// The compressor state. + /// </summary> + public Memory<CompressorState> State { get; } + + /// <summary> + /// Create a new <see cref="CompressorEffect"/>. + /// </summary> + public CompressorEffect() + { + State = new CompressorState[1]; + } + + public override EffectType TargetEffectType => EffectType.Compressor; + + public override ulong GetWorkBuffer(int index) + { + return GetSingleBuffer(); + } + + public override void Update(out BehaviourParameter.ErrorInfo updateErrorInfo, ref EffectInParameterVersion1 parameter, PoolMapper mapper) + { + // Nintendo doesn't do anything here but we still require updateErrorInfo to be initialised. + updateErrorInfo = new BehaviourParameter.ErrorInfo(); + } + + public override void Update(out BehaviourParameter.ErrorInfo updateErrorInfo, ref EffectInParameterVersion2 parameter, PoolMapper mapper) + { + Debug.Assert(IsTypeValid(ref parameter)); + + UpdateParameterBase(ref parameter); + + Parameter = MemoryMarshal.Cast<byte, CompressorParameter>(parameter.SpecificData)[0]; + IsEnabled = parameter.IsEnabled; + + updateErrorInfo = new BehaviourParameter.ErrorInfo(); + } + + public override void UpdateForCommandGeneration() + { + UpdateUsageStateForCommandGeneration(); + + Parameter.Status = UsageState.Enabled; + } + } +} |
