diff --git a/src/Audio/SoundInstance.cs b/src/Audio/SoundInstance.cs index 731237ef..7a77fdf2 100644 --- a/src/Audio/SoundInstance.cs +++ b/src/Audio/SoundInstance.cs @@ -241,6 +241,8 @@ namespace MoonWorks.Audio public abstract void Play(bool loop); public abstract void Pause(); public abstract void Stop(bool immediate); + public abstract void Seek(float seconds); + public abstract void Seek(uint sampleFrame); private void InitDSPSettings(uint srcChannels) { diff --git a/src/Audio/StaticSoundInstance.cs b/src/Audio/StaticSoundInstance.cs index cb7966af..1afbb0d2 100644 --- a/src/Audio/StaticSoundInstance.cs +++ b/src/Audio/StaticSoundInstance.cs @@ -93,6 +93,31 @@ namespace MoonWorks.Audio } } + private void PerformSeek(uint sampleFrame) + { + if (State == SoundState.Playing) + { + FAudio.FAudioSourceVoice_Stop(Handle, 0, 0); + FAudio.FAudioSourceVoice_FlushSourceBuffers(Handle); + } + + Parent.Handle.PlayBegin = sampleFrame; + Play(); + } + + public override void Seek(float seconds) + { + uint sampleFrame = + (uint) (Parent.SamplesPerSecond * seconds); + + PerformSeek(sampleFrame); + } + + public override void Seek(uint sampleFrame) + { + PerformSeek(sampleFrame); + } + public void Free() { Parent.FreeInstance(this); diff --git a/src/Audio/StreamingSoundOgg.cs b/src/Audio/StreamingSoundOgg.cs index a83e95a4..8aa4721d 100644 --- a/src/Audio/StreamingSoundOgg.cs +++ b/src/Audio/StreamingSoundOgg.cs @@ -62,6 +62,35 @@ namespace MoonWorks.Audio device.AddDynamicSoundInstance(this); } + private void PerformSeek(uint sampleFrame) + { + if (State == SoundState.Playing) + { + FAudio.FAudioSourceVoice_Stop(Handle, 0, 0); + } + + FAudio.FAudioSourceVoice_FlushSourceBuffers(Handle); + ClearBuffers(); + FAudio.stb_vorbis_seek(VorbisHandle, sampleFrame); + QueueBuffers(); + + if (State == SoundState.Playing) + { + Play(); + } + } + + public override void Seek(float seconds) + { + uint sampleFrame = (uint) (Info.sample_rate * seconds); + PerformSeek(sampleFrame); + } + + public override void Seek(uint sampleFrame) + { + PerformSeek(sampleFrame); + } + protected override void AddBuffer( out float[] buffer, out uint bufferOffset,