52 lines
1.3 KiB
C#
52 lines
1.3 KiB
C#
using StbVorbisSharp;
|
|
|
|
namespace DaggerFramework.Resources
|
|
{
|
|
public class SoundLoader : IResourceLoader<Sound>
|
|
{
|
|
public IEnumerable<string> SupportedExtensions => new string[]
|
|
{
|
|
"ogg"
|
|
};
|
|
|
|
public Sound 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;
|
|
}
|
|
}
|
|
} |