From 83eb268a4aa2c646665bd5b03510befc7dfa6098 Mon Sep 17 00:00:00 2001 From: cosmonaut Date: Wed, 20 Apr 2022 14:29:46 -0700 Subject: [PATCH] add audio Seek functionality --- src/Audio/SoundInstance.cs | 2 ++ src/Audio/StaticSoundInstance.cs | 25 +++++++++++++++++++++++++ src/Audio/StreamingSoundOgg.cs | 29 +++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/src/Audio/SoundInstance.cs b/src/Audio/SoundInstance.cs index 731237e..7a77fdf 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 cb7966a..1afbb0d 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 a83e95a..8aa4721 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,