MoonWorks/src/Audio/StreamingSoundOgg.cs

92 lines
1.9 KiB
C#
Raw Normal View History

2022-02-23 05:14:32 +00:00
using System;
using System.IO;
namespace MoonWorks.Audio
{
2022-02-23 05:14:32 +00:00
public class StreamingSoundOgg : StreamingSound
{
// FIXME: what should this value be?
public const int BUFFER_SIZE = 1024 * 128;
2022-02-23 05:14:32 +00:00
internal IntPtr FileHandle { get; }
internal FAudio.stb_vorbis_info Info { get; }
2022-02-23 05:14:32 +00:00
private readonly float[] buffer;
2022-02-23 05:14:32 +00:00
public override SoundState State { get; protected set; }
2022-02-23 05:14:32 +00:00
public static StreamingSoundOgg Load(
AudioDevice device,
string filePath,
bool is3D = false,
bool loop = false
)
{
var fileHandle = FAudio.stb_vorbis_open_filename(filePath, out var error, IntPtr.Zero);
if (error != 0)
{
Logger.LogError("Error opening OGG file!");
throw new AudioLoadException("Error opening OGG file!");
}
2022-02-23 05:14:32 +00:00
var info = FAudio.stb_vorbis_get_info(fileHandle);
2022-02-23 05:14:32 +00:00
return new StreamingSoundOgg(
device,
fileHandle,
info,
is3D,
loop
);
}
2022-02-23 05:14:32 +00:00
internal StreamingSoundOgg(
AudioDevice device,
IntPtr fileHandle,
FAudio.stb_vorbis_info info,
bool is3D,
bool loop
) : base(device, (ushort) info.channels, info.sample_rate, is3D, loop)
{
FileHandle = fileHandle;
Info = info;
buffer = new float[BUFFER_SIZE];
2022-02-23 05:14:32 +00:00
device.AddDynamicSoundInstance(this);
}
2022-02-23 05:14:32 +00:00
protected override void AddBuffer(
out float[] buffer,
out uint bufferOffset,
out uint bufferLength,
out bool reachedEnd
)
{
buffer = this.buffer;
2022-02-23 05:14:32 +00:00
/* NOTE: this function returns samples per channel, not total samples */
var samples = FAudio.stb_vorbis_get_samples_float_interleaved(
FileHandle,
Info.channels,
buffer,
buffer.Length
);
2022-02-23 05:14:32 +00:00
var sampleCount = samples * Info.channels;
bufferOffset = 0;
bufferLength = (uint) sampleCount;
reachedEnd = sampleCount < buffer.Length;
}
2022-02-23 05:14:32 +00:00
protected override void SeekStart()
{
FAudio.stb_vorbis_seek_start(FileHandle);
}
2022-02-23 05:14:32 +00:00
protected override void Destroy()
{
FAudio.stb_vorbis_close(FileHandle);
}
}
}