HardwareDeviceSessionOutputBase.cs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using Ryujinx.Audio.Common;
  2. using Ryujinx.Audio.Integration;
  3. using Ryujinx.Memory;
  4. using System.Runtime.CompilerServices;
  5. namespace Ryujinx.Audio.Backends.Common
  6. {
  7. public abstract class HardwareDeviceSessionOutputBase : IHardwareDeviceSession
  8. {
  9. public IVirtualMemoryManager MemoryManager { get; }
  10. public SampleFormat RequestedSampleFormat { get; }
  11. public uint RequestedSampleRate { get; }
  12. public uint RequestedChannelCount { get; }
  13. public HardwareDeviceSessionOutputBase(IVirtualMemoryManager memoryManager, SampleFormat requestedSampleFormat, uint requestedSampleRate, uint requestedChannelCount)
  14. {
  15. MemoryManager = memoryManager;
  16. RequestedSampleFormat = requestedSampleFormat;
  17. RequestedSampleRate = requestedSampleRate;
  18. RequestedChannelCount = requestedChannelCount;
  19. }
  20. private byte[] GetBufferSamples(AudioBuffer buffer)
  21. {
  22. if (buffer.DataPointer == 0)
  23. {
  24. return null;
  25. }
  26. byte[] data = new byte[buffer.DataSize];
  27. MemoryManager.Read(buffer.DataPointer, data);
  28. return data;
  29. }
  30. protected ulong GetSampleCount(AudioBuffer buffer)
  31. {
  32. return GetSampleCount((int)buffer.DataSize);
  33. }
  34. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  35. protected ulong GetSampleCount(int dataSize)
  36. {
  37. return (ulong)BackendHelper.GetSampleCount(RequestedSampleFormat, (int)RequestedChannelCount, dataSize);
  38. }
  39. public abstract void Dispose();
  40. public abstract void PrepareToClose();
  41. public abstract void QueueBuffer(AudioBuffer buffer);
  42. public abstract void SetVolume(float volume);
  43. public abstract float GetVolume();
  44. public abstract void Start();
  45. public abstract void Stop();
  46. public abstract ulong GetPlayedSampleCount();
  47. public abstract bool WasBufferFullyConsumed(AudioBuffer buffer);
  48. public virtual bool RegisterBuffer(AudioBuffer buffer)
  49. {
  50. return RegisterBuffer(buffer, GetBufferSamples(buffer));
  51. }
  52. public virtual bool RegisterBuffer(AudioBuffer buffer, byte[] samples)
  53. {
  54. if (samples == null)
  55. {
  56. return false;
  57. }
  58. if (buffer.Data == null)
  59. {
  60. buffer.Data = samples;
  61. }
  62. return true;
  63. }
  64. public virtual void UnregisterBuffer(AudioBuffer buffer) { }
  65. }
  66. }