forked from MoonsideGames/MoonWorks
fix dynamic looping
parent
ec09a5952b
commit
ffc51cca18
|
@ -44,9 +44,9 @@ namespace MoonWorks.Audio
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public DynamicSoundInstance CreateInstance()
|
public DynamicSoundInstance CreateInstance(bool loop = false)
|
||||||
{
|
{
|
||||||
var instance = new DynamicSoundInstance(Device, this, false);
|
var instance = new DynamicSoundInstance(Device, this, false, loop);
|
||||||
Device.AddDynamicSoundInstance(instance);
|
Device.AddDynamicSoundInstance(instance);
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,8 +19,9 @@ namespace MoonWorks.Audio
|
||||||
internal DynamicSoundInstance(
|
internal DynamicSoundInstance(
|
||||||
AudioDevice device,
|
AudioDevice device,
|
||||||
DynamicSound parent,
|
DynamicSound parent,
|
||||||
bool is3D
|
bool is3D,
|
||||||
) : base(device, parent, is3D)
|
bool loop
|
||||||
|
) : base(device, parent, is3D, loop)
|
||||||
{
|
{
|
||||||
queuedBuffers = new List<IntPtr>();
|
queuedBuffers = new List<IntPtr>();
|
||||||
queuedSizes = new List<uint>();
|
queuedSizes = new List<uint>();
|
||||||
|
@ -32,17 +33,14 @@ namespace MoonWorks.Audio
|
||||||
|
|
||||||
public void Play()
|
public void Play()
|
||||||
{
|
{
|
||||||
Update();
|
|
||||||
|
|
||||||
if (State == SoundState.Playing)
|
if (State == SoundState.Playing)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
QueueBuffers();
|
|
||||||
|
|
||||||
FAudio.FAudioSourceVoice_Start(Handle, 0, 0);
|
|
||||||
State = SoundState.Playing;
|
State = SoundState.Playing;
|
||||||
|
Update();
|
||||||
|
FAudio.FAudioSourceVoice_Start(Handle, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Pause()
|
public void Pause()
|
||||||
|
@ -54,12 +52,16 @@ namespace MoonWorks.Audio
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Stop()
|
public void Stop(bool immediate = true)
|
||||||
{
|
{
|
||||||
FAudio.FAudioSourceVoice_Stop(Handle, 0, 0);
|
if (immediate)
|
||||||
FAudio.FAudioSourceVoice_FlushSourceBuffers(Handle);
|
{
|
||||||
|
FAudio.FAudioSourceVoice_Stop(Handle, 0, 0);
|
||||||
|
FAudio.FAudioSourceVoice_FlushSourceBuffers(Handle);
|
||||||
|
ClearBuffers();
|
||||||
|
}
|
||||||
|
|
||||||
State = SoundState.Stopped;
|
State = SoundState.Stopped;
|
||||||
ClearBuffers();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void Update()
|
internal void Update()
|
||||||
|
@ -80,8 +82,9 @@ namespace MoonWorks.Audio
|
||||||
{
|
{
|
||||||
Marshal.FreeHGlobal(queuedBuffers[0]);
|
Marshal.FreeHGlobal(queuedBuffers[0]);
|
||||||
queuedBuffers.RemoveAt(0);
|
queuedBuffers.RemoveAt(0);
|
||||||
queuedSizes.RemoveAt(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QueueBuffers();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void QueueBuffers()
|
private void QueueBuffers()
|
||||||
|
@ -104,7 +107,7 @@ namespace MoonWorks.Audio
|
||||||
Marshal.FreeHGlobal(buf);
|
Marshal.FreeHGlobal(buf);
|
||||||
}
|
}
|
||||||
queuedBuffers.Clear();
|
queuedBuffers.Clear();
|
||||||
queuedBuffers.Clear();
|
queuedSizes.Clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,6 +115,7 @@ namespace MoonWorks.Audio
|
||||||
{
|
{
|
||||||
var parent = (DynamicSound) Parent;
|
var parent = (DynamicSound) Parent;
|
||||||
|
|
||||||
|
/* NOTE: this function returns samples per channel, not total samples */
|
||||||
var samples = FAudio.stb_vorbis_get_samples_float_interleaved(
|
var samples = FAudio.stb_vorbis_get_samples_float_interleaved(
|
||||||
parent.FileHandle,
|
parent.FileHandle,
|
||||||
parent.Info.channels,
|
parent.Info.channels,
|
||||||
|
@ -119,13 +123,14 @@ namespace MoonWorks.Audio
|
||||||
buffer.Length
|
buffer.Length
|
||||||
);
|
);
|
||||||
|
|
||||||
IntPtr next = Marshal.AllocHGlobal(buffer.Length * sizeof(float));
|
var sampleCount = samples * parent.Info.channels;
|
||||||
Marshal.Copy(buffer, 0, next, buffer.Length);
|
var lengthInBytes = (uint) sampleCount * sizeof(float);
|
||||||
|
|
||||||
|
IntPtr next = Marshal.AllocHGlobal((int) lengthInBytes);
|
||||||
|
Marshal.Copy(buffer, 0, next, sampleCount);
|
||||||
|
|
||||||
lock (queuedBuffers)
|
lock (queuedBuffers)
|
||||||
{
|
{
|
||||||
var lengthInBytes = (uint) buffer.Length * sizeof(float);
|
|
||||||
|
|
||||||
queuedBuffers.Add(next);
|
queuedBuffers.Add(next);
|
||||||
if (State != SoundState.Stopped)
|
if (State != SoundState.Stopped)
|
||||||
{
|
{
|
||||||
|
@ -151,6 +156,19 @@ namespace MoonWorks.Audio
|
||||||
queuedSizes.Add(lengthInBytes);
|
queuedSizes.Add(lengthInBytes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* We have reached the end of the file, what do we do? */
|
||||||
|
if (sampleCount < buffer.Length)
|
||||||
|
{
|
||||||
|
if (Loop)
|
||||||
|
{
|
||||||
|
FAudio.stb_vorbis_seek_start(parent.FileHandle);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Stop(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,8 @@ namespace MoonWorks.Audio
|
||||||
protected AudioDevice Device { get; }
|
protected AudioDevice Device { get; }
|
||||||
internal IntPtr Handle { get; }
|
internal IntPtr Handle { get; }
|
||||||
public Sound Parent { get; }
|
public Sound Parent { get; }
|
||||||
|
public bool Loop { get; }
|
||||||
|
|
||||||
protected FAudio.F3DAUDIO_DSP_SETTINGS dspSettings;
|
protected FAudio.F3DAUDIO_DSP_SETTINGS dspSettings;
|
||||||
|
|
||||||
protected bool is3D;
|
protected bool is3D;
|
||||||
|
@ -171,7 +173,8 @@ namespace MoonWorks.Audio
|
||||||
public SoundInstance(
|
public SoundInstance(
|
||||||
AudioDevice device,
|
AudioDevice device,
|
||||||
Sound parent,
|
Sound parent,
|
||||||
bool is3D
|
bool is3D,
|
||||||
|
bool loop
|
||||||
) {
|
) {
|
||||||
Device = device;
|
Device = device;
|
||||||
Parent = parent;
|
Parent = parent;
|
||||||
|
@ -203,6 +206,8 @@ namespace MoonWorks.Audio
|
||||||
handle,
|
handle,
|
||||||
ref Device.ReverbSends
|
ref Device.ReverbSends
|
||||||
);
|
);
|
||||||
|
|
||||||
|
Loop = loop;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitDSPSettings(uint srcChannels)
|
private void InitDSPSettings(uint srcChannels)
|
||||||
|
|
|
@ -78,9 +78,9 @@ namespace MoonWorks.Audio
|
||||||
LoopLength = 0;
|
LoopLength = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public StaticSoundInstance CreateInstance()
|
public StaticSoundInstance CreateInstance(bool loop = false)
|
||||||
{
|
{
|
||||||
return new StaticSoundInstance(Device, this, false, true);
|
return new StaticSoundInstance(Device, this, false, loop);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual void Dispose(bool disposing)
|
protected virtual void Dispose(bool disposing)
|
||||||
|
|
|
@ -4,8 +4,6 @@ namespace MoonWorks.Audio
|
||||||
{
|
{
|
||||||
public class StaticSoundInstance : SoundInstance
|
public class StaticSoundInstance : SoundInstance
|
||||||
{
|
{
|
||||||
public bool Loop { get; }
|
|
||||||
|
|
||||||
private SoundState _state = SoundState.Stopped;
|
private SoundState _state = SoundState.Stopped;
|
||||||
public override SoundState State
|
public override SoundState State
|
||||||
{
|
{
|
||||||
|
@ -30,14 +28,13 @@ namespace MoonWorks.Audio
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public StaticSoundInstance(
|
internal StaticSoundInstance(
|
||||||
AudioDevice device,
|
AudioDevice device,
|
||||||
StaticSound parent,
|
StaticSound parent,
|
||||||
bool is3D,
|
bool is3D,
|
||||||
bool loop = false
|
bool loop
|
||||||
) : base(device, parent, is3D)
|
) : base(device, parent, is3D, loop)
|
||||||
{
|
{
|
||||||
Loop = loop;
|
|
||||||
State = SoundState.Stopped;
|
State = SoundState.Stopped;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue