LimiterEffect.cs 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using Ryujinx.Audio.Renderer.Common;
  2. using Ryujinx.Audio.Renderer.Dsp.State;
  3. using Ryujinx.Audio.Renderer.Parameter;
  4. using Ryujinx.Audio.Renderer.Parameter.Effect;
  5. using Ryujinx.Audio.Renderer.Server.MemoryPool;
  6. using System;
  7. using System.Diagnostics;
  8. using System.Runtime.InteropServices;
  9. namespace Ryujinx.Audio.Renderer.Server.Effect
  10. {
  11. /// <summary>
  12. /// Server state for a limiter effect.
  13. /// </summary>
  14. public class LimiterEffect : BaseEffect
  15. {
  16. /// <summary>
  17. /// The limiter parameter.
  18. /// </summary>
  19. public LimiterParameter Parameter;
  20. /// <summary>
  21. /// The limiter state.
  22. /// </summary>
  23. public Memory<LimiterState> State { get; }
  24. /// <summary>
  25. /// Create a new <see cref="LimiterEffect"/>.
  26. /// </summary>
  27. public LimiterEffect()
  28. {
  29. State = new LimiterState[1];
  30. }
  31. public override EffectType TargetEffectType => EffectType.Limiter;
  32. public override ulong GetWorkBuffer(int index)
  33. {
  34. return GetSingleBuffer();
  35. }
  36. public override void Update(out BehaviourParameter.ErrorInfo updateErrorInfo, ref EffectInParameterVersion1 parameter, PoolMapper mapper)
  37. {
  38. Update(out updateErrorInfo, ref parameter, mapper);
  39. }
  40. public override void Update(out BehaviourParameter.ErrorInfo updateErrorInfo, ref EffectInParameterVersion2 parameter, PoolMapper mapper)
  41. {
  42. Update(out updateErrorInfo, ref parameter, mapper);
  43. }
  44. public void Update<T>(out BehaviourParameter.ErrorInfo updateErrorInfo, ref T parameter, PoolMapper mapper) where T : unmanaged, IEffectInParameter
  45. {
  46. Debug.Assert(IsTypeValid(ref parameter));
  47. ref LimiterParameter limiterParameter = ref MemoryMarshal.Cast<byte, LimiterParameter>(parameter.SpecificData)[0];
  48. updateErrorInfo = new BehaviourParameter.ErrorInfo();
  49. UpdateParameterBase(ref parameter);
  50. Parameter = limiterParameter;
  51. IsEnabled = parameter.IsEnabled;
  52. if (BufferUnmapped || parameter.IsNew)
  53. {
  54. UsageState = UsageState.New;
  55. Parameter.Status = UsageState.Invalid;
  56. BufferUnmapped = !mapper.TryAttachBuffer(out updateErrorInfo, ref WorkBuffers[0], parameter.BufferBase, parameter.BufferSize);
  57. }
  58. }
  59. public override void UpdateForCommandGeneration()
  60. {
  61. UpdateUsageStateForCommandGeneration();
  62. Parameter.Status = UsageState.Enabled;
  63. Parameter.StatisticsReset = false;
  64. }
  65. public override void InitializeResultState(ref EffectResultState state)
  66. {
  67. ref LimiterStatistics statistics = ref MemoryMarshal.Cast<byte, LimiterStatistics>(state.SpecificData)[0];
  68. statistics.Reset();
  69. }
  70. public override void UpdateResultState(ref EffectResultState destState, ref EffectResultState srcState)
  71. {
  72. destState = srcState;
  73. }
  74. }
  75. }