MoonWorks/src/Audio/StaticSound.cs

83 lines
2.6 KiB
C#
Raw Normal View History

2021-01-20 03:26:30 +00:00
using System;
using System.Runtime.InteropServices;
namespace MoonWorks.Audio
{
2021-02-27 00:17:26 +00:00
public class StaticSound : AudioResource
2021-01-20 03:26:30 +00:00
{
internal FAudio.FAudioBuffer Handle;
public ushort Channels { get; }
public uint SamplesPerSecond { get; }
2021-01-20 03:26:30 +00:00
public uint LoopStart { get; set; } = 0;
public uint LoopLength { get; set; } = 0;
2021-01-29 02:07:48 +00:00
public static StaticSound LoadOgg(AudioDevice device, string filePath)
2021-01-20 03:26:30 +00:00
{
2021-01-29 02:07:48 +00:00
var filePointer = FAudio.stb_vorbis_open_filename(filePath, out var error, IntPtr.Zero);
2021-01-20 03:26:30 +00:00
if (error != 0)
{
throw new AudioLoadException("Error loading file!");
}
var info = FAudio.stb_vorbis_get_info(filePointer);
2021-01-20 19:03:26 +00:00
var bufferSize = FAudio.stb_vorbis_stream_length_in_samples(filePointer) * info.channels;
2021-01-20 03:26:30 +00:00
var buffer = new float[bufferSize];
FAudio.stb_vorbis_get_samples_float_interleaved(
filePointer,
info.channels,
buffer,
(int) bufferSize
);
2021-01-20 03:26:30 +00:00
FAudio.stb_vorbis_close(filePointer);
return new StaticSound(
device,
(ushort) info.channels,
info.sample_rate,
2021-01-20 03:26:30 +00:00
buffer,
0,
(uint) buffer.Length
2021-01-20 03:26:30 +00:00
);
}
public StaticSound(
AudioDevice device,
ushort channels,
uint samplesPerSecond,
2021-01-20 03:26:30 +00:00
float[] buffer,
2021-01-20 19:13:55 +00:00
uint bufferOffset, /* in floats */
uint bufferLength /* in floats */
2021-02-27 00:17:26 +00:00
) : base(device)
{
Channels = channels;
SamplesPerSecond = samplesPerSecond;
2021-01-20 19:13:55 +00:00
var bufferLengthInBytes = (int) (bufferLength * sizeof(float));
2021-01-20 03:26:30 +00:00
Handle = new FAudio.FAudioBuffer();
Handle.Flags = FAudio.FAUDIO_END_OF_STREAM;
Handle.pContext = IntPtr.Zero;
Handle.AudioBytes = (uint) bufferLengthInBytes;
Handle.pAudioData = Marshal.AllocHGlobal(bufferLengthInBytes);
2021-01-20 19:13:55 +00:00
Marshal.Copy(buffer, (int) bufferOffset, Handle.pAudioData, (int) bufferLength);
2021-01-20 03:26:30 +00:00
Handle.PlayBegin = 0;
Handle.PlayLength = 0;
LoopStart = 0;
LoopLength = 0;
}
2021-01-20 18:55:15 +00:00
public StaticSoundInstance CreateInstance(bool loop = false)
{
2021-01-20 18:55:15 +00:00
return new StaticSoundInstance(Device, this, false, loop);
2021-01-20 03:26:30 +00:00
}
2021-02-27 00:17:26 +00:00
protected override void Destroy()
2021-01-20 03:26:30 +00:00
{
2021-02-27 00:17:26 +00:00
Marshal.FreeHGlobal(Handle.pAudioData);
2021-01-20 03:26:30 +00:00
}
}
}