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 }