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