diff --git a/osu.Game.Tests/Visual/Audio/TestSceneFilter.cs b/osu.Game.Tests/Visual/Audio/TestSceneFilter.cs index c639da63d3..6e5c8e8850 100644 --- a/osu.Game.Tests/Visual/Audio/TestSceneFilter.cs +++ b/osu.Game.Tests/Visual/Audio/TestSceneFilter.cs @@ -66,10 +66,10 @@ namespace osu.Game.Tests.Visual.Audio } [Test] - public void TestLowPass() => testFilter(lowpassFilter, lowpassFilter.MaxCutoff, 0); + public void TestLowPass() => testFilter(lowpassFilter, AudioFilter.MAX_LOWPASS_CUTOFF, 0); [Test] - public void TestHighPass() => testFilter(highpassFilter, 0, highpassFilter.MaxCutoff); + public void TestHighPass() => testFilter(highpassFilter, 0, AudioFilter.MAX_LOWPASS_CUTOFF); private void testFilter(Filter filter, int cutoffFrom, int cutoffTo) { diff --git a/osu.Game/Audio/Effects/Filter.cs b/osu.Game/Audio/Effects/AudioFilter.cs similarity index 80% rename from osu.Game/Audio/Effects/Filter.cs rename to osu.Game/Audio/Effects/AudioFilter.cs index 428a69bb19..611ece5bdb 100644 --- a/osu.Game/Audio/Effects/Filter.cs +++ b/osu.Game/Audio/Effects/AudioFilter.cs @@ -11,11 +11,19 @@ namespace osu.Game.Audio.Effects { public class Filter : Component, ITransformableFilter { - public readonly int MaxCutoff = 22049; // nyquist - 1hz + /// <summary> + /// The maximum cutoff frequency that can be used with a low-pass filter. + /// This is equal to nyquist - 1hz. + /// </summary> + public const int MAX_LOWPASS_CUTOFF = 22049; // nyquist - 1hz + private readonly AudioMixer mixer; private readonly BQFParameters filter; private readonly BQFType type; + /// <summary> + /// The current cutoff of this filter. + /// </summary> public BindableNumber<int> Cutoff { get; } /// <summary> @@ -37,7 +45,7 @@ namespace osu.Game.Audio.Effects break; case BQFType.LowPass: - initialCutoff = MaxCutoff; + initialCutoff = MAX_LOWPASS_CUTOFF; break; default: @@ -48,8 +56,9 @@ namespace osu.Game.Audio.Effects Cutoff = new BindableNumber<int>(initialCutoff) { MinValue = 1, - MaxValue = MaxCutoff + MaxValue = MAX_LOWPASS_CUTOFF }; + filter = new BQFParameters { lFilter = type, @@ -82,13 +91,13 @@ namespace osu.Game.Audio.Effects // Workaround for weird behaviour when rapidly setting fCenter of a low-pass filter to nyquist - 1hz. if (type == BQFType.LowPass) { - if (cutoff.NewValue >= MaxCutoff) + if (cutoff.NewValue >= MAX_LOWPASS_CUTOFF) { detachFilter(); return; } - if (cutoff.OldValue >= MaxCutoff && cutoff.NewValue < MaxCutoff) + if (cutoff.OldValue >= MAX_LOWPASS_CUTOFF && cutoff.NewValue < MAX_LOWPASS_CUTOFF) attachFilter(); } @@ -108,11 +117,13 @@ namespace osu.Game.Audio.Effects var filterIndex = mixer.Effects.IndexOf(filter); if (filterIndex < 0) return; - var existingFilter = mixer.Effects[filterIndex] as BQFParameters; - if (existingFilter == null) return; + if (mixer.Effects[filterIndex] is BQFParameters existingFilter) + { + existingFilter.fCenter = cutoff.NewValue; - existingFilter.fCenter = cutoff.NewValue; - mixer.Effects[filterIndex] = existingFilter; + // required to update effect with new parameters. + mixer.Effects[filterIndex] = existingFilter; + } } protected override void Dispose(bool isDisposing) diff --git a/osu.Game/Overlays/DialogOverlay.cs b/osu.Game/Overlays/DialogOverlay.cs index bd20b74970..5f4ab35a03 100644 --- a/osu.Game/Overlays/DialogOverlay.cs +++ b/osu.Game/Overlays/DialogOverlay.cs @@ -89,7 +89,7 @@ namespace osu.Game.Overlays { base.PopOut(); - lpFilter.CutoffTo(lpFilter.MaxCutoff, 100, Easing.InCubic); + lpFilter.CutoffTo(AudioFilter.MAX_LOWPASS_CUTOFF, 100, Easing.InCubic); if (CurrentDialog?.State.Value == Visibility.Visible) {