ReverbEffect.cs 3.1 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 reverberation effect.
  13. /// </summary>
  14. public class ReverbEffect : BaseEffect
  15. {
  16. /// <summary>
  17. /// The reverberation parameter.
  18. /// </summary>
  19. public ReverbParameter Parameter;
  20. /// <summary>
  21. /// The reverberation state.
  22. /// </summary>
  23. public Memory<ReverbState> State { get; }
  24. /// <summary>
  25. /// Create a new <see cref="ReverbEffect"/>.
  26. /// </summary>
  27. public ReverbEffect()
  28. {
  29. State = new ReverbState[1];
  30. }
  31. public override EffectType TargetEffectType => EffectType.Reverb;
  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 ReverbParameter reverbParameter = ref MemoryMarshal.Cast<byte, ReverbParameter>(parameter.SpecificData)[0];
  48. updateErrorInfo = new BehaviourParameter.ErrorInfo();
  49. if (reverbParameter.IsChannelCountMaxValid())
  50. {
  51. UpdateParameterBase(ref parameter);
  52. UsageState oldParameterStatus = Parameter.Status;
  53. Parameter = reverbParameter;
  54. if (reverbParameter.IsChannelCountValid())
  55. {
  56. IsEnabled = parameter.IsEnabled;
  57. if (oldParameterStatus != UsageState.Enabled)
  58. {
  59. Parameter.Status = oldParameterStatus;
  60. }
  61. if (BufferUnmapped || parameter.IsNew)
  62. {
  63. UsageState = UsageState.New;
  64. Parameter.Status = UsageState.Invalid;
  65. BufferUnmapped = !mapper.TryAttachBuffer(out updateErrorInfo, ref WorkBuffers[0], parameter.BufferBase, parameter.BufferSize);
  66. }
  67. }
  68. }
  69. }
  70. public override void UpdateForCommandGeneration()
  71. {
  72. UpdateUsageStateForCommandGeneration();
  73. Parameter.Status = UsageState.Enabled;
  74. }
  75. }
  76. }