diff --git a/ProjectObsidian/Components/Audio/AudioLowPassFilter.cs b/ProjectObsidian/Components/Audio/AudioLowPassFilter.cs index 231e521..1097025 100644 --- a/ProjectObsidian/Components/Audio/AudioLowPassFilter.cs +++ b/ProjectObsidian/Components/Audio/AudioLowPassFilter.cs @@ -10,11 +10,7 @@ public class AudioLowPassFilter : Component, IAudioSource, IWorldElement [Range(0f, 1f, "0.00")] public readonly Sync SmoothingFactor; - public readonly AssetRef Clip; - - private double lastPos; - - private double nextPos; + public readonly SyncRef Source; private double lastAudioTime; @@ -22,53 +18,33 @@ public bool IsActive { get { - return Clip.IsAssetAvailable; + return Source.Target.IsActive; } } - public int ChannelCount => (Clip.Asset?.Data?.ChannelCount).GetValueOrDefault(); + public int ChannelCount => Source.Target?.ChannelCount ?? 0; public void Read(Span buffer) where S : unmanaged, IAudioSample { - var clipData = Clip.Asset?.Data; - if (clipData == null) - { - buffer.Fill(default(S)); - return; - } double dSPTime = base.Engine.AudioSystem.DSPTime; if (lastAudioTime != dSPTime) { - lastPos = nextPos; lastAudioTime = dSPTime; } - bool flag = false; + Span span = stackalloc S[buffer.Length]; + if (!IsActive) { return; } + Span span2 = span; - if (!flag) - { - span2 = buffer; - } + span2 = buffer; - int num = Clip.Asset.Data.Read(span2, lastPos * (double)Clip.Asset.Data.SampleRate, 1f, loop: true); + Source.Target.Read(span2); EMAIIRSmoothSignal(ref span2, span2.Length, SmoothingFactor); - - nextPos = (lastPos + (double)num * base.Engine.AudioSystem.InvSampleRate * (double)1f) % Clip.Asset.Data.Duration; - - if (flag) - { - buffer.Add(span2); - } - flag = true; - if (!flag) - { - buffer.Fill(default(S)); - } } // smoothingFactor is between 0.0 (no smoothing) and 0.9999.. (almost smoothing to DC) - *kind* of the inverse of cutoff frequency