From b81277f1bfda20cc85ad32eb713875b8bfc599ad Mon Sep 17 00:00:00 2001 From: hwsmm Date: Sat, 11 May 2024 23:13:38 +0900 Subject: [PATCH 01/14] Use framework loudness --- osu.Game/Audio/AudioNormalization.cs | 14 +++-- osu.Game/Audio/BassAudioNormalization.cs | 73 ------------------------ osu.Game/Audio/IAudioNormalization.cs | 12 ---- osu.Game/osu.Game.csproj | 4 -- 4 files changed, 8 insertions(+), 95 deletions(-) delete mode 100644 osu.Game/Audio/BassAudioNormalization.cs delete mode 100644 osu.Game/Audio/IAudioNormalization.cs diff --git a/osu.Game/Audio/AudioNormalization.cs b/osu.Game/Audio/AudioNormalization.cs index d898843845f2..d98e2f86a018 100644 --- a/osu.Game/Audio/AudioNormalization.cs +++ b/osu.Game/Audio/AudioNormalization.cs @@ -6,6 +6,8 @@ using ManagedBass; using ManagedBass.Fx; using osu.Framework.Audio.Mixing; +using osu.Framework.Audio.Track; +using osu.Framework.Extensions; using osu.Framework.Logging; using osu.Game.Beatmaps; using osu.Game.Database; @@ -16,7 +18,7 @@ namespace osu.Game.Audio /// /// Audio Normalization Manager /// - public class AudioNormalization : EmbeddedObject, IAudioNormalization, IEquatable + public class AudioNormalization : EmbeddedObject, IEquatable { /// /// The target level for audio normalization @@ -57,9 +59,12 @@ public AudioNormalization(BeatmapInfo beatmapInfo, BeatmapSetInfo beatmapSetInfo return; } - filepath = realmFileStore.Storage.GetFullPath(filepath); + AudioLoudness loudness = new AudioLoudness(realmFileStore.Storage.GetStream(filepath)); - float? integratedLoudness = new BassAudioNormalization(filepath).IntegratedLoudness; + var loudTask = loudness.GetIntegratedLoudness(); + loudTask.WaitSafely(); + + float? integratedLoudness = loudTask.GetResultSafely(); if (integratedLoudness == null) { @@ -142,9 +147,6 @@ private static void addFx(IEffectParameter effectParameter, IAudioMixer mixer) } } - /// - public bool Equals(IAudioNormalization? other) => other is AudioNormalization audioNormalization && Equals(audioNormalization); - /// public bool Equals(AudioNormalization? other) => other?.IntegratedLoudness != null && IntegratedLoudness != null && Math.Abs((float)(IntegratedLoudness - other.IntegratedLoudness)) < 0.0000001; } diff --git a/osu.Game/Audio/BassAudioNormalization.cs b/osu.Game/Audio/BassAudioNormalization.cs deleted file mode 100644 index 2dd3938f31c3..000000000000 --- a/osu.Game/Audio/BassAudioNormalization.cs +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. -// See the LICENCE file in the repository root for full licence text. - -using ManagedBass; -using ManagedBass.Loud; -using osu.Framework.Logging; - -namespace osu.Game.Audio -{ - /// - /// Audio Normalization Implementation using Bass - /// - public class BassAudioNormalization - { - /// - /// The integrated loudness of the audio - /// - /// - /// Applicable range = -70 to 0
Null if the loudness could not be calculated due to an error - ///
- public float? IntegratedLoudness { get; } - - /// - /// Calculate the integrated loudness of an audio file using Bass - /// - /// A path to an audio file - public BassAudioNormalization(string filePath) - { - int decodeStream = Bass.CreateStream(filePath, 0, 0, BassFlags.Decode | BassFlags.Float); - - if (decodeStream == 0) - { - Logger.Log("Failed to create stream for loudness measurement!\nError Code: " + Bass.LastError, LoggingTarget.Runtime, LogLevel.Error); - IntegratedLoudness = null; - Bass.StreamFree(decodeStream); - return; - } - - int loudness = BassLoud.Start(decodeStream, BassFlags.BassLoudnessIntegrated | BassFlags.BassLoudnessAutofree, 0); - - if (loudness == 0) - { - Logger.Log("Failed to start loudness measurement!\nError Code: " + Bass.LastError, LoggingTarget.Runtime, LogLevel.Error); - IntegratedLoudness = null; - Bass.StreamFree(decodeStream); - return; - } - - byte[] buffer = new byte[10000]; - - while (Bass.ChannelGetData(decodeStream, buffer, buffer.Length) >= 0) - { - } - - float integratedLoudness = 1; - bool gotLevel = BassLoud.GetLevel(loudness, BassFlags.BassLoudnessIntegrated, ref integratedLoudness); - - if (!gotLevel || integratedLoudness > 0) - { - Logger.Log("Failed to get loudness level!\nError Code: " + Bass.LastError, LoggingTarget.Runtime, LogLevel.Error); - IntegratedLoudness = null; - Bass.StreamFree(decodeStream); - return; - } - - IntegratedLoudness = integratedLoudness; - - bool freedStream = Bass.StreamFree(decodeStream); - if (!freedStream) - Logger.Log("Failed to free stream!\nError Code: " + Bass.LastError, LoggingTarget.Runtime, LogLevel.Error); - } - } -} diff --git a/osu.Game/Audio/IAudioNormalization.cs b/osu.Game/Audio/IAudioNormalization.cs deleted file mode 100644 index 14cc1cda06e4..000000000000 --- a/osu.Game/Audio/IAudioNormalization.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. -// See the LICENCE file in the repository root for full licence text. - -using System; - -namespace osu.Game.Audio -{ - public interface IAudioNormalization : IEquatable - { - public float? IntegratedLoudness { get; } - } -} diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj index 07270979ce20..5452a648d1d2 100644 --- a/osu.Game/osu.Game.csproj +++ b/osu.Game/osu.Game.csproj @@ -34,10 +34,6 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - From e58115fa29e2b694ee2751ced7b300f3c19ff1f3 Mon Sep 17 00:00:00 2001 From: hwsmm Date: Sun, 12 May 2024 03:46:31 +0900 Subject: [PATCH 02/14] Remove direct BASS usage in AudioNormalization and use framework counterpart --- osu.Game/Audio/AudioNormalization.cs | 58 ++-------------------------- 1 file changed, 3 insertions(+), 55 deletions(-) diff --git a/osu.Game/Audio/AudioNormalization.cs b/osu.Game/Audio/AudioNormalization.cs index d98e2f86a018..742f51d5650b 100644 --- a/osu.Game/Audio/AudioNormalization.cs +++ b/osu.Game/Audio/AudioNormalization.cs @@ -2,12 +2,7 @@ // See the LICENCE file in the repository root for full licence text. using System; -using System.Linq; -using ManagedBass; -using ManagedBass.Fx; -using osu.Framework.Audio.Mixing; using osu.Framework.Audio.Track; -using osu.Framework.Extensions; using osu.Framework.Logging; using osu.Game.Beatmaps; using osu.Game.Database; @@ -59,12 +54,9 @@ public AudioNormalization(BeatmapInfo beatmapInfo, BeatmapSetInfo beatmapSetInfo return; } - AudioLoudness loudness = new AudioLoudness(realmFileStore.Storage.GetStream(filepath)); + using AudioLoudness loudness = new AudioLoudness(realmFileStore.Storage.GetStream(filepath)); - var loudTask = loudness.GetIntegratedLoudness(); - loudTask.WaitSafely(); - - float? integratedLoudness = loudTask.GetResultSafely(); + float? integratedLoudness = loudness.GetIntegratedLoudness(); if (integratedLoudness == null) { @@ -100,52 +92,8 @@ public void PopulateSet(BeatmapInfo beatmapInfo, BeatmapSetInfo beatmapSetInfo) /// /// Convert integrated loudness to a volume offset /// - /// The integrated loudness value /// The volume offset needed to reach - public static float IntegratedLoudnessToVolumeOffset(float integratedLoudness) => (float)Math.Pow(10, (TARGET_LEVEL - integratedLoudness) / 20); - - /// - /// Get the loudness values of a and apply the audio normalization effect to an - /// - /// The to get the loudness values of - /// The to apply the effect on - public static void AddAudioNormalization(BeatmapInfo beatmapInfo, IAudioMixer mixer) - { - AudioNormalization? audioNormalizationModule = beatmapInfo.AudioNormalization; - - VolumeParameters volumeParameters = new VolumeParameters - { - fTarget = audioNormalizationModule?.IntegratedLoudness != null ? IntegratedLoudnessToVolumeOffset((float)audioNormalizationModule.IntegratedLoudness) : 0.8f, - fCurrent = -1.0f, - fTime = 0.3f, - lCurve = 1, - lChannel = FXChannelFlags.All - }; - - addFx(volumeParameters, mixer); - - Logger.Log("Normalization Status: " + (audioNormalizationModule?.IntegratedLoudness != null ? $"on ({Math.Round(IntegratedLoudnessToVolumeOffset((float)audioNormalizationModule.IntegratedLoudness) * 100)}%)" : "off")); - } - - /// - /// Add an effect to a , replacing it if it already exists - /// - /// The to add to the - /// The to add the effect to - private static void addFx(IEffectParameter effectParameter, IAudioMixer mixer) - { - IEffectParameter? effect = mixer.Effects.SingleOrDefault(e => e.FXType == effectParameter.FXType); - - if (effect != null) - { - int i = mixer.Effects.IndexOf(effect); - mixer.Effects[i] = effectParameter; - } - else - { - mixer.Effects.Add(effectParameter); - } - } + public float IntegratedLoudnessInVolumeOffset => IntegratedLoudness != null ? (float)Math.Pow(10, (TARGET_LEVEL - (double)IntegratedLoudness) / 20) : 0.8f; /// public bool Equals(AudioNormalization? other) => other?.IntegratedLoudness != null && IntegratedLoudness != null && Math.Abs((float)(IntegratedLoudness - other.IntegratedLoudness)) < 0.0000001; From 6f2d873f48846a5b366b8738c931a07297daa509 Mon Sep 17 00:00:00 2001 From: hwsmm Date: Sun, 12 May 2024 03:48:51 +0900 Subject: [PATCH 03/14] Add normalization volume bindables in OsuGameBase --- osu.Game/OsuGameBase.cs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/osu.Game/OsuGameBase.cs b/osu.Game/OsuGameBase.cs index 96e7d5a603ec..bc786732c28b 100644 --- a/osu.Game/OsuGameBase.cs +++ b/osu.Game/OsuGameBase.cs @@ -224,6 +224,13 @@ public virtual string Version private DependencyContainer dependencies; + private Bindable beatmapHitsoundBind = null!; + + // drop track volume game-wide to leave some head-room for UI effects / samples. + public readonly BindableDouble TrackNormalizeVolume = new BindableDouble(0.8); + + public readonly BindableDouble SampleNormalizeVolume = new BindableDouble(1.0); + private Bindable frameworkLocale = null!; private IBindable localisationParameters = null!; @@ -346,6 +353,27 @@ private void load(ReadableKeyCombinationProvider keyCombinationProvider, Framewo RegisterImportHandler(ScoreManager); RegisterImportHandler(SkinManager); + // Apply normalization to tracks and samples. + // Samples will get normalized in line with tracks only if BeatmapHitsounds is enabled. + Audio.Tracks.AddAdjustment(AdjustableProperty.Volume, TrackNormalizeVolume); + beatmapHitsoundBind = LocalConfig.GetBindable(OsuSetting.BeatmapHitsounds); + + void normalizeSampleIfTrue(bool value) + { + if (value) + { + SampleNormalizeVolume.BindTo(TrackNormalizeVolume); + } + else + { + SampleNormalizeVolume.UnbindFrom(TrackNormalizeVolume); + SampleNormalizeVolume.Value = 1.0; + } + } + + normalizeSampleIfTrue(beatmapHitsoundBind.Value); + beatmapHitsoundBind.BindValueChanged(change => normalizeSampleIfTrue(change.NewValue)); + Beatmap = new NonNullableBindable(defaultBeatmap); dependencies.CacheAs>(Beatmap); From 663aa15a55efb64eadedf5d9d04ae105ca8c8c65 Mon Sep 17 00:00:00 2001 From: hwsmm Date: Sun, 12 May 2024 03:49:09 +0900 Subject: [PATCH 04/14] Update normalization volume in MusicController --- osu.Game/Overlays/MusicController.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/osu.Game/Overlays/MusicController.cs b/osu.Game/Overlays/MusicController.cs index 6a15f6ee35b6..0a02bb2bb535 100644 --- a/osu.Game/Overlays/MusicController.cs +++ b/osu.Game/Overlays/MusicController.cs @@ -16,7 +16,6 @@ using osu.Framework.Graphics.Containers; using osu.Framework.Logging; using osu.Framework.Threading; -using osu.Game.Audio; using osu.Game.Beatmaps; using osu.Game.Database; using osu.Game.Rulesets.Mods; @@ -67,15 +66,14 @@ public partial class MusicController : CompositeDrawable [Resolved] private AudioManager audioManager { get; set; } + [Resolved] + private OsuGameBase gameBase { get; set; } + protected override void LoadComplete() { base.LoadComplete(); - beatmap.BindValueChanged(b => - { - changeBeatmap(b.NewValue); - AudioNormalization.AddAudioNormalization(b.NewValue.BeatmapInfo, audioManager.TrackMixer); - }, true); + beatmap.BindValueChanged(b => changeBeatmap(b.NewValue), true); mods.BindValueChanged(_ => ResetTrackAdjustments(), true); } @@ -344,6 +342,8 @@ private void changeTrack() CurrentTrack = queuedTrack; + gameBase.TrackNormalizeVolume.Value = current.BeatmapInfo.AudioNormalization?.IntegratedLoudnessInVolumeOffset ?? 0.8; + // At this point we may potentially be in an async context from tests. This is extremely dangerous but we have to make do for now. // CurrentTrack is immediately updated above for situations where a immediate knowledge about the new track is required, // but the mutation of the hierarchy is scheduled to avoid exceptions. From 729f22d52dbd362fdc88e32cd8ddfd82cbad769a Mon Sep 17 00:00:00 2001 From: hwsmm Date: Sun, 12 May 2024 03:49:39 +0900 Subject: [PATCH 05/14] Apply normalization to hitobjects --- .../Objects/Drawables/DrawableHoldNote.cs | 2 ++ osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs | 2 ++ osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs | 3 +++ osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs | 5 ++++- 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs index 2b55e81788ad..9bb884377461 100644 --- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs +++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs @@ -120,6 +120,8 @@ private void load() bodyPiece.CreateProxy(), tailContainer.CreateProxy(), }); + + slidingSample.BindAdjustments(Samples); } protected override void LoadComplete() diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs index e519e51562fc..38372b65957d 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs @@ -136,6 +136,8 @@ private void load() foreach (var drawableHitObject in NestedHitObjects) drawableHitObject.AccentColour.Value = colour.NewValue; }, true); + + slidingSample.BindAdjustments(Samples); } protected override JudgementResult CreateResult(Judgement judgement) => new OsuSliderJudgementResult(HitObject, judgement); diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs index 8c21e6a6bca1..e72df1f0e172 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs @@ -121,6 +121,9 @@ private void load() }); PositionBindable.BindValueChanged(pos => Position = pos.NewValue); + + spinningSample.BindAdjustments(Samples); + maxBonusSample.BindAdjustments(Samples); } protected override void LoadComplete() diff --git a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs index 3ce6cc3cef6e..1c1fe713dac7 100644 --- a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs +++ b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs @@ -10,6 +10,7 @@ using System.Linq; using JetBrains.Annotations; using osu.Framework.Allocation; +using osu.Framework.Audio; using osu.Framework.Bindables; using osu.Framework.Extensions.ListExtensions; using osu.Framework.Extensions.ObjectExtensions; @@ -197,7 +198,7 @@ protected DrawableHitObject([CanBeNull] HitObject initialHitObject = null) } [BackgroundDependencyLoader] - private void load(IGameplaySettings gameplaySettings, ISkinSource skinSource) + private void load(IGameplaySettings gameplaySettings, ISkinSource skinSource, OsuGameBase gameBase) { positionalHitsoundsLevel.BindTo(gameplaySettings.PositionalHitsoundsLevel); comboColourBrightness.BindTo(gameplaySettings.ComboColourNormalisationAmount); @@ -208,6 +209,8 @@ private void load(IGameplaySettings gameplaySettings, ISkinSource skinSource) MinimumSampleVolume = MINIMUM_SAMPLE_VOLUME }); + Samples.AddAdjustment(AdjustableProperty.Volume, gameBase.SampleNormalizeVolume); + CurrentSkin = skinSource; CurrentSkin.SourceChanged += skinSourceChanged; } From baede41e52f7a96fafe1e6f49231533510c37eb4 Mon Sep 17 00:00:00 2001 From: hwsmm Date: Sun, 12 May 2024 12:53:31 +0900 Subject: [PATCH 06/14] Create AudioNormalizationManager instead of putting in OsuGameBase --- osu.Game/Audio/AudioNormalizationManager.cs | 42 +++++++++++++++++++ osu.Game/OsuGameBase.cs | 30 ++----------- osu.Game/Overlays/MusicController.cs | 7 ++-- .../Objects/Drawables/DrawableHitObject.cs | 4 +- 4 files changed, 51 insertions(+), 32 deletions(-) create mode 100644 osu.Game/Audio/AudioNormalizationManager.cs diff --git a/osu.Game/Audio/AudioNormalizationManager.cs b/osu.Game/Audio/AudioNormalizationManager.cs new file mode 100644 index 000000000000..c47a550f5a98 --- /dev/null +++ b/osu.Game/Audio/AudioNormalizationManager.cs @@ -0,0 +1,42 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using osu.Framework.Audio; +using osu.Framework.Bindables; +using osu.Game.Configuration; + +namespace osu.Game.Audio +{ + public class AudioNormalizationManager + { + private readonly Bindable beatmapHitsoundBind; + + // drop track volume game-wide to leave some head-room for UI effects / samples. + public readonly BindableDouble TrackNormalizeVolume = new BindableDouble(0.8); + + public readonly BindableDouble SampleNormalizeVolume = new BindableDouble(1.0); + + public AudioNormalizationManager(AudioManager audioManager, OsuConfigManager config) + { + audioManager.Tracks.AddAdjustment(AdjustableProperty.Volume, TrackNormalizeVolume); + + beatmapHitsoundBind = config.GetBindable(OsuSetting.BeatmapHitsounds); + + normalizeSampleIfTrue(beatmapHitsoundBind.Value); + beatmapHitsoundBind.BindValueChanged(change => normalizeSampleIfTrue(change.NewValue)); + } + + private void normalizeSampleIfTrue(bool value) + { + if (value) + { + SampleNormalizeVolume.BindTo(TrackNormalizeVolume); + } + else + { + SampleNormalizeVolume.UnbindFrom(TrackNormalizeVolume); + SampleNormalizeVolume.Value = 1.0; + } + } + } +} diff --git a/osu.Game/OsuGameBase.cs b/osu.Game/OsuGameBase.cs index bc786732c28b..47a6a8237c9a 100644 --- a/osu.Game/OsuGameBase.cs +++ b/osu.Game/OsuGameBase.cs @@ -212,6 +212,8 @@ public virtual string Version protected SafeAreaContainer SafeAreaContainer { get; private set; } + protected AudioNormalizationManager AudioNormalizationManager { get; private set; } + /// /// For now, this is used as a source specifically for beat synced components. /// Going forward, it could potentially be used as the single source-of-truth for beatmap timing. @@ -224,13 +226,6 @@ public virtual string Version private DependencyContainer dependencies; - private Bindable beatmapHitsoundBind = null!; - - // drop track volume game-wide to leave some head-room for UI effects / samples. - public readonly BindableDouble TrackNormalizeVolume = new BindableDouble(0.8); - - public readonly BindableDouble SampleNormalizeVolume = new BindableDouble(1.0); - private Bindable frameworkLocale = null!; private IBindable localisationParameters = null!; @@ -353,26 +348,7 @@ private void load(ReadableKeyCombinationProvider keyCombinationProvider, Framewo RegisterImportHandler(ScoreManager); RegisterImportHandler(SkinManager); - // Apply normalization to tracks and samples. - // Samples will get normalized in line with tracks only if BeatmapHitsounds is enabled. - Audio.Tracks.AddAdjustment(AdjustableProperty.Volume, TrackNormalizeVolume); - beatmapHitsoundBind = LocalConfig.GetBindable(OsuSetting.BeatmapHitsounds); - - void normalizeSampleIfTrue(bool value) - { - if (value) - { - SampleNormalizeVolume.BindTo(TrackNormalizeVolume); - } - else - { - SampleNormalizeVolume.UnbindFrom(TrackNormalizeVolume); - SampleNormalizeVolume.Value = 1.0; - } - } - - normalizeSampleIfTrue(beatmapHitsoundBind.Value); - beatmapHitsoundBind.BindValueChanged(change => normalizeSampleIfTrue(change.NewValue)); + dependencies.Cache(AudioNormalizationManager = new AudioNormalizationManager(Audio, LocalConfig)); Beatmap = new NonNullableBindable(defaultBeatmap); diff --git a/osu.Game/Overlays/MusicController.cs b/osu.Game/Overlays/MusicController.cs index 0a02bb2bb535..d97bbab5e489 100644 --- a/osu.Game/Overlays/MusicController.cs +++ b/osu.Game/Overlays/MusicController.cs @@ -16,6 +16,7 @@ using osu.Framework.Graphics.Containers; using osu.Framework.Logging; using osu.Framework.Threading; +using osu.Game.Audio; using osu.Game.Beatmaps; using osu.Game.Database; using osu.Game.Rulesets.Mods; @@ -67,7 +68,7 @@ public partial class MusicController : CompositeDrawable private AudioManager audioManager { get; set; } [Resolved] - private OsuGameBase gameBase { get; set; } + private AudioNormalizationManager audioNormalizationManager { get; set; } protected override void LoadComplete() { @@ -342,8 +343,6 @@ private void changeTrack() CurrentTrack = queuedTrack; - gameBase.TrackNormalizeVolume.Value = current.BeatmapInfo.AudioNormalization?.IntegratedLoudnessInVolumeOffset ?? 0.8; - // At this point we may potentially be in an async context from tests. This is extremely dangerous but we have to make do for now. // CurrentTrack is immediately updated above for situations where a immediate knowledge about the new track is required, // but the mutation of the hierarchy is scheduled to avoid exceptions. @@ -354,6 +353,8 @@ private void changeTrack() if (queuedTrack == CurrentTrack) { AddInternal(queuedTrack); + + audioNormalizationManager.TrackNormalizeVolume.Value = current.BeatmapInfo.AudioNormalization?.IntegratedLoudnessInVolumeOffset ?? 0.8; queuedTrack.VolumeTo(0).Then().VolumeTo(1, 300, Easing.Out); } else diff --git a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs index 1c1fe713dac7..358f79a9a263 100644 --- a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs +++ b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs @@ -198,7 +198,7 @@ protected DrawableHitObject([CanBeNull] HitObject initialHitObject = null) } [BackgroundDependencyLoader] - private void load(IGameplaySettings gameplaySettings, ISkinSource skinSource, OsuGameBase gameBase) + private void load(IGameplaySettings gameplaySettings, ISkinSource skinSource, AudioNormalizationManager audioNormalizationManager) { positionalHitsoundsLevel.BindTo(gameplaySettings.PositionalHitsoundsLevel); comboColourBrightness.BindTo(gameplaySettings.ComboColourNormalisationAmount); @@ -209,7 +209,7 @@ private void load(IGameplaySettings gameplaySettings, ISkinSource skinSource, Os MinimumSampleVolume = MINIMUM_SAMPLE_VOLUME }); - Samples.AddAdjustment(AdjustableProperty.Volume, gameBase.SampleNormalizeVolume); + Samples.AddAdjustment(AdjustableProperty.Volume, audioNormalizationManager.SampleNormalizeVolume); CurrentSkin = skinSource; CurrentSkin.SourceChanged += skinSourceChanged; From 2ce022d924479f4bf356a505932524589f0353f2 Mon Sep 17 00:00:00 2001 From: hwsmm Date: Sun, 12 May 2024 14:07:59 +0900 Subject: [PATCH 07/14] Apply framework-side rename (AudioLoudness to TrackLoudness) --- osu.Game/Audio/AudioNormalization.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Audio/AudioNormalization.cs b/osu.Game/Audio/AudioNormalization.cs index 742f51d5650b..fcab42fe4e2d 100644 --- a/osu.Game/Audio/AudioNormalization.cs +++ b/osu.Game/Audio/AudioNormalization.cs @@ -54,7 +54,7 @@ public AudioNormalization(BeatmapInfo beatmapInfo, BeatmapSetInfo beatmapSetInfo return; } - using AudioLoudness loudness = new AudioLoudness(realmFileStore.Storage.GetStream(filepath)); + using TrackLoudness loudness = new TrackLoudness(realmFileStore.Storage.GetStream(filepath)); float? integratedLoudness = loudness.GetIntegratedLoudness(); From 89aabaeff21196f338ee621d971bb74130882299 Mon Sep 17 00:00:00 2001 From: hwsmm Date: Sun, 12 May 2024 14:08:17 +0900 Subject: [PATCH 08/14] Add docs in AudioNormalizationManager --- osu.Game/Audio/AudioNormalizationManager.cs | 22 ++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/osu.Game/Audio/AudioNormalizationManager.cs b/osu.Game/Audio/AudioNormalizationManager.cs index c47a550f5a98..73c5e4619d4e 100644 --- a/osu.Game/Audio/AudioNormalizationManager.cs +++ b/osu.Game/Audio/AudioNormalizationManager.cs @@ -2,20 +2,38 @@ // See the LICENCE file in the repository root for full licence text. using osu.Framework.Audio; +using osu.Framework.Audio.Track; using osu.Framework.Bindables; +using osu.Framework.Logging; using osu.Game.Configuration; +using osu.Game.Overlays; namespace osu.Game.Audio { + /// + /// Provides bindables for track/sample volume. + /// public class AudioNormalizationManager { private readonly Bindable beatmapHitsoundBind; - // drop track volume game-wide to leave some head-room for UI effects / samples. + /// + /// Default will bind to this bindable. + /// updates this on every track change. + /// It's set to 0.8 by default to leave some head-room for UI effects / samples. + /// public readonly BindableDouble TrackNormalizeVolume = new BindableDouble(0.8); + /// + /// Samples assigned to hitobjects needs to bind to this bindable to normalize their volume in line with track. + /// public readonly BindableDouble SampleNormalizeVolume = new BindableDouble(1.0); + /// + /// Creates a new . + /// + /// + /// public AudioNormalizationManager(AudioManager audioManager, OsuConfigManager config) { audioManager.Tracks.AddAdjustment(AdjustableProperty.Volume, TrackNormalizeVolume); @@ -24,6 +42,8 @@ public AudioNormalizationManager(AudioManager audioManager, OsuConfigManager con normalizeSampleIfTrue(beatmapHitsoundBind.Value); beatmapHitsoundBind.BindValueChanged(change => normalizeSampleIfTrue(change.NewValue)); + + TrackNormalizeVolume.BindValueChanged(va => Logger.Log($"New track loudness normalization value is {va.NewValue}", level: LogLevel.Debug)); } private void normalizeSampleIfTrue(bool value) From 618287852491c42dbc6441f1ed5d4cf5a488e366 Mon Sep 17 00:00:00 2001 From: hwsmm Date: Sun, 12 May 2024 14:09:35 +0900 Subject: [PATCH 09/14] Transform normalized volume along with queued track --- osu.Game/Audio/AudioNormalizationManager.cs | 2 -- osu.Game/Overlays/MusicController.cs | 4 +++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Game/Audio/AudioNormalizationManager.cs b/osu.Game/Audio/AudioNormalizationManager.cs index 73c5e4619d4e..ad2d91d1d0cf 100644 --- a/osu.Game/Audio/AudioNormalizationManager.cs +++ b/osu.Game/Audio/AudioNormalizationManager.cs @@ -42,8 +42,6 @@ public AudioNormalizationManager(AudioManager audioManager, OsuConfigManager con normalizeSampleIfTrue(beatmapHitsoundBind.Value); beatmapHitsoundBind.BindValueChanged(change => normalizeSampleIfTrue(change.NewValue)); - - TrackNormalizeVolume.BindValueChanged(va => Logger.Log($"New track loudness normalization value is {va.NewValue}", level: LogLevel.Debug)); } private void normalizeSampleIfTrue(bool value) diff --git a/osu.Game/Overlays/MusicController.cs b/osu.Game/Overlays/MusicController.cs index d97bbab5e489..52ce570ef562 100644 --- a/osu.Game/Overlays/MusicController.cs +++ b/osu.Game/Overlays/MusicController.cs @@ -354,7 +354,9 @@ private void changeTrack() { AddInternal(queuedTrack); - audioNormalizationManager.TrackNormalizeVolume.Value = current.BeatmapInfo.AudioNormalization?.IntegratedLoudnessInVolumeOffset ?? 0.8; + double normalizedVol = current.BeatmapInfo.AudioNormalization?.IntegratedLoudnessInVolumeOffset ?? 0.8; + this.TransformBindableTo(audioNormalizationManager.TrackNormalizeVolume, normalizedVol, 300, Easing.Out); + queuedTrack.VolumeTo(0).Then().VolumeTo(1, 300, Easing.Out); } else From 46f11c7035c7ded71bb00e4226f9babc1522df4a Mon Sep 17 00:00:00 2001 From: hwsmm Date: Sun, 12 May 2024 15:03:57 +0900 Subject: [PATCH 10/14] Remove AudioManager dependency from MusicController --- osu.Game/Overlays/MusicController.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/osu.Game/Overlays/MusicController.cs b/osu.Game/Overlays/MusicController.cs index 52ce570ef562..acf0fb030865 100644 --- a/osu.Game/Overlays/MusicController.cs +++ b/osu.Game/Overlays/MusicController.cs @@ -64,9 +64,6 @@ public partial class MusicController : CompositeDrawable [Resolved] private RealmAccess realm { get; set; } - [Resolved] - private AudioManager audioManager { get; set; } - [Resolved] private AudioNormalizationManager audioNormalizationManager { get; set; } From 7abcb5f90a6eb7e1c367addd224f1d38db275179 Mon Sep 17 00:00:00 2001 From: hwsmm Date: Sun, 12 May 2024 22:41:00 +0900 Subject: [PATCH 11/14] Fix xmldoc in AudioNormalization --- osu.Game/Audio/AudioNormalization.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/osu.Game/Audio/AudioNormalization.cs b/osu.Game/Audio/AudioNormalization.cs index fcab42fe4e2d..724e36964f76 100644 --- a/osu.Game/Audio/AudioNormalization.cs +++ b/osu.Game/Audio/AudioNormalization.cs @@ -90,9 +90,8 @@ public void PopulateSet(BeatmapInfo beatmapInfo, BeatmapSetInfo beatmapSetInfo) } /// - /// Convert integrated loudness to a volume offset + /// A volume offset that can be applied upon audio to reach (converted from integrated loudness). /// - /// The volume offset needed to reach public float IntegratedLoudnessInVolumeOffset => IntegratedLoudness != null ? (float)Math.Pow(10, (TARGET_LEVEL - (double)IntegratedLoudness) / 20) : 0.8f; /// From 953d6610373e1d3759be6cdca99bf6cd27a86b93 Mon Sep 17 00:00:00 2001 From: hwsmm Date: Tue, 14 May 2024 02:07:24 +0900 Subject: [PATCH 12/14] Refactor Audio Normalization --- osu.Game/Audio/AudioNormalization.cs | 4 +-- osu.Game/Audio/AudioNormalizationManager.cs | 37 +++++++++++++++++++-- osu.Game/Overlays/MusicController.cs | 4 +-- 3 files changed, 37 insertions(+), 8 deletions(-) diff --git a/osu.Game/Audio/AudioNormalization.cs b/osu.Game/Audio/AudioNormalization.cs index 724e36964f76..12b352a06a0f 100644 --- a/osu.Game/Audio/AudioNormalization.cs +++ b/osu.Game/Audio/AudioNormalization.cs @@ -11,7 +11,7 @@ namespace osu.Game.Audio { /// - /// Audio Normalization Manager + /// Audio Normalization Data /// public class AudioNormalization : EmbeddedObject, IEquatable { @@ -92,7 +92,7 @@ public void PopulateSet(BeatmapInfo beatmapInfo, BeatmapSetInfo beatmapSetInfo) /// /// A volume offset that can be applied upon audio to reach (converted from integrated loudness). /// - public float IntegratedLoudnessInVolumeOffset => IntegratedLoudness != null ? (float)Math.Pow(10, (TARGET_LEVEL - (double)IntegratedLoudness) / 20) : 0.8f; + public double? IntegratedLoudnessInVolumeOffset => IntegratedLoudness != null ? TrackLoudness.ConvertToVolumeOffset(TARGET_LEVEL, (float)IntegratedLoudness) : null; /// public bool Equals(AudioNormalization? other) => other?.IntegratedLoudness != null && IntegratedLoudness != null && Math.Abs((float)(IntegratedLoudness - other.IntegratedLoudness)) < 0.0000001; diff --git a/osu.Game/Audio/AudioNormalizationManager.cs b/osu.Game/Audio/AudioNormalizationManager.cs index ad2d91d1d0cf..5e6b7e5e4ad5 100644 --- a/osu.Game/Audio/AudioNormalizationManager.cs +++ b/osu.Game/Audio/AudioNormalizationManager.cs @@ -1,6 +1,7 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +using System; using osu.Framework.Audio; using osu.Framework.Audio.Track; using osu.Framework.Bindables; @@ -15,6 +16,11 @@ namespace osu.Game.Audio /// public class AudioNormalizationManager { + /// + /// Fallback volume for tracks that failed to measure loudness. + /// + public const double FALLBACK_VOLUME = 0.8; + private readonly Bindable beatmapHitsoundBind; /// @@ -22,7 +28,7 @@ public class AudioNormalizationManager /// updates this on every track change. /// It's set to 0.8 by default to leave some head-room for UI effects / samples. /// - public readonly BindableDouble TrackNormalizeVolume = new BindableDouble(0.8); + public readonly BindableDouble TrackNormalizeVolume = new BindableDouble(FALLBACK_VOLUME); /// /// Samples assigned to hitobjects needs to bind to this bindable to normalize their volume in line with track. @@ -32,8 +38,8 @@ public class AudioNormalizationManager /// /// Creates a new . /// - /// - /// + /// An audio manager with tracks that need normalization. + /// An osu config to get beatmap hitsounds bindable from. public AudioNormalizationManager(AudioManager audioManager, OsuConfigManager config) { audioManager.Tracks.AddAdjustment(AdjustableProperty.Volume, TrackNormalizeVolume); @@ -56,5 +62,30 @@ private void normalizeSampleIfTrue(bool value) SampleNormalizeVolume.Value = 1.0; } } + + /// + /// Notify that normalization is needed, and run a provided action if needed. + /// + /// An to get volume offset from. + /// An action to run if needed. + public void SetTrackNormalizationVolume(AudioNormalization? audioNormalization, Action action) + { + double? volume = audioNormalization?.IntegratedLoudnessInVolumeOffset; + + if (volume == null) + { + volume = FALLBACK_VOLUME; + Logger.Log($"Normalization status: {Math.Round((double)volume * 100)}% (fallback)"); + } + else + { + Logger.Log($"Normalization status: {Math.Round((double)volume * 100)}%"); + } + + if (volume == TrackNormalizeVolume.Value) + return; + + action(TrackNormalizeVolume, (double)volume); + } } } diff --git a/osu.Game/Overlays/MusicController.cs b/osu.Game/Overlays/MusicController.cs index acf0fb030865..98d28a4affc7 100644 --- a/osu.Game/Overlays/MusicController.cs +++ b/osu.Game/Overlays/MusicController.cs @@ -351,9 +351,7 @@ private void changeTrack() { AddInternal(queuedTrack); - double normalizedVol = current.BeatmapInfo.AudioNormalization?.IntegratedLoudnessInVolumeOffset ?? 0.8; - this.TransformBindableTo(audioNormalizationManager.TrackNormalizeVolume, normalizedVol, 300, Easing.Out); - + audioNormalizationManager.SetTrackNormalizationVolume(current.BeatmapInfo.AudioNormalization, (bindable, vol) => this.TransformBindableTo(bindable, vol, 300, Easing.Out)); queuedTrack.VolumeTo(0).Then().VolumeTo(1, 300, Easing.Out); } else From b5ceb48bd34b331eabb0a28b390581926ee45c46 Mon Sep 17 00:00:00 2001 From: hwsmm Date: Mon, 20 May 2024 01:58:13 +0900 Subject: [PATCH 13/14] Add audio normalization setting Co-authored-by: smallketchup82 <69545310+smallketchup82@users.noreply.github.com> --- osu.Game/Configuration/OsuConfigManager.cs | 3 +++ osu.Game/Localisation/AudioSettingsStrings.cs | 5 +++++ osu.Game/Overlays/Settings/Sections/Audio/VolumeSettings.cs | 5 +++++ 3 files changed, 13 insertions(+) diff --git a/osu.Game/Configuration/OsuConfigManager.cs b/osu.Game/Configuration/OsuConfigManager.cs index f4a4c553d8cf..30aac469fff7 100644 --- a/osu.Game/Configuration/OsuConfigManager.cs +++ b/osu.Game/Configuration/OsuConfigManager.cs @@ -109,6 +109,8 @@ protected override void InitialiseDefaults() SetDefault(OsuSetting.AudioOffset, 0, -500.0, 500.0, 1); + SetDefault(OsuSetting.AudioNormalization, true); + // Input SetDefault(OsuSetting.MenuCursorSize, 1.0f, 0.5f, 2f, 0.01f); SetDefault(OsuSetting.GameplayCursorSize, 1.0f, 0.1f, 2f, 0.01f); @@ -360,6 +362,7 @@ public enum OsuSetting /// This is added to the audio track's current time. Higher values will cause gameplay to occur earlier, relative to the audio track. /// AudioOffset, + AudioNormalization, VolumeInactive, MenuMusic, diff --git a/osu.Game/Localisation/AudioSettingsStrings.cs b/osu.Game/Localisation/AudioSettingsStrings.cs index 89db60d8a69c..4d38883f6441 100644 --- a/osu.Game/Localisation/AudioSettingsStrings.cs +++ b/osu.Game/Localisation/AudioSettingsStrings.cs @@ -64,6 +64,11 @@ public static class AudioSettingsStrings ///
public static LocalisableString AudioOffset => new TranslatableString(getKey(@"audio_offset"), @"Audio offset"); + /// + /// "Normalize Audio" + /// + public static LocalisableString AudioNormalization => new TranslatableString(getKey(@"audio_normalization"), @"Normalize Audio"); + /// /// "Play a few beatmaps to receive a suggested offset!" /// diff --git a/osu.Game/Overlays/Settings/Sections/Audio/VolumeSettings.cs b/osu.Game/Overlays/Settings/Sections/Audio/VolumeSettings.cs index 2bb5fa983f54..7d73dbd199f0 100644 --- a/osu.Game/Overlays/Settings/Sections/Audio/VolumeSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/Audio/VolumeSettings.cs @@ -49,6 +49,11 @@ private void load(AudioManager audio, OsuConfigManager config) KeyboardStep = 0.01f, DisplayAsPercentage = true }, + new SettingsCheckbox + { + LabelText = AudioSettingsStrings.AudioNormalization, + Current = config.GetBindable(OsuSetting.AudioNormalization) + } }; } From 7b9360eaeb6e0cbc63749441d44a2ec6a4ec00a8 Mon Sep 17 00:00:00 2001 From: hwsmm Date: Mon, 20 May 2024 01:59:15 +0900 Subject: [PATCH 14/14] Refator audio normalization 2 --- osu.Game/Audio/AudioNormalizationManager.cs | 62 ++++++--------------- osu.Game/Beatmaps/WorkingBeatmap.cs | 13 +++++ osu.Game/OsuGameBase.cs | 4 +- osu.Game/Overlays/MusicController.cs | 6 -- 4 files changed, 33 insertions(+), 52 deletions(-) diff --git a/osu.Game/Audio/AudioNormalizationManager.cs b/osu.Game/Audio/AudioNormalizationManager.cs index 5e6b7e5e4ad5..00293d965dc6 100644 --- a/osu.Game/Audio/AudioNormalizationManager.cs +++ b/osu.Game/Audio/AudioNormalizationManager.cs @@ -1,18 +1,16 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -using System; -using osu.Framework.Audio; using osu.Framework.Audio.Track; using osu.Framework.Bindables; using osu.Framework.Logging; +using osu.Game.Beatmaps; using osu.Game.Configuration; -using osu.Game.Overlays; namespace osu.Game.Audio { /// - /// Provides bindables for track/sample volume. + /// Manages audio normalization. /// public class AudioNormalizationManager { @@ -21,14 +19,7 @@ public class AudioNormalizationManager /// public const double FALLBACK_VOLUME = 0.8; - private readonly Bindable beatmapHitsoundBind; - - /// - /// Default will bind to this bindable. - /// updates this on every track change. - /// It's set to 0.8 by default to leave some head-room for UI effects / samples. - /// - public readonly BindableDouble TrackNormalizeVolume = new BindableDouble(FALLBACK_VOLUME); + private readonly Bindable audioNormalizationSetting; /// /// Samples assigned to hitobjects needs to bind to this bindable to normalize their volume in line with track. @@ -38,54 +29,37 @@ public class AudioNormalizationManager /// /// Creates a new . /// - /// An audio manager with tracks that need normalization. /// An osu config to get beatmap hitsounds bindable from. - public AudioNormalizationManager(AudioManager audioManager, OsuConfigManager config) + /// A bindable for beatmap. + public AudioNormalizationManager(OsuConfigManager config, IBindable beatmap) { - audioManager.Tracks.AddAdjustment(AdjustableProperty.Volume, TrackNormalizeVolume); - - beatmapHitsoundBind = config.GetBindable(OsuSetting.BeatmapHitsounds); + audioNormalizationSetting = config.GetBindable(OsuSetting.AudioNormalization); - normalizeSampleIfTrue(beatmapHitsoundBind.Value); - beatmapHitsoundBind.BindValueChanged(change => normalizeSampleIfTrue(change.NewValue)); + updateNormalization(audioNormalizationSetting.Value, beatmap.Value); + audioNormalizationSetting.BindValueChanged(change => updateNormalization(change.NewValue, beatmap.Value)); + beatmap.BindValueChanged(ev => onBeatmapChanged(ev.OldValue, ev.NewValue)); } - private void normalizeSampleIfTrue(bool value) + private void updateNormalization(bool value, WorkingBeatmap current) { if (value) { - SampleNormalizeVolume.BindTo(TrackNormalizeVolume); + SampleNormalizeVolume.BindTo(current.TrackNormalizeVolume); + current.EnableTrackNormlization(); + Logger.Log($"Normalization value: {(int)(current.TrackNormalizeVolume.Value * 100)}%"); } else { - SampleNormalizeVolume.UnbindFrom(TrackNormalizeVolume); + SampleNormalizeVolume.UnbindFrom(current.TrackNormalizeVolume); SampleNormalizeVolume.Value = 1.0; + current.DisableTrackNormalization(); } } - /// - /// Notify that normalization is needed, and run a provided action if needed. - /// - /// An to get volume offset from. - /// An action to run if needed. - public void SetTrackNormalizationVolume(AudioNormalization? audioNormalization, Action action) + private void onBeatmapChanged(WorkingBeatmap oldBeatmap, WorkingBeatmap newBeatmap) { - double? volume = audioNormalization?.IntegratedLoudnessInVolumeOffset; - - if (volume == null) - { - volume = FALLBACK_VOLUME; - Logger.Log($"Normalization status: {Math.Round((double)volume * 100)}% (fallback)"); - } - else - { - Logger.Log($"Normalization status: {Math.Round((double)volume * 100)}%"); - } - - if (volume == TrackNormalizeVolume.Value) - return; - - action(TrackNormalizeVolume, (double)volume); + SampleNormalizeVolume.UnbindFrom(oldBeatmap.TrackNormalizeVolume); + updateNormalization(audioNormalizationSetting.Value, newBeatmap); } } } diff --git a/osu.Game/Beatmaps/WorkingBeatmap.cs b/osu.Game/Beatmaps/WorkingBeatmap.cs index 25159996f3d2..db8ca80be122 100644 --- a/osu.Game/Beatmaps/WorkingBeatmap.cs +++ b/osu.Game/Beatmaps/WorkingBeatmap.cs @@ -13,9 +13,11 @@ using JetBrains.Annotations; using osu.Framework.Audio; using osu.Framework.Audio.Track; +using osu.Framework.Bindables; using osu.Framework.Extensions; using osu.Framework.Graphics.Textures; using osu.Framework.Logging; +using osu.Game.Audio; using osu.Game.Rulesets; using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.UI; @@ -111,9 +113,20 @@ public Track LoadTrack() waveform?.Dispose(); waveform = null; + track.AddAdjustment(AdjustableProperty.Volume, TrackNormalizeVolume); + return track; } + // Normalization is here because it's not so good to apply normalization in global state through MusicController or TrackStore. + // Each beatmap has its own track and its own track loudness value. + public readonly BindableDouble TrackNormalizeVolume = new BindableDouble(AudioNormalizationManager.FALLBACK_VOLUME); + + public void EnableTrackNormlization() + => TrackNormalizeVolume.Value = BeatmapInfo.AudioNormalization?.IntegratedLoudnessInVolumeOffset ?? AudioNormalizationManager.FALLBACK_VOLUME; + + public void DisableTrackNormalization() => TrackNormalizeVolume.Value = AudioNormalizationManager.FALLBACK_VOLUME; + public void PrepareTrackForPreview(bool looping, double offsetFromPreviewPoint = 0) { Track.Looping = looping; diff --git a/osu.Game/OsuGameBase.cs b/osu.Game/OsuGameBase.cs index 47a6a8237c9a..073eb049fc63 100644 --- a/osu.Game/OsuGameBase.cs +++ b/osu.Game/OsuGameBase.cs @@ -348,8 +348,6 @@ private void load(ReadableKeyCombinationProvider keyCombinationProvider, Framewo RegisterImportHandler(ScoreManager); RegisterImportHandler(SkinManager); - dependencies.Cache(AudioNormalizationManager = new AudioNormalizationManager(Audio, LocalConfig)); - Beatmap = new NonNullableBindable(defaultBeatmap); dependencies.CacheAs>(Beatmap); @@ -369,6 +367,8 @@ private void load(ReadableKeyCombinationProvider keyCombinationProvider, Framewo dependencies.Cache(previewTrackManager = new PreviewTrackManager(BeatmapManager.BeatmapTrackStore)); base.Content.Add(previewTrackManager); + dependencies.Cache(AudioNormalizationManager = new AudioNormalizationManager(LocalConfig, Beatmap)); + base.Content.Add(MusicController = new MusicController()); dependencies.CacheAs(MusicController); diff --git a/osu.Game/Overlays/MusicController.cs b/osu.Game/Overlays/MusicController.cs index 98d28a4affc7..0986c0513ca8 100644 --- a/osu.Game/Overlays/MusicController.cs +++ b/osu.Game/Overlays/MusicController.cs @@ -16,7 +16,6 @@ using osu.Framework.Graphics.Containers; using osu.Framework.Logging; using osu.Framework.Threading; -using osu.Game.Audio; using osu.Game.Beatmaps; using osu.Game.Database; using osu.Game.Rulesets.Mods; @@ -64,9 +63,6 @@ public partial class MusicController : CompositeDrawable [Resolved] private RealmAccess realm { get; set; } - [Resolved] - private AudioNormalizationManager audioNormalizationManager { get; set; } - protected override void LoadComplete() { base.LoadComplete(); @@ -350,8 +346,6 @@ private void changeTrack() if (queuedTrack == CurrentTrack) { AddInternal(queuedTrack); - - audioNormalizationManager.SetTrackNormalizationVolume(current.BeatmapInfo.AudioNormalization, (bindable, vol) => this.TransformBindableTo(bindable, vol, 300, Easing.Out)); queuedTrack.VolumeTo(0).Then().VolumeTo(1, 300, Easing.Out); } else