using StbVorbisSharp; namespace DaggerFramework.Resources { public class SoundLoader : IResourceLoader { public IEnumerable SupportedExtensions => new string[] { "ogg" }; public Type ResourceType => typeof(Sound); public Resource Load(string path) { Vorbis vorbis; Sound result; var fileBuffer = File.ReadAllBytes(path); vorbis = Vorbis.FromMemory(fileBuffer); vorbis.SubmitBuffer(); if (vorbis.Decoded == 0) { vorbis.Restart(); vorbis.SubmitBuffer(); } var audioShort = vorbis.SongBuffer; int length = vorbis.Decoded * vorbis.Channels; byte[] audioData = new byte[length * 2]; for (int i = 0; i < length; i++) { if (i * 2 >= audioData.Length) break; var b1 = (byte)(audioShort[i] >> 8); var b2 = (byte)(audioShort[i] & 256); audioData[i * 2] = b2; audioData[i * 2 + 1] = b1; } result = new Sound(path, audioData); result.Format = (SoundFormat)vorbis.Channels - 1; result.SampleRate = vorbis.SampleRate; result.BufferSize = length; vorbis.Dispose(); return result; } } }