diff --git a/src/Audio/StaticSound.cs b/src/Audio/StaticSound.cs index da7a44d..d2566a3 100644 --- a/src/Audio/StaticSound.cs +++ b/src/Audio/StaticSound.cs @@ -197,6 +197,39 @@ namespace MoonWorks.Audio return sound; } + public static unsafe StaticSound FromQOA(AudioDevice device, string path) + { + var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read); + var fileDataPtr = NativeMemory.Alloc((nuint) fileStream.Length); + var fileDataSpan = new Span(fileDataPtr, (int) fileStream.Length); + fileStream.ReadExactly(fileDataSpan); + fileStream.Close(); + + var qoaHandle = FAudio.qoa_open((char*) fileDataPtr, (uint) fileDataSpan.Length); + if (qoaHandle == 0) + { + NativeMemory.Free(fileDataPtr); + Logger.LogError("Error opening QOA file!"); + throw new AudioLoadException("Error opening QOA file!"); + } + + FAudio.qoa_attributes(qoaHandle, out var channels, out var samplerate, out var samples_per_channel_per_frame, out var total_samples_per_channel); + + var buffer = FAudio.qoa_load(qoaHandle); + + return new StaticSound( + device, + 1, + 16, + (ushort) (channels * 2), + (ushort) channels, + samplerate, + (nint) buffer, + total_samples_per_channel * channels * sizeof(short), + true + ); + } + public StaticSound( AudioDevice device, ushort formatTag,