using System; using System.Runtime.InteropServices; namespace MoonWorks.Audio { public class AudioBuffer : AudioResource { IntPtr BufferDataPtr; uint BufferDataLength; private bool OwnsBufferData; public Format Format { get; } public AudioBuffer( AudioDevice device, Format format, IntPtr bufferPtr, uint bufferLengthInBytes, bool ownsBufferData) : base(device) { Format = format; BufferDataPtr = bufferPtr; BufferDataLength = bufferLengthInBytes; OwnsBufferData = ownsBufferData; } public AudioBuffer CreateSubBuffer(int offset, uint length) { return new AudioBuffer(Device, Format, BufferDataPtr + offset, length, false); } public FAudio.FAudioBuffer ToFAudioBuffer(bool loop = false) { return new FAudio.FAudioBuffer { Flags = FAudio.FAUDIO_END_OF_STREAM, pContext = IntPtr.Zero, pAudioData = BufferDataPtr, AudioBytes = BufferDataLength, PlayBegin = 0, PlayLength = 0, LoopBegin = 0, LoopLength = 0, LoopCount = loop ? FAudio.FAUDIO_LOOP_INFINITE : 0 }; } protected override unsafe void Destroy() { if (OwnsBufferData) { NativeMemory.Free((void*) BufferDataPtr); } } } }