From 4df836a6a720446ef501213a2d2eb370b80d9d97 Mon Sep 17 00:00:00 2001 From: cosmonaut Date: Mon, 6 Mar 2023 18:55:20 -0800 Subject: [PATCH] add delayed audio tween support --- src/Audio/AudioDevice.cs | 71 +++++++++++++++++++++++++++++++++----- src/Audio/AudioTween.cs | 5 +-- src/Audio/SoundInstance.cs | 62 +++++++++++++++++++++++++-------- 3 files changed, 114 insertions(+), 24 deletions(-) diff --git a/src/Audio/AudioDevice.cs b/src/Audio/AudioDevice.cs index 5e102bd..4d79eca 100644 --- a/src/Audio/AudioDevice.cs +++ b/src/Audio/AudioDevice.cs @@ -32,6 +32,7 @@ namespace MoonWorks.Audio private AudioTweenPool AudioTweenPool = new AudioTweenPool(); private readonly List AudioTweens = new List(); + private readonly List DelayedAudioTweens = new List(); private const int Step = 200; private TimeSpan UpdateInterval; @@ -163,6 +164,52 @@ namespace MoonWorks.Audio } } + for (var i = DelayedAudioTweens.Count - 1; i >= 0; i--) + { + var audioTween = DelayedAudioTweens[i]; + + if (audioTween.SoundInstanceReference.TryGetTarget(out var soundInstance)) + { + audioTween.Time += elapsedSeconds; + + if (audioTween.Time >= audioTween.DelayTime) + { + switch (audioTween.Property) + { + case AudioTweenProperty.Pan: + audioTween.StartValue = soundInstance.Pan; + break; + + case AudioTweenProperty.Pitch: + audioTween.StartValue = soundInstance.Pitch; + break; + + case AudioTweenProperty.Volume: + audioTween.StartValue = soundInstance.Volume; + break; + + case AudioTweenProperty.FilterFrequency: + audioTween.StartValue = soundInstance.FilterFrequency; + break; + + case AudioTweenProperty.Reverb: + audioTween.StartValue = soundInstance.Reverb; + break; + } + + audioTween.Time = 0; + AudioTweens.Add(audioTween); + DelayedAudioTweens.RemoveAt(i); + } + } + else + { + AudioTweenPool.Free(audioTween); + DelayedAudioTweens.RemoveAt(i); + } + + } + for (var i = AudioTweens.Count - 1; i >= 0; i--) { bool finished = true; @@ -192,7 +239,8 @@ namespace MoonWorks.Audio EasingFunction easingFunction, float start, float end, - float duration + float duration, + float delayTime ) { lock (StateLock) { @@ -200,12 +248,20 @@ namespace MoonWorks.Audio tween.SoundInstanceReference = new WeakReference(soundInstance); tween.Property = property; tween.EasingFunction = easingFunction; - tween.Start = start; - tween.End = end; + tween.StartValue = start; + tween.EndValue = end; tween.Duration = duration; tween.Time = 0; + tween.DelayTime = delayTime; - AudioTweens.Add(tween); + if (delayTime == 0) + { + AudioTweens.Add(tween); + } + else + { + DelayedAudioTweens.Add(tween); + } } } @@ -215,16 +271,15 @@ namespace MoonWorks.Audio audioTween.Time += delta; var finished = audioTween.Time >= audioTween.Duration; - if (finished) { - value = audioTween.End; + value = audioTween.EndValue; } else { value = MoonWorks.Math.Easing.Interp( - audioTween.Start, - audioTween.End, + audioTween.StartValue, + audioTween.EndValue, audioTween.Time, audioTween.Duration, audioTween.EasingFunction diff --git a/src/Audio/AudioTween.cs b/src/Audio/AudioTween.cs index 721cb92..d92d7d5 100644 --- a/src/Audio/AudioTween.cs +++ b/src/Audio/AudioTween.cs @@ -18,8 +18,9 @@ namespace MoonWorks.Audio public AudioTweenProperty Property; public EasingFunction EasingFunction; public float Time; - public float Start; - public float End; + public float StartValue; + public float EndValue; + public float DelayTime; public float Duration; } diff --git a/src/Audio/SoundInstance.cs b/src/Audio/SoundInstance.cs index e019744..e08833c 100644 --- a/src/Audio/SoundInstance.cs +++ b/src/Audio/SoundInstance.cs @@ -109,19 +109,22 @@ namespace MoonWorks.Audio } } - private float FilterOneOverQ + public float FilterOneOverQ { get => filterParameters.OneOverQ; - set + internal set { - value = System.Math.Clamp(value, 0.01f, MAX_FILTER_ONEOVERQ); - filterParameters.OneOverQ = value; + if (filterParameters.OneOverQ != value) + { + value = System.Math.Clamp(value, 0.01f, MAX_FILTER_ONEOVERQ); + filterParameters.OneOverQ = value; - FAudio.FAudioVoice_SetFilterParameters( - Voice, - ref filterParameters, - 0 - ); + FAudio.FAudioVoice_SetFilterParameters( + Voice, + ref filterParameters, + 0 + ); + } } } @@ -305,7 +308,12 @@ namespace MoonWorks.Audio public void SetPan(float targetValue, float duration, EasingFunction easingFunction) { - Device.CreateTween(this, AudioTweenProperty.Pan, easingFunction, Pan, targetValue, duration); + Device.CreateTween(this, AudioTweenProperty.Pan, easingFunction, Pan, targetValue, duration, 0); + } + + public void SetPan(float targetValue, float delayTime, float duration, EasingFunction easingFunction) + { + Device.CreateTween(this, AudioTweenProperty.Pan, easingFunction, Pan, targetValue, duration, delayTime); } public void SetPitch(float targetValue) @@ -315,7 +323,12 @@ namespace MoonWorks.Audio public void SetPitch(float targetValue, float duration, EasingFunction easingFunction) { - Device.CreateTween(this, AudioTweenProperty.Pitch, easingFunction, Pan, targetValue, duration); + Device.CreateTween(this, AudioTweenProperty.Pitch, easingFunction, Pan, targetValue, duration, 0); + } + + public void SetPitch(float targetValue, float delayTime, float duration, EasingFunction easingFunction) + { + Device.CreateTween(this, AudioTweenProperty.Pitch, easingFunction, Pan, targetValue, duration, delayTime); } public void SetVolume(float targetValue) @@ -325,7 +338,12 @@ namespace MoonWorks.Audio public void SetVolume(float targetValue, float duration, EasingFunction easingFunction) { - Device.CreateTween(this, AudioTweenProperty.Volume, easingFunction, Volume, targetValue, duration); + Device.CreateTween(this, AudioTweenProperty.Volume, easingFunction, Volume, targetValue, duration, 0); + } + + public void SetVolume(float targetValue, float delayTime, float duration, EasingFunction easingFunction) + { + Device.CreateTween(this, AudioTweenProperty.Volume, easingFunction, Volume, targetValue, duration, delayTime); } public void SetFilterFrequency(float targetValue) @@ -335,7 +353,18 @@ namespace MoonWorks.Audio public void SetFilterFrequency(float targetValue, float duration, EasingFunction easingFunction) { - Device.CreateTween(this, AudioTweenProperty.FilterFrequency, easingFunction, FilterFrequency, targetValue, duration); + Device.CreateTween(this, AudioTweenProperty.FilterFrequency, easingFunction, FilterFrequency, targetValue, duration, 0); + } + + public void SetFilterFrequency(float targetValue, float delayTime, float duration, EasingFunction easingFunction) + { + Logger.LogInfo(duration.ToString()); + Device.CreateTween(this, AudioTweenProperty.FilterFrequency, easingFunction, FilterFrequency, targetValue, duration, delayTime); + } + + public void SetFilterOneOverQ(float targetValue) + { + FilterOneOverQ = targetValue; } public void SetReverb(float targetValue) @@ -345,7 +374,12 @@ namespace MoonWorks.Audio public void SetReverb(float targetValue, float duration, EasingFunction easingFunction) { - Device.CreateTween(this, AudioTweenProperty.Reverb, easingFunction, Volume, targetValue, duration); + Device.CreateTween(this, AudioTweenProperty.Reverb, easingFunction, Volume, targetValue, duration, 0); + } + + public void SetReverb(float targetValue, float delayTime, float duration, EasingFunction easingFunction) + { + Device.CreateTween(this, AudioTweenProperty.Reverb, easingFunction, Volume, targetValue, duration, delayTime); } public abstract void Play();