CaptureBufferEffect.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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.Diagnostics;
  7. using System.Runtime.CompilerServices;
  8. using System.Runtime.InteropServices;
  9. using DspAddress = System.UInt64;
  10. namespace Ryujinx.Audio.Renderer.Server.Effect
  11. {
  12. /// <summary>
  13. /// Server state for an capture buffer effect.
  14. /// </summary>
  15. public class CaptureBufferEffect : BaseEffect
  16. {
  17. /// <summary>
  18. /// The capture buffer parameter.
  19. /// </summary>
  20. public AuxiliaryBufferParameter Parameter;
  21. /// <summary>
  22. /// Capture buffer state.
  23. /// </summary>
  24. public AuxiliaryBufferAddresses State;
  25. public override EffectType TargetEffectType => EffectType.CaptureBuffer;
  26. public override DspAddress GetWorkBuffer(int index)
  27. {
  28. return WorkBuffers[index].GetReference(true);
  29. }
  30. public override void Update(out BehaviourParameter.ErrorInfo updateErrorInfo, ref EffectInParameterVersion1 parameter, PoolMapper mapper)
  31. {
  32. Update(out updateErrorInfo, ref parameter, mapper);
  33. }
  34. public override void Update(out BehaviourParameter.ErrorInfo updateErrorInfo, ref EffectInParameterVersion2 parameter, PoolMapper mapper)
  35. {
  36. Update(out updateErrorInfo, ref parameter, mapper);
  37. }
  38. public void Update<T>(out BehaviourParameter.ErrorInfo updateErrorInfo, ref T parameter, PoolMapper mapper) where T : unmanaged, IEffectInParameter
  39. {
  40. Debug.Assert(IsTypeValid(ref parameter));
  41. UpdateParameterBase(ref parameter);
  42. Parameter = MemoryMarshal.Cast<byte, AuxiliaryBufferParameter>(parameter.SpecificData)[0];
  43. IsEnabled = parameter.IsEnabled;
  44. updateErrorInfo = new BehaviourParameter.ErrorInfo();
  45. if (BufferUnmapped || parameter.IsNew)
  46. {
  47. ulong bufferSize = (ulong)Unsafe.SizeOf<int>() * Parameter.BufferStorageSize + (ulong)Unsafe.SizeOf<AuxiliaryBufferHeader>();
  48. bool sendBufferUnmapped = !mapper.TryAttachBuffer(out updateErrorInfo, ref WorkBuffers[0], Parameter.SendBufferInfoAddress, bufferSize);
  49. BufferUnmapped = sendBufferUnmapped;
  50. if (!BufferUnmapped)
  51. {
  52. DspAddress sendDspAddress = WorkBuffers[0].GetReference(false);
  53. // NOTE: Nintendo directly interact with the CPU side structure in the processing of the DSP command.
  54. State.SendBufferInfo = sendDspAddress;
  55. State.SendBufferInfoBase = sendDspAddress + (ulong)Unsafe.SizeOf<AuxiliaryBufferHeader>();
  56. State.ReturnBufferInfo = 0;
  57. State.ReturnBufferInfoBase = 0;
  58. }
  59. }
  60. }
  61. public override void UpdateForCommandGeneration()
  62. {
  63. UpdateUsageStateForCommandGeneration();
  64. }
  65. }
  66. }