2021-01-20 02:06:10 +00:00
|
|
|
using System;
|
|
|
|
|
|
|
|
namespace MoonWorks.Audio
|
|
|
|
{
|
|
|
|
public class StaticSoundInstance : SoundInstance
|
|
|
|
{
|
2021-01-20 20:39:31 +00:00
|
|
|
public StaticSound Parent { get; }
|
|
|
|
|
2021-01-20 03:26:30 +00:00
|
|
|
private SoundState _state = SoundState.Stopped;
|
|
|
|
public override SoundState State
|
|
|
|
{
|
|
|
|
get
|
|
|
|
{
|
|
|
|
FAudio.FAudioSourceVoice_GetState(
|
|
|
|
Handle,
|
|
|
|
out var state,
|
|
|
|
FAudio.FAUDIO_VOICE_NOSAMPLESPLAYED
|
|
|
|
);
|
|
|
|
if (state.BuffersQueued == 0)
|
|
|
|
{
|
|
|
|
Stop(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
return _state;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected set
|
|
|
|
{
|
|
|
|
_state = value;
|
|
|
|
}
|
|
|
|
}
|
2021-01-20 02:06:10 +00:00
|
|
|
|
2021-01-20 18:55:15 +00:00
|
|
|
internal StaticSoundInstance(
|
2021-01-20 02:06:10 +00:00
|
|
|
AudioDevice device,
|
2021-01-20 03:26:30 +00:00
|
|
|
StaticSound parent,
|
|
|
|
bool is3D,
|
2021-01-20 18:55:15 +00:00
|
|
|
bool loop
|
2021-01-20 20:39:31 +00:00
|
|
|
) : base(device, parent.Channels, parent.SamplesPerSecond, is3D, loop)
|
2021-01-20 03:26:30 +00:00
|
|
|
{
|
2021-01-20 20:39:31 +00:00
|
|
|
Parent = parent;
|
2021-01-20 03:26:30 +00:00
|
|
|
}
|
2021-01-20 02:06:10 +00:00
|
|
|
|
2021-01-20 03:26:30 +00:00
|
|
|
public void Play()
|
2021-01-20 02:06:10 +00:00
|
|
|
{
|
|
|
|
if (State == SoundState.Playing)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-01-20 03:26:30 +00:00
|
|
|
if (Loop)
|
2021-01-20 02:06:10 +00:00
|
|
|
{
|
2021-01-20 20:39:31 +00:00
|
|
|
Parent.Handle.LoopCount = 255;
|
|
|
|
Parent.Handle.LoopBegin = Parent.LoopStart;
|
|
|
|
Parent.Handle.LoopLength = Parent.LoopLength;
|
2021-01-20 02:06:10 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2021-01-20 20:39:31 +00:00
|
|
|
Parent.Handle.LoopCount = 0;
|
|
|
|
Parent.Handle.LoopBegin = 0;
|
|
|
|
Parent.Handle.LoopLength = 0;
|
2021-01-20 02:06:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
FAudio.FAudioSourceVoice_SubmitSourceBuffer(
|
|
|
|
Handle,
|
2021-01-20 20:39:31 +00:00
|
|
|
ref Parent.Handle,
|
2021-01-20 02:06:10 +00:00
|
|
|
IntPtr.Zero
|
|
|
|
);
|
|
|
|
|
|
|
|
FAudio.FAudioSourceVoice_Start(Handle, 0, 0);
|
|
|
|
State = SoundState.Playing;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void Pause()
|
|
|
|
{
|
|
|
|
if (State == SoundState.Paused)
|
|
|
|
{
|
|
|
|
FAudio.FAudioSourceVoice_Stop(Handle, 0, 0);
|
|
|
|
State = SoundState.Paused;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void Stop(bool immediate = true)
|
|
|
|
{
|
|
|
|
if (immediate)
|
|
|
|
{
|
|
|
|
FAudio.FAudioSourceVoice_Stop(Handle, 0, 0);
|
|
|
|
FAudio.FAudioSourceVoice_FlushSourceBuffers(Handle);
|
|
|
|
State = SoundState.Stopped;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
FAudio.FAudioSourceVoice_ExitLoop(Handle, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|