From 9277586907600f6ae9ace884fea751d431359bbf Mon Sep 17 00:00:00 2001 From: aQaTL Date: Tue, 16 Jan 2018 17:46:54 +0100 Subject: [PATCH 01/27] Toggle mute/unmute keyboard shortcut --- .../UserInterface/Volume/VolumeControl.cs | 4 ++++ .../Graphics/UserInterface/Volume/VolumeMeter.cs | 16 +++++++++++++++- .../Bindings/GlobalKeyBindingInputManager.cs | 3 +++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs index 33888e57e0..63b14713e2 100644 --- a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs +++ b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs @@ -76,6 +76,10 @@ namespace osu.Game.Graphics.UserInterface.Volume else volumeMeterMaster.Increase(); return true; + case GlobalAction.ToggleMute: + Show(); + volumeMeterMaster.ToogleMute(); + return true; } return false; diff --git a/osu.Game/Graphics/UserInterface/Volume/VolumeMeter.cs b/osu.Game/Graphics/UserInterface/Volume/VolumeMeter.cs index 8323dade44..dc1b2e85eb 100644 --- a/osu.Game/Graphics/UserInterface/Volume/VolumeMeter.cs +++ b/osu.Game/Graphics/UserInterface/Volume/VolumeMeter.cs @@ -18,6 +18,9 @@ namespace osu.Game.Graphics.UserInterface.Volume private readonly Box meterFill; public BindableDouble Bindable { get; } = new BindableDouble(); + private double lastVolume; + public bool IsMuted { get; private set; } + public VolumeMeter(string meterName) { Size = new Vector2(40, 180); @@ -70,16 +73,19 @@ namespace osu.Game.Graphics.UserInterface.Volume public double Volume { - get { return Bindable.Value; } + get => Bindable.Value; private set { Bindable.Value = value; + if (value > 0) + IsMuted = false; } } public void Increase() { Volume += 0.05f; + IsMuted = false; } public void Decrease() @@ -87,6 +93,14 @@ namespace osu.Game.Graphics.UserInterface.Volume Volume -= 0.05f; } + public void ToogleMute() + { + IsMuted = !IsMuted; + if (IsMuted) + lastVolume = Volume; + Volume = IsMuted ? 0.0 : lastVolume; + } + private void updateFill() => meterFill.ScaleTo(new Vector2(1, (float)Volume), 300, Easing.OutQuint); public bool OnPressed(GlobalAction action) diff --git a/osu.Game/Input/Bindings/GlobalKeyBindingInputManager.cs b/osu.Game/Input/Bindings/GlobalKeyBindingInputManager.cs index f5e54775fb..6c317890af 100644 --- a/osu.Game/Input/Bindings/GlobalKeyBindingInputManager.cs +++ b/osu.Game/Input/Bindings/GlobalKeyBindingInputManager.cs @@ -33,6 +33,7 @@ namespace osu.Game.Input.Bindings new KeyBinding(new[] { InputKey.MouseWheelUp }, GlobalAction.IncreaseVolume), new KeyBinding(new[] { InputKey.Down }, GlobalAction.DecreaseVolume), new KeyBinding(new[] { InputKey.MouseWheelDown }, GlobalAction.DecreaseVolume), + new KeyBinding(InputKey.F4, GlobalAction.ToggleMute), }; public IEnumerable InGameKeyBindings => new[] @@ -62,6 +63,8 @@ namespace osu.Game.Input.Bindings IncreaseVolume, [Description("Decrease Volume")] DecreaseVolume, + [Description("Toggle mute")] + ToggleMute, // In-Game Keybindings [Description("Skip Cutscene")] From 0340e4f8dcccbf6f5d09189f95aea5543bdca92a Mon Sep 17 00:00:00 2001 From: aQaTL Date: Tue, 16 Jan 2018 20:33:30 +0100 Subject: [PATCH 02/27] Option in settings to toggle mute/unmute when losing/gaining window focus --- osu.Game/Configuration/OsuConfigManager.cs | 3 +++ .../UserInterface/Volume/VolumeControl.cs | 18 ++++++++++++++ osu.Game/OsuGame.cs | 24 +++++++++++++++++++ .../Settings/Sections/Audio/VolumeSettings.cs | 4 +++- 4 files changed, 48 insertions(+), 1 deletion(-) diff --git a/osu.Game/Configuration/OsuConfigManager.cs b/osu.Game/Configuration/OsuConfigManager.cs index 23f7fd6ac1..0c90b2c2ec 100644 --- a/osu.Game/Configuration/OsuConfigManager.cs +++ b/osu.Game/Configuration/OsuConfigManager.cs @@ -39,6 +39,8 @@ namespace osu.Game.Configuration }; // Audio + Set(OsuSetting.MuteWhenInactive, false); + Set(OsuSetting.MenuVoice, true); Set(OsuSetting.MenuMusic, true); @@ -101,6 +103,7 @@ namespace osu.Game.Configuration MouseDisableButtons, MouseDisableWheel, AudioOffset, + MuteWhenInactive, MenuMusic, MenuVoice, CursorRotation, diff --git a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs index 63b14713e2..7a1a2de50d 100644 --- a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs +++ b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs @@ -91,6 +91,24 @@ namespace osu.Game.Graphics.UserInterface.Volume schedulePopOut(); } + public bool IsMuted => volumeMeterMaster.IsMuted; + + public void Mute() + { + if (!IsMuted) + { + volumeMeterMaster.ToogleMute(); + } + } + + public void Unmute() + { + if (IsMuted) + { + volumeMeterMaster.ToogleMute(); + } + } + [BackgroundDependencyLoader] private void load(AudioManager audio) { diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs index 124b9364b3..56cfffdeae 100644 --- a/osu.Game/OsuGame.cs +++ b/osu.Game/OsuGame.cs @@ -115,6 +115,8 @@ namespace osu.Game configRuleset = LocalConfig.GetBindable(OsuSetting.Ruleset); Ruleset.Value = RulesetStore.GetRuleset(configRuleset.Value) ?? RulesetStore.AvailableRulesets.First(); Ruleset.ValueChanged += r => configRuleset.Value = r.ID ?? 0; + + muteWhenInactive = LocalConfig.GetBindable(OsuSetting.MuteWhenInactive); } private ScheduledDelegate scoreLoad; @@ -386,6 +388,28 @@ namespace osu.Game return false; } + private Bindable muteWhenInactive = new Bindable(); + private bool wasMuted; + + protected override void OnDeactivated() + { + base.OnDeactivated(); + if (muteWhenInactive) + { + wasMuted = volume.IsMuted; + volume.Mute(); + } + } + + protected override void OnActivated() + { + base.OnActivated(); + if (IsLoaded && muteWhenInactive && !wasMuted) + { + volume.Unmute(); + } + } + public bool OnReleased(GlobalAction action) => false; private Container mainContent; diff --git a/osu.Game/Overlays/Settings/Sections/Audio/VolumeSettings.cs b/osu.Game/Overlays/Settings/Sections/Audio/VolumeSettings.cs index 40b9ff069b..01bcf989dc 100644 --- a/osu.Game/Overlays/Settings/Sections/Audio/VolumeSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/Audio/VolumeSettings.cs @@ -4,6 +4,7 @@ using osu.Framework.Allocation; using osu.Framework.Audio; using osu.Framework.Graphics; +using osu.Game.Configuration; namespace osu.Game.Overlays.Settings.Sections.Audio { @@ -12,13 +13,14 @@ namespace osu.Game.Overlays.Settings.Sections.Audio protected override string Header => "Volume"; [BackgroundDependencyLoader] - private void load(AudioManager audio) + private void load(AudioManager audio, OsuConfigManager config) { Children = new Drawable[] { new SettingsSlider { LabelText = "Master", Bindable = audio.Volume, KeyboardStep = 0.1f }, new SettingsSlider { LabelText = "Effect", Bindable = audio.VolumeSample, KeyboardStep = 0.1f }, new SettingsSlider { LabelText = "Music", Bindable = audio.VolumeTrack, KeyboardStep = 0.1f }, + new SettingsCheckbox { LabelText = "Mute osu! when inactive", Bindable = config.GetBindable(OsuSetting.MuteWhenInactive) } }; } } From 538c20a947d0e231ff9b84ba9ce36bac78c52c70 Mon Sep 17 00:00:00 2001 From: aQaTL Date: Tue, 16 Jan 2018 21:30:48 +0100 Subject: [PATCH 03/27] Prevent not saving audio levels when user alt tabs before the window closes --- osu.Game/OsuGame.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs index 56cfffdeae..de923b3451 100644 --- a/osu.Game/OsuGame.cs +++ b/osu.Game/OsuGame.cs @@ -79,6 +79,8 @@ namespace osu.Game private SettingsOverlay settings; + private bool exiting; + public OsuGame(string[] args = null) { this.args = args; @@ -117,6 +119,13 @@ namespace osu.Game Ruleset.ValueChanged += r => configRuleset.Value = r.ID ?? 0; muteWhenInactive = LocalConfig.GetBindable(OsuSetting.MuteWhenInactive); + Host.Window.Exited += () => + { + //Prevent not saving audio levels when user alt tabs before the window closes + if (volume.IsMuted) + volume.Unmute(); + exiting = true; + }; } private ScheduledDelegate scoreLoad; @@ -394,7 +403,7 @@ namespace osu.Game protected override void OnDeactivated() { base.OnDeactivated(); - if (muteWhenInactive) + if (muteWhenInactive && !exiting) { wasMuted = volume.IsMuted; volume.Mute(); @@ -404,7 +413,7 @@ namespace osu.Game protected override void OnActivated() { base.OnActivated(); - if (IsLoaded && muteWhenInactive && !wasMuted) + if (IsLoaded && muteWhenInactive && !wasMuted && !exiting) { volume.Unmute(); } From ac41cb59eabaed0034fa34ab6a5a0a5938673cb1 Mon Sep 17 00:00:00 2001 From: aQaTL Date: Wed, 17 Jan 2018 14:36:33 +0100 Subject: [PATCH 04/27] Typo fix, removed unnecessary braces --- .../Graphics/UserInterface/Volume/VolumeControl.cs | 10 +++------- osu.Game/Graphics/UserInterface/Volume/VolumeMeter.cs | 2 +- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs index 7a1a2de50d..04c48c629d 100644 --- a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs +++ b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs @@ -78,7 +78,7 @@ namespace osu.Game.Graphics.UserInterface.Volume return true; case GlobalAction.ToggleMute: Show(); - volumeMeterMaster.ToogleMute(); + volumeMeterMaster.ToggleMute(); return true; } @@ -96,17 +96,13 @@ namespace osu.Game.Graphics.UserInterface.Volume public void Mute() { if (!IsMuted) - { - volumeMeterMaster.ToogleMute(); - } + volumeMeterMaster.ToggleMute(); } public void Unmute() { if (IsMuted) - { - volumeMeterMaster.ToogleMute(); - } + volumeMeterMaster.ToggleMute(); } [BackgroundDependencyLoader] diff --git a/osu.Game/Graphics/UserInterface/Volume/VolumeMeter.cs b/osu.Game/Graphics/UserInterface/Volume/VolumeMeter.cs index dc1b2e85eb..aac969b84f 100644 --- a/osu.Game/Graphics/UserInterface/Volume/VolumeMeter.cs +++ b/osu.Game/Graphics/UserInterface/Volume/VolumeMeter.cs @@ -93,7 +93,7 @@ namespace osu.Game.Graphics.UserInterface.Volume Volume -= 0.05f; } - public void ToogleMute() + public void ToggleMute() { IsMuted = !IsMuted; if (IsMuted) From 1440edbf8b14bf3577461247f51758abf72ab92e Mon Sep 17 00:00:00 2001 From: aQaTL Date: Wed, 17 Jan 2018 17:15:13 +0100 Subject: [PATCH 05/27] Use AudioManager adjustments to mute volume --- .../UserInterface/Volume/VolumeControl.cs | 28 ++++++++++++++----- .../UserInterface/Volume/VolumeMeter.cs | 17 +---------- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs index 04c48c629d..d5645d6f24 100644 --- a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs +++ b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs @@ -7,12 +7,15 @@ using osu.Framework.Threading; using OpenTK; using osu.Framework.Audio; using osu.Framework.Allocation; +using osu.Framework.Configuration; using osu.Game.Input.Bindings; namespace osu.Game.Graphics.UserInterface.Volume { public class VolumeControl : OverlayContainer { + private AudioManager audio; + private readonly VolumeMeter volumeMeterMaster; protected override bool BlockPassThroughMouse => false; @@ -77,8 +80,10 @@ namespace osu.Game.Graphics.UserInterface.Volume volumeMeterMaster.Increase(); return true; case GlobalAction.ToggleMute: - Show(); - volumeMeterMaster.ToggleMute(); + if (IsMuted) + Unmute(); + else + Mute(); return true; } @@ -91,23 +96,32 @@ namespace osu.Game.Graphics.UserInterface.Volume schedulePopOut(); } - public bool IsMuted => volumeMeterMaster.IsMuted; + private readonly BindableDouble muteBindable = new BindableDouble(); + + public bool IsMuted { get; private set; } public void Mute() { - if (!IsMuted) - volumeMeterMaster.ToggleMute(); + if (IsMuted) + return; + + audio.AddAdjustment(AdjustableProperty.Volume, muteBindable); + IsMuted = true; } public void Unmute() { - if (IsMuted) - volumeMeterMaster.ToggleMute(); + if (!IsMuted) + return; + + audio.RemoveAdjustment(AdjustableProperty.Volume, muteBindable); + IsMuted = false; } [BackgroundDependencyLoader] private void load(AudioManager audio) { + this.audio = audio; volumeMeterMaster.Bindable.BindTo(audio.Volume); volumeMeterEffect.Bindable.BindTo(audio.VolumeSample); volumeMeterMusic.Bindable.BindTo(audio.VolumeTrack); diff --git a/osu.Game/Graphics/UserInterface/Volume/VolumeMeter.cs b/osu.Game/Graphics/UserInterface/Volume/VolumeMeter.cs index aac969b84f..a1acb5d2ff 100644 --- a/osu.Game/Graphics/UserInterface/Volume/VolumeMeter.cs +++ b/osu.Game/Graphics/UserInterface/Volume/VolumeMeter.cs @@ -19,7 +19,6 @@ namespace osu.Game.Graphics.UserInterface.Volume public BindableDouble Bindable { get; } = new BindableDouble(); private double lastVolume; - public bool IsMuted { get; private set; } public VolumeMeter(string meterName) { @@ -74,18 +73,12 @@ namespace osu.Game.Graphics.UserInterface.Volume public double Volume { get => Bindable.Value; - private set - { - Bindable.Value = value; - if (value > 0) - IsMuted = false; - } + private set => Bindable.Value = value; } public void Increase() { Volume += 0.05f; - IsMuted = false; } public void Decrease() @@ -93,14 +86,6 @@ namespace osu.Game.Graphics.UserInterface.Volume Volume -= 0.05f; } - public void ToggleMute() - { - IsMuted = !IsMuted; - if (IsMuted) - lastVolume = Volume; - Volume = IsMuted ? 0.0 : lastVolume; - } - private void updateFill() => meterFill.ScaleTo(new Vector2(1, (float)Volume), 300, Easing.OutQuint); public bool OnPressed(GlobalAction action) From a8fb732256d35c18c99cbf902d8b5fe8efe453de Mon Sep 17 00:00:00 2001 From: aQaTL Date: Wed, 17 Jan 2018 20:43:08 +0100 Subject: [PATCH 06/27] Added muted/unmuted icon --- .../UserInterface/Volume/VolumeControl.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs index d5645d6f24..2d350a3474 100644 --- a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs +++ b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs @@ -17,6 +17,7 @@ namespace osu.Game.Graphics.UserInterface.Volume private AudioManager audio; private readonly VolumeMeter volumeMeterMaster; + private readonly IconButton muteIcon; protected override bool BlockPassThroughMouse => false; @@ -37,12 +38,23 @@ namespace osu.Game.Graphics.UserInterface.Volume Spacing = new Vector2(15, 0), Children = new Drawable[] { + muteIcon = new IconButton(), volumeMeterMaster = new VolumeMeter("Master"), volumeMeterEffect = new VolumeMeter("Effects"), volumeMeterMusic = new VolumeMeter("Music") } } }; + + muteIcon.Icon = FontAwesome.fa_volume_up; + muteIcon.Scale = new Vector2(2.0f); + muteIcon.Action = () => + { + if (IsMuted) + Unmute(); + else + Mute(); + }; } protected override void LoadComplete() @@ -80,6 +92,8 @@ namespace osu.Game.Graphics.UserInterface.Volume volumeMeterMaster.Increase(); return true; case GlobalAction.ToggleMute: + if (State == Visibility.Hidden) + Show(); if (IsMuted) Unmute(); else @@ -107,6 +121,7 @@ namespace osu.Game.Graphics.UserInterface.Volume audio.AddAdjustment(AdjustableProperty.Volume, muteBindable); IsMuted = true; + muteIcon.Icon = FontAwesome.fa_volume_off; } public void Unmute() @@ -116,6 +131,7 @@ namespace osu.Game.Graphics.UserInterface.Volume audio.RemoveAdjustment(AdjustableProperty.Volume, muteBindable); IsMuted = false; + muteIcon.Icon = FontAwesome.fa_volume_up; } [BackgroundDependencyLoader] From 8471a579e056db875a198921ba3dab1042c4cae0 Mon Sep 17 00:00:00 2001 From: aQaTL Date: Wed, 17 Jan 2018 20:56:44 +0100 Subject: [PATCH 07/27] Removed no longer neccessary "exiting" flag --- osu.Game/OsuGame.cs | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs index de923b3451..56cfffdeae 100644 --- a/osu.Game/OsuGame.cs +++ b/osu.Game/OsuGame.cs @@ -79,8 +79,6 @@ namespace osu.Game private SettingsOverlay settings; - private bool exiting; - public OsuGame(string[] args = null) { this.args = args; @@ -119,13 +117,6 @@ namespace osu.Game Ruleset.ValueChanged += r => configRuleset.Value = r.ID ?? 0; muteWhenInactive = LocalConfig.GetBindable(OsuSetting.MuteWhenInactive); - Host.Window.Exited += () => - { - //Prevent not saving audio levels when user alt tabs before the window closes - if (volume.IsMuted) - volume.Unmute(); - exiting = true; - }; } private ScheduledDelegate scoreLoad; @@ -403,7 +394,7 @@ namespace osu.Game protected override void OnDeactivated() { base.OnDeactivated(); - if (muteWhenInactive && !exiting) + if (muteWhenInactive) { wasMuted = volume.IsMuted; volume.Mute(); @@ -413,7 +404,7 @@ namespace osu.Game protected override void OnActivated() { base.OnActivated(); - if (IsLoaded && muteWhenInactive && !wasMuted && !exiting) + if (IsLoaded && muteWhenInactive && !wasMuted) { volume.Unmute(); } From 18ff57fdf9589a8d2cfffa943ae7bd4fb1733960 Mon Sep 17 00:00:00 2001 From: aQaTL Date: Wed, 17 Jan 2018 21:09:46 +0100 Subject: [PATCH 08/27] Inline changing mute icon properties with object creation --- .../UserInterface/Volume/VolumeControl.cs | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs index 2d350a3474..2f565eba22 100644 --- a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs +++ b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs @@ -38,23 +38,24 @@ namespace osu.Game.Graphics.UserInterface.Volume Spacing = new Vector2(15, 0), Children = new Drawable[] { - muteIcon = new IconButton(), + muteIcon = new IconButton + { + Icon = FontAwesome.fa_volume_up, + Scale = new Vector2(2.0f), + Action = () => + { + if (IsMuted) + Unmute(); + else + Mute(); + }, + }, volumeMeterMaster = new VolumeMeter("Master"), volumeMeterEffect = new VolumeMeter("Effects"), volumeMeterMusic = new VolumeMeter("Music") } } }; - - muteIcon.Icon = FontAwesome.fa_volume_up; - muteIcon.Scale = new Vector2(2.0f); - muteIcon.Action = () => - { - if (IsMuted) - Unmute(); - else - Mute(); - }; } protected override void LoadComplete() From 9c09b33e4e75b49090fa7bf0679865c19cbcac02 Mon Sep 17 00:00:00 2001 From: aQaTL Date: Wed, 17 Jan 2018 23:17:59 +0100 Subject: [PATCH 09/27] Removed no longer used "lastVolume" field --- osu.Game/Graphics/UserInterface/Volume/VolumeMeter.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/osu.Game/Graphics/UserInterface/Volume/VolumeMeter.cs b/osu.Game/Graphics/UserInterface/Volume/VolumeMeter.cs index a1acb5d2ff..ef3702fdf3 100644 --- a/osu.Game/Graphics/UserInterface/Volume/VolumeMeter.cs +++ b/osu.Game/Graphics/UserInterface/Volume/VolumeMeter.cs @@ -18,8 +18,6 @@ namespace osu.Game.Graphics.UserInterface.Volume private readonly Box meterFill; public BindableDouble Bindable { get; } = new BindableDouble(); - private double lastVolume; - public VolumeMeter(string meterName) { Size = new Vector2(40, 180); From 4a85266fca02c4375fafc572fc2c524b08aa9643 Mon Sep 17 00:00:00 2001 From: aQaTL Date: Thu, 18 Jan 2018 17:23:02 +0100 Subject: [PATCH 10/27] Using BindableBool to mute the volume when it's value changes --- .../UserInterface/Volume/VolumeControl.cs | 39 ++++++++----------- osu.Game/OsuGame.cs | 2 - 2 files changed, 16 insertions(+), 25 deletions(-) diff --git a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs index 2f565eba22..e611c0dfd0 100644 --- a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs +++ b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs @@ -14,8 +14,6 @@ namespace osu.Game.Graphics.UserInterface.Volume { public class VolumeControl : OverlayContainer { - private AudioManager audio; - private readonly VolumeMeter volumeMeterMaster; private readonly IconButton muteIcon; @@ -42,13 +40,7 @@ namespace osu.Game.Graphics.UserInterface.Volume { Icon = FontAwesome.fa_volume_up, Scale = new Vector2(2.0f), - Action = () => - { - if (IsMuted) - Unmute(); - else - Mute(); - }, + Action = () => Adjust(GlobalAction.ToggleMute), }, volumeMeterMaster = new VolumeMeter("Master"), volumeMeterEffect = new VolumeMeter("Effects"), @@ -113,35 +105,36 @@ namespace osu.Game.Graphics.UserInterface.Volume private readonly BindableDouble muteBindable = new BindableDouble(); - public bool IsMuted { get; private set; } + private readonly BindableBool muted = new BindableBool(); + + public bool IsMuted => muted.Value; public void Mute() { - if (IsMuted) - return; - - audio.AddAdjustment(AdjustableProperty.Volume, muteBindable); - IsMuted = true; - muteIcon.Icon = FontAwesome.fa_volume_off; + muted.Value = true; } public void Unmute() { - if (!IsMuted) - return; - - audio.RemoveAdjustment(AdjustableProperty.Volume, muteBindable); - IsMuted = false; - muteIcon.Icon = FontAwesome.fa_volume_up; + muted.Value = false; } [BackgroundDependencyLoader] private void load(AudioManager audio) { - this.audio = audio; volumeMeterMaster.Bindable.BindTo(audio.Volume); volumeMeterEffect.Bindable.BindTo(audio.VolumeSample); volumeMeterMusic.Bindable.BindTo(audio.VolumeTrack); + + muted.ValueChanged += mute => + { + if (mute) + audio.AddAdjustment(AdjustableProperty.Volume, muteBindable); + else + audio.RemoveAdjustment(AdjustableProperty.Volume, muteBindable); + + muteIcon.Icon = mute ? FontAwesome.fa_volume_off : FontAwesome.fa_volume_up; + }; } private ScheduledDelegate popOutDelegate; diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs index 56cfffdeae..f1fb2a4f0a 100644 --- a/osu.Game/OsuGame.cs +++ b/osu.Game/OsuGame.cs @@ -405,9 +405,7 @@ namespace osu.Game { base.OnActivated(); if (IsLoaded && muteWhenInactive && !wasMuted) - { volume.Unmute(); - } } public bool OnReleased(GlobalAction action) => false; From c4feb67bceede170fa341a2fe9f56fc7f43c83ca Mon Sep 17 00:00:00 2001 From: aQaTL Date: Sat, 20 Jan 2018 11:45:04 +0100 Subject: [PATCH 11/27] Using field properties to set mute / unmute instead of separate methods --- .../UserInterface/Volume/VolumeControl.cs | 28 ++++++++----------- osu.Game/OsuGame.cs | 6 ++-- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs index e611c0dfd0..60242393ab 100644 --- a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs +++ b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs @@ -85,12 +85,8 @@ namespace osu.Game.Graphics.UserInterface.Volume volumeMeterMaster.Increase(); return true; case GlobalAction.ToggleMute: - if (State == Visibility.Hidden) - Show(); - if (IsMuted) - Unmute(); - else - Mute(); + Show(); + Muted = !Muted; return true; } @@ -107,16 +103,10 @@ namespace osu.Game.Graphics.UserInterface.Volume private readonly BindableBool muted = new BindableBool(); - public bool IsMuted => muted.Value; - - public void Mute() + public bool Muted { - muted.Value = true; - } - - public void Unmute() - { - muted.Value = false; + get => muted.Value; + set => muted.Value = value; } [BackgroundDependencyLoader] @@ -129,11 +119,15 @@ namespace osu.Game.Graphics.UserInterface.Volume muted.ValueChanged += mute => { if (mute) + { audio.AddAdjustment(AdjustableProperty.Volume, muteBindable); + muteIcon.Icon = FontAwesome.fa_volume_off; + } else + { audio.RemoveAdjustment(AdjustableProperty.Volume, muteBindable); - - muteIcon.Icon = mute ? FontAwesome.fa_volume_off : FontAwesome.fa_volume_up; + muteIcon.Icon = FontAwesome.fa_volume_up; + } }; } diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs index f1fb2a4f0a..b938595d57 100644 --- a/osu.Game/OsuGame.cs +++ b/osu.Game/OsuGame.cs @@ -396,8 +396,8 @@ namespace osu.Game base.OnDeactivated(); if (muteWhenInactive) { - wasMuted = volume.IsMuted; - volume.Mute(); + wasMuted = volume.Muted; + volume.Muted = true; } } @@ -405,7 +405,7 @@ namespace osu.Game { base.OnActivated(); if (IsLoaded && muteWhenInactive && !wasMuted) - volume.Unmute(); + volume.Muted = false; } public bool OnReleased(GlobalAction action) => false; From ad2df8d8dfdfc775098ae07725adaa03a00f47b0 Mon Sep 17 00:00:00 2001 From: Michael Manis Date: Sun, 21 Jan 2018 20:09:44 -0500 Subject: [PATCH 12/27] Fixed tilde-key crash at end of beatmap. --- osu.Game/Screens/Play/Player.cs | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index 8d26d63d41..d50f463c2c 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -88,6 +88,9 @@ namespace osu.Game.Screens.Play private bool loadedSuccessfully => RulesetContainer?.Objects.Any() == true; + private bool allowRestart = true; + private bool exited = false; + [BackgroundDependencyLoader] private void load(AudioManager audio, OsuConfigManager config, APIAccess api) { @@ -208,10 +211,12 @@ namespace osu.Game.Screens.Play new HotkeyRetryOverlay { Action = () => { - //we want to hide the hitrenderer immediately (looks better). - //we may be able to remove this once the mouse cursor trail is improved. - RulesetContainer?.Hide(); - Restart(); + if (allowRestart) { + //we want to hide the hitrenderer immediately (looks better). + //we may be able to remove this once the mouse cursor trail is improved. + RulesetContainer?.Hide(); + Restart(); + } }, } }; @@ -266,6 +271,7 @@ namespace osu.Game.Screens.Play public void Restart() { + exited = true; sampleRestart?.Play(); ValidForResume = false; RestartRequested?.Invoke(); @@ -288,6 +294,11 @@ namespace osu.Game.Screens.Play { onCompletionEvent = Schedule(delegate { + // This is here to mimic OsuStable behavior. It could be placed outside the delay timer, + // which would remove the need for the check on Push() below, and would make it impossible + // to quick-restart after hitting the last note. + allowRestart = false; + var score = new Score { Beatmap = Beatmap.Value.BeatmapInfo, @@ -295,7 +306,7 @@ namespace osu.Game.Screens.Play }; scoreProcessor.PopulateScore(score); score.User = RulesetContainer.Replay?.User ?? api.LocalUser.Value; - Push(new Results(score)); + if (!exited) Push(new Results(score)); }); } } From 806da2176051fa3748a3617a1e1fdf862a54e881 Mon Sep 17 00:00:00 2001 From: Michael Manis Date: Sun, 21 Jan 2018 20:24:19 -0500 Subject: [PATCH 13/27] Removed rreduntant initialization. --- osu.Game/Screens/Play/Player.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index d50f463c2c..2885427e88 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -89,7 +89,7 @@ namespace osu.Game.Screens.Play private bool loadedSuccessfully => RulesetContainer?.Objects.Any() == true; private bool allowRestart = true; - private bool exited = false; + private bool exited; [BackgroundDependencyLoader] private void load(AudioManager audio, OsuConfigManager config, APIAccess api) From 964c6da9a436319f69c7f67fc62a2bdfa0da2413 Mon Sep 17 00:00:00 2001 From: Michael Manis Date: Sun, 21 Jan 2018 22:00:18 -0500 Subject: [PATCH 14/27] Use IsCurrentScreen instead of a bool --- osu.Game/Screens/Play/Player.cs | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index 2885427e88..4f7f145ed0 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -89,7 +89,6 @@ namespace osu.Game.Screens.Play private bool loadedSuccessfully => RulesetContainer?.Objects.Any() == true; private bool allowRestart = true; - private bool exited; [BackgroundDependencyLoader] private void load(AudioManager audio, OsuConfigManager config, APIAccess api) @@ -271,7 +270,6 @@ namespace osu.Game.Screens.Play public void Restart() { - exited = true; sampleRestart?.Play(); ValidForResume = false; RestartRequested?.Invoke(); @@ -294,19 +292,19 @@ namespace osu.Game.Screens.Play { onCompletionEvent = Schedule(delegate { - // This is here to mimic OsuStable behavior. It could be placed outside the delay timer, - // which would remove the need for the check on Push() below, and would make it impossible - // to quick-restart after hitting the last note. - allowRestart = false; - - var score = new Score + if (IsCurrentScreen) { - Beatmap = Beatmap.Value.BeatmapInfo, - Ruleset = ruleset - }; - scoreProcessor.PopulateScore(score); - score.User = RulesetContainer.Replay?.User ?? api.LocalUser.Value; - if (!exited) Push(new Results(score)); + allowRestart = false; + + var score = new Score + { + Beatmap = Beatmap.Value.BeatmapInfo, + Ruleset = ruleset + }; + scoreProcessor.PopulateScore(score); + score.User = RulesetContainer.Replay?.User ?? api.LocalUser.Value; + Push(new Results(score)); + } }); } } From 530e0afa2c89acda8dc9cc26100501ebd015ba51 Mon Sep 17 00:00:00 2001 From: Michael Manis Date: Sun, 21 Jan 2018 22:27:15 -0500 Subject: [PATCH 15/27] Use IsCurrentScreen instead of a bool for both checks now. --- osu.Game/Screens/Play/Player.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index 4f7f145ed0..e29ff8edd3 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -88,8 +88,6 @@ namespace osu.Game.Screens.Play private bool loadedSuccessfully => RulesetContainer?.Objects.Any() == true; - private bool allowRestart = true; - [BackgroundDependencyLoader] private void load(AudioManager audio, OsuConfigManager config, APIAccess api) { @@ -210,7 +208,7 @@ namespace osu.Game.Screens.Play new HotkeyRetryOverlay { Action = () => { - if (allowRestart) { + if (IsCurrentScreen) { //we want to hide the hitrenderer immediately (looks better). //we may be able to remove this once the mouse cursor trail is improved. RulesetContainer?.Hide(); @@ -294,8 +292,6 @@ namespace osu.Game.Screens.Play { if (IsCurrentScreen) { - allowRestart = false; - var score = new Score { Beatmap = Beatmap.Value.BeatmapInfo, From 794ae5380a341b83feb61377f9710369211bfe0d Mon Sep 17 00:00:00 2001 From: Michael Manis Date: Mon, 22 Jan 2018 01:06:27 -0500 Subject: [PATCH 16/27] Intverted conditionals. --- osu-framework | 2 +- osu.Game/Screens/Play/Player.cs | 31 +++++++++++++++---------------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/osu-framework b/osu-framework index 26c01ca606..8f36ddab94 160000 --- a/osu-framework +++ b/osu-framework @@ -1 +1 @@ -Subproject commit 26c01ca6069296621f76d8ffbfe31ecf8074c687 +Subproject commit 8f36ddab946ff538620081ede7719461d4732b79 diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index e29ff8edd3..a53d598730 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -208,12 +208,12 @@ namespace osu.Game.Screens.Play new HotkeyRetryOverlay { Action = () => { - if (IsCurrentScreen) { - //we want to hide the hitrenderer immediately (looks better). - //we may be able to remove this once the mouse cursor trail is improved. - RulesetContainer?.Hide(); - Restart(); - } + if (!IsCurrentScreen) return; + + //we want to hide the hitrenderer immediately (looks better). + //we may be able to remove this once the mouse cursor trail is improved. + RulesetContainer?.Hide(); + Restart(); }, } }; @@ -290,17 +290,16 @@ namespace osu.Game.Screens.Play { onCompletionEvent = Schedule(delegate { - if (IsCurrentScreen) + if (!IsCurrentScreen) return; + + var score = new Score { - var score = new Score - { - Beatmap = Beatmap.Value.BeatmapInfo, - Ruleset = ruleset - }; - scoreProcessor.PopulateScore(score); - score.User = RulesetContainer.Replay?.User ?? api.LocalUser.Value; - Push(new Results(score)); - } + Beatmap = Beatmap.Value.BeatmapInfo, + Ruleset = ruleset + }; + scoreProcessor.PopulateScore(score); + score.User = RulesetContainer.Replay?.User ?? api.LocalUser.Value; + Push(new Results(score)); }); } } From 57cd50c45ee2d45f2ba9fb6804cce7acdc219066 Mon Sep 17 00:00:00 2001 From: smoogipoo Date: Thu, 25 Jan 2018 17:39:10 +0900 Subject: [PATCH 17/27] Reorder the way input is handled for replays Fixes https://github.com/ppy/osu/issues/1625 . --- .../Objects/Drawables/DrawableHitObject.cs | 2 ++ osu.Game/Rulesets/UI/RulesetInputManager.cs | 18 ++++++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs index 2db02724ed..e4f8124bce 100644 --- a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs +++ b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs @@ -71,6 +71,8 @@ namespace osu.Game.Rulesets.Objects.Drawables public override bool HandleKeyboardInput => Interactive; public override bool HandleMouseInput => Interactive; + public override bool MaskingAffectsInput => false; + public override bool RemoveWhenNotAlive => false; public override bool RemoveCompletedTransforms => false; protected override bool RequiresChildrenUpdate => true; diff --git a/osu.Game/Rulesets/UI/RulesetInputManager.cs b/osu.Game/Rulesets/UI/RulesetInputManager.cs index 223586a959..e32b38a013 100644 --- a/osu.Game/Rulesets/UI/RulesetInputManager.cs +++ b/osu.Game/Rulesets/UI/RulesetInputManager.cs @@ -136,9 +136,20 @@ namespace osu.Game.Rulesets.UI int loops = 0; while (validState && requireMoreUpdateLoops && loops++ < max_catch_up_updates_per_frame) + { if (!base.UpdateSubTree()) return false; + if (isAttached) + { + // When handling replay input, we need to consider the possibility of fast-forwarding, which may cause the clock to be updated + // to a point very far into the future, then playing a frame at that time. In such a case, lifetime MUST be updated before + // input is handled. This is why base.Update is not called from the derived Update when handling replay input, and is instead + // called manually at the correct time here. + base.Update(); + } + } + return true; } @@ -173,8 +184,11 @@ namespace osu.Game.Rulesets.UI // to ensure that the its time is valid for our children before input is processed Clock.ProcessFrame(); - // Process input - base.Update(); + if (!isAttached) + { + // For non-replay input handling, this provides equivalent input ordering as if Update was not overridden + base.Update(); + } } #endregion From 92df704fbd235f4637f6f31888f8bba1c9faebe8 Mon Sep 17 00:00:00 2001 From: smoogipoo Date: Thu, 25 Jan 2018 21:37:38 +0900 Subject: [PATCH 18/27] Fix up taiko not having any important frames --- .../Replays/TaikoAutoGenerator.cs | 14 +++++++------- .../Replays/TaikoReplayFrame.cs | 17 +++++++++++++++++ .../osu.Game.Rulesets.Taiko.csproj | 1 + 3 files changed, 25 insertions(+), 7 deletions(-) create mode 100644 osu.Game.Rulesets.Taiko/Replays/TaikoReplayFrame.cs diff --git a/osu.Game.Rulesets.Taiko/Replays/TaikoAutoGenerator.cs b/osu.Game.Rulesets.Taiko/Replays/TaikoAutoGenerator.cs index c1fe2c13a8..002159439d 100644 --- a/osu.Game.Rulesets.Taiko/Replays/TaikoAutoGenerator.cs +++ b/osu.Game.Rulesets.Taiko/Replays/TaikoAutoGenerator.cs @@ -35,8 +35,8 @@ namespace osu.Game.Rulesets.Taiko.Replays { bool hitButton = true; - Frames.Add(new ReplayFrame(-100000, null, null, ReplayButtonState.None)); - Frames.Add(new ReplayFrame(Beatmap.HitObjects[0].StartTime - 1000, null, null, ReplayButtonState.None)); + Frames.Add(new TaikoReplayFrame(-100000, ReplayButtonState.None)); + Frames.Add(new TaikoReplayFrame(Beatmap.HitObjects[0].StartTime - 1000, ReplayButtonState.None)); for (int i = 0; i < Beatmap.HitObjects.Count; i++) { @@ -76,7 +76,7 @@ namespace osu.Game.Rulesets.Taiko.Replays break; } - Frames.Add(new ReplayFrame(j, null, null, button)); + Frames.Add(new TaikoReplayFrame(j, button)); d = (d + 1) % 4; if (++count == req) break; @@ -86,7 +86,7 @@ namespace osu.Game.Rulesets.Taiko.Replays { foreach (var tick in drumRoll.NestedHitObjects.OfType()) { - Frames.Add(new ReplayFrame(tick.StartTime, null, null, hitButton ? ReplayButtonState.Right1 : ReplayButtonState.Right2)); + Frames.Add(new TaikoReplayFrame(tick.StartTime, hitButton ? ReplayButtonState.Right1 : ReplayButtonState.Right2)); hitButton = !hitButton; } } @@ -107,18 +107,18 @@ namespace osu.Game.Rulesets.Taiko.Replays button = hitButton ? ReplayButtonState.Left1 : ReplayButtonState.Left2; } - Frames.Add(new ReplayFrame(h.StartTime, null, null, button)); + Frames.Add(new TaikoReplayFrame(h.StartTime, button)); } else throw new InvalidOperationException("Unknown hit object type."); - Frames.Add(new ReplayFrame(endTime + KEY_UP_DELAY, null, null, ReplayButtonState.None)); + Frames.Add(new TaikoReplayFrame(endTime + KEY_UP_DELAY, ReplayButtonState.None)); if (i < Beatmap.HitObjects.Count - 1) { double waitTime = Beatmap.HitObjects[i + 1].StartTime - 1000; if (waitTime > endTime) - Frames.Add(new ReplayFrame(waitTime, null, null, ReplayButtonState.None)); + Frames.Add(new TaikoReplayFrame(waitTime, ReplayButtonState.None)); } hitButton = !hitButton; diff --git a/osu.Game.Rulesets.Taiko/Replays/TaikoReplayFrame.cs b/osu.Game.Rulesets.Taiko/Replays/TaikoReplayFrame.cs new file mode 100644 index 0000000000..0c60cdc109 --- /dev/null +++ b/osu.Game.Rulesets.Taiko/Replays/TaikoReplayFrame.cs @@ -0,0 +1,17 @@ +// Copyright (c) 2007-2018 ppy Pty Ltd . +// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE + +using osu.Game.Rulesets.Replays; + +namespace osu.Game.Rulesets.Taiko.Replays +{ + public class TaikoReplayFrame : ReplayFrame + { + public override bool IsImportant => MouseLeft || MouseRight; + + public TaikoReplayFrame(double time, ReplayButtonState buttons) + : base(time, null, null, buttons) + { + } + } +} diff --git a/osu.Game.Rulesets.Taiko/osu.Game.Rulesets.Taiko.csproj b/osu.Game.Rulesets.Taiko/osu.Game.Rulesets.Taiko.csproj index 36ac9384cf..7fb764fd0b 100644 --- a/osu.Game.Rulesets.Taiko/osu.Game.Rulesets.Taiko.csproj +++ b/osu.Game.Rulesets.Taiko/osu.Game.Rulesets.Taiko.csproj @@ -91,6 +91,7 @@ + From 0a505dde2e73b89ffeb259090e6e2d577a3c80d4 Mon Sep 17 00:00:00 2001 From: smoogipoo Date: Fri, 26 Jan 2018 14:47:16 +0900 Subject: [PATCH 19/27] Remove MaskingAffectsInput override --- osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs index e4f8124bce..2db02724ed 100644 --- a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs +++ b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs @@ -71,8 +71,6 @@ namespace osu.Game.Rulesets.Objects.Drawables public override bool HandleKeyboardInput => Interactive; public override bool HandleMouseInput => Interactive; - public override bool MaskingAffectsInput => false; - public override bool RemoveWhenNotAlive => false; public override bool RemoveCompletedTransforms => false; protected override bool RequiresChildrenUpdate => true; From 042a34e1c23b263bd3d50f24e29e156ba8afb29b Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 31 Jan 2018 16:10:48 +0900 Subject: [PATCH 20/27] Add migration to ensure database aligns to changed enum --- .../20180131154205_AddMuteBinding.cs | 25 +++++++++++++++++++ osu.Game/osu.Game.csproj | 1 + 2 files changed, 26 insertions(+) create mode 100644 osu.Game/Migrations/20180131154205_AddMuteBinding.cs diff --git a/osu.Game/Migrations/20180131154205_AddMuteBinding.cs b/osu.Game/Migrations/20180131154205_AddMuteBinding.cs new file mode 100644 index 0000000000..6948ad03da --- /dev/null +++ b/osu.Game/Migrations/20180131154205_AddMuteBinding.cs @@ -0,0 +1,25 @@ +using Microsoft.EntityFrameworkCore.Migrations; +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore.Infrastructure; +using osu.Game.Database; +using osu.Game.Input.Bindings; + +namespace osu.Game.Migrations +{ + [DbContext(typeof(OsuDbContext))] + [Migration("20180131154205_AddMuteBinding")] + public partial class AddMuteBinding : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.Sql($"UPDATE KeyBinding SET Action = Action + 1 WHERE RulesetID IS NULL AND Variant IS NULL AND Action >= {(int)GlobalAction.ToggleMute}"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.Sql("DELETE FROM KeyBinding WHERE RulesetID IS NULL AND Variant IS NULL AND Action = 8"); + migrationBuilder.Sql($"UPDATE KeyBinding SET Action = Action - 1 WHERE RulesetID IS NULL AND Variant IS NULL AND Action > {(int)GlobalAction.ToggleMute}"); + } + } +} diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj index 4e048d60b9..05cf61c23c 100644 --- a/osu.Game/osu.Game.csproj +++ b/osu.Game/osu.Game.csproj @@ -280,6 +280,7 @@ 20180125143340_Settings.cs + From 5a99651561c97d2b607b69a7fd9485b17ab66817 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 31 Jan 2018 16:10:55 +0900 Subject: [PATCH 21/27] Remove unnecessary arrays --- osu.Game/Input/Bindings/GlobalActionContainer.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/osu.Game/Input/Bindings/GlobalActionContainer.cs b/osu.Game/Input/Bindings/GlobalActionContainer.cs index 918a4e374a..17ec2af4b9 100644 --- a/osu.Game/Input/Bindings/GlobalActionContainer.cs +++ b/osu.Game/Input/Bindings/GlobalActionContainer.cs @@ -29,10 +29,10 @@ namespace osu.Game.Input.Bindings new KeyBinding(new[] { InputKey.Control, InputKey.Alt, InputKey.R }, GlobalAction.ResetInputSettings), new KeyBinding(new[] { InputKey.Control, InputKey.T }, GlobalAction.ToggleToolbar), new KeyBinding(new[] { InputKey.Control, InputKey.O }, GlobalAction.ToggleSettings), - new KeyBinding(new[] { InputKey.Up }, GlobalAction.IncreaseVolume), - new KeyBinding(new[] { InputKey.MouseWheelUp }, GlobalAction.IncreaseVolume), - new KeyBinding(new[] { InputKey.Down }, GlobalAction.DecreaseVolume), - new KeyBinding(new[] { InputKey.MouseWheelDown }, GlobalAction.DecreaseVolume), + new KeyBinding(InputKey.Up, GlobalAction.IncreaseVolume), + new KeyBinding(InputKey.MouseWheelUp, GlobalAction.IncreaseVolume), + new KeyBinding(InputKey.Down, GlobalAction.DecreaseVolume), + new KeyBinding(InputKey.MouseWheelDown, GlobalAction.DecreaseVolume), new KeyBinding(InputKey.F4, GlobalAction.ToggleMute), }; From 2865dd3a10404408145ffe0a01caeef9734247a5 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 31 Jan 2018 16:20:01 +0900 Subject: [PATCH 22/27] Replace missed hardcoded int with enum reference --- osu.Game/Migrations/20180131154205_AddMuteBinding.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Migrations/20180131154205_AddMuteBinding.cs b/osu.Game/Migrations/20180131154205_AddMuteBinding.cs index 6948ad03da..fc1f2fff55 100644 --- a/osu.Game/Migrations/20180131154205_AddMuteBinding.cs +++ b/osu.Game/Migrations/20180131154205_AddMuteBinding.cs @@ -18,7 +18,7 @@ namespace osu.Game.Migrations protected override void Down(MigrationBuilder migrationBuilder) { - migrationBuilder.Sql("DELETE FROM KeyBinding WHERE RulesetID IS NULL AND Variant IS NULL AND Action = 8"); + migrationBuilder.Sql($"DELETE FROM KeyBinding WHERE RulesetID IS NULL AND Variant IS NULL AND Action = {(int)GlobalAction.ToggleMute}"); migrationBuilder.Sql($"UPDATE KeyBinding SET Action = Action - 1 WHERE RulesetID IS NULL AND Variant IS NULL AND Action > {(int)GlobalAction.ToggleMute}"); } } From 97ae44f23c5b694249ad33acd27c3200a9871346 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 31 Jan 2018 16:56:26 +0900 Subject: [PATCH 23/27] Remove outwards exposure of mute property --- osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs index 60242393ab..cfc8b81420 100644 --- a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs +++ b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs @@ -86,7 +86,7 @@ namespace osu.Game.Graphics.UserInterface.Volume return true; case GlobalAction.ToggleMute: Show(); - Muted = !Muted; + muted.Toggle(); return true; } @@ -103,12 +103,6 @@ namespace osu.Game.Graphics.UserInterface.Volume private readonly BindableBool muted = new BindableBool(); - public bool Muted - { - get => muted.Value; - set => muted.Value = value; - } - [BackgroundDependencyLoader] private void load(AudioManager audio) { From 86f5c9d6f140ce3ee117fdf56797766b4cce315d Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 31 Jan 2018 16:57:26 +0900 Subject: [PATCH 24/27] Add inactive volume ducking, rather than outright mute --- osu.Game/Configuration/OsuConfigManager.cs | 4 ++-- osu.Game/OsuGame.cs | 16 ++++++---------- .../Settings/Sections/Audio/VolumeSettings.cs | 2 +- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/osu.Game/Configuration/OsuConfigManager.cs b/osu.Game/Configuration/OsuConfigManager.cs index 230aabb2cd..c33dd91330 100644 --- a/osu.Game/Configuration/OsuConfigManager.cs +++ b/osu.Game/Configuration/OsuConfigManager.cs @@ -39,7 +39,7 @@ namespace osu.Game.Configuration }; // Audio - Set(OsuSetting.MuteWhenInactive, false); + Set(OsuSetting.VolumeInactive, 0.25, 0, 1, 0.01); Set(OsuSetting.MenuVoice, true); Set(OsuSetting.MenuMusic, true); @@ -103,7 +103,7 @@ namespace osu.Game.Configuration MouseDisableButtons, MouseDisableWheel, AudioOffset, - MuteWhenInactive, + VolumeInactive, MenuMusic, MenuVoice, CursorRotation, diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs index f1914b53b5..fbbc14dd5e 100644 --- a/osu.Game/OsuGame.cs +++ b/osu.Game/OsuGame.cs @@ -19,6 +19,7 @@ using OpenTK; using System.Linq; using System.Threading; using System.Threading.Tasks; +using osu.Framework.Audio; using osu.Framework.Input.Bindings; using osu.Framework.Platform; using osu.Framework.Threading; @@ -122,7 +123,7 @@ namespace osu.Game Ruleset.Value = RulesetStore.GetRuleset(configRuleset.Value) ?? RulesetStore.AvailableRulesets.First(); Ruleset.ValueChanged += r => configRuleset.Value = r.ID ?? 0; - muteWhenInactive = LocalConfig.GetBindable(OsuSetting.MuteWhenInactive); + LocalConfig.BindWith(OsuSetting.VolumeInactive, inactiveDuckVolume); } private ScheduledDelegate scoreLoad; @@ -400,24 +401,19 @@ namespace osu.Game return false; } - private Bindable muteWhenInactive = new Bindable(); - private bool wasMuted; + private readonly BindableDouble inactiveDuckVolume = new BindableDouble(); protected override void OnDeactivated() { base.OnDeactivated(); - if (muteWhenInactive) - { - wasMuted = volume.Muted; - volume.Muted = true; - } + Audio.AddAdjustment(AdjustableProperty.Volume, inactiveDuckVolume); } protected override void OnActivated() { base.OnActivated(); - if (IsLoaded && muteWhenInactive && !wasMuted) - volume.Muted = false; + Audio.RemoveAdjustment(AdjustableProperty.Volume, inactiveDuckVolume); + } public bool OnReleased(GlobalAction action) => false; diff --git a/osu.Game/Overlays/Settings/Sections/Audio/VolumeSettings.cs b/osu.Game/Overlays/Settings/Sections/Audio/VolumeSettings.cs index 01bcf989dc..92ee01dd7a 100644 --- a/osu.Game/Overlays/Settings/Sections/Audio/VolumeSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/Audio/VolumeSettings.cs @@ -18,9 +18,9 @@ namespace osu.Game.Overlays.Settings.Sections.Audio Children = new Drawable[] { new SettingsSlider { LabelText = "Master", Bindable = audio.Volume, KeyboardStep = 0.1f }, + new SettingsSlider { LabelText = "Master (Window Inactive)", Bindable = config.GetBindable(OsuSetting.VolumeInactive), KeyboardStep = 0.1f }, new SettingsSlider { LabelText = "Effect", Bindable = audio.VolumeSample, KeyboardStep = 0.1f }, new SettingsSlider { LabelText = "Music", Bindable = audio.VolumeTrack, KeyboardStep = 0.1f }, - new SettingsCheckbox { LabelText = "Mute osu! when inactive", Bindable = config.GetBindable(OsuSetting.MuteWhenInactive) } }; } } From 93ffa1f8a2a1920e321522302dac97849db73926 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 31 Jan 2018 17:36:53 +0900 Subject: [PATCH 25/27] Fix button alignment and animation --- osu.Game/Graphics/UserInterface/IconButton.cs | 4 ++-- .../Graphics/UserInterface/Volume/VolumeControl.cs | 13 +++++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/osu.Game/Graphics/UserInterface/IconButton.cs b/osu.Game/Graphics/UserInterface/IconButton.cs index bcf6ab92b6..5b266d9a59 100644 --- a/osu.Game/Graphics/UserInterface/IconButton.cs +++ b/osu.Game/Graphics/UserInterface/IconButton.cs @@ -15,7 +15,7 @@ namespace osu.Game.Graphics.UserInterface { public class IconButton : OsuClickableContainer { - private const float button_size = 30; + public const float BUTTON_SIZE = 30; private Color4? flashColour; /// @@ -106,7 +106,7 @@ namespace osu.Game.Graphics.UserInterface { Origin = Anchor.Centre, Anchor = Anchor.Centre, - Size = new Vector2(button_size), + Size = new Vector2(BUTTON_SIZE), CornerRadius = 5, Masking = true, EdgeEffect = new EdgeEffectParameters diff --git a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs index cfc8b81420..40c46d4ff8 100644 --- a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs +++ b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs @@ -36,11 +36,16 @@ namespace osu.Game.Graphics.UserInterface.Volume Spacing = new Vector2(15, 0), Children = new Drawable[] { - muteIcon = new IconButton + new Container { - Icon = FontAwesome.fa_volume_up, - Scale = new Vector2(2.0f), - Action = () => Adjust(GlobalAction.ToggleMute), + Size = new Vector2(IconButton.BUTTON_SIZE), + Child = muteIcon = new IconButton + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + Icon = FontAwesome.fa_volume_up, + Action = () => Adjust(GlobalAction.ToggleMute), + } }, volumeMeterMaster = new VolumeMeter("Master"), volumeMeterEffect = new VolumeMeter("Effects"), From 47b92f3d1d6433b766d872669ec6691a63f73455 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 31 Jan 2018 18:00:44 +0900 Subject: [PATCH 26/27] Fix mute button not prolonging volume control display --- .../UserInterface/Volume/VolumeControl.cs | 24 +++++++------------ 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs index 40c46d4ff8..ccf70af6ed 100644 --- a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs +++ b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs @@ -59,18 +59,10 @@ namespace osu.Game.Graphics.UserInterface.Volume { base.LoadComplete(); - volumeMeterMaster.Bindable.ValueChanged += volumeChanged; - volumeMeterEffect.Bindable.ValueChanged += volumeChanged; - volumeMeterMusic.Bindable.ValueChanged += volumeChanged; - } - - protected override void Dispose(bool isDisposing) - { - base.Dispose(isDisposing); - - volumeMeterMaster.Bindable.ValueChanged -= volumeChanged; - volumeMeterEffect.Bindable.ValueChanged -= volumeChanged; - volumeMeterMusic.Bindable.ValueChanged -= volumeChanged; + volumeMeterMaster.Bindable.ValueChanged += _ => settingChanged(); + volumeMeterEffect.Bindable.ValueChanged += _ => settingChanged(); + volumeMeterMusic.Bindable.ValueChanged += _ => settingChanged(); + muted.ValueChanged += _ => settingChanged(); } public bool Adjust(GlobalAction action) @@ -98,13 +90,13 @@ namespace osu.Game.Graphics.UserInterface.Volume return false; } - private void volumeChanged(double newVolume) + private void settingChanged() { Show(); schedulePopOut(); } - private readonly BindableDouble muteBindable = new BindableDouble(); + private readonly BindableDouble muteAdjustment = new BindableDouble(); private readonly BindableBool muted = new BindableBool(); @@ -119,12 +111,12 @@ namespace osu.Game.Graphics.UserInterface.Volume { if (mute) { - audio.AddAdjustment(AdjustableProperty.Volume, muteBindable); + audio.AddAdjustment(AdjustableProperty.Volume, muteAdjustment); muteIcon.Icon = FontAwesome.fa_volume_off; } else { - audio.RemoveAdjustment(AdjustableProperty.Volume, muteBindable); + audio.RemoveAdjustment(AdjustableProperty.Volume, muteAdjustment); muteIcon.Icon = FontAwesome.fa_volume_up; } }; From fef69cea04049e376a0e29973fb9189cc859aca0 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 31 Jan 2018 18:11:38 +0900 Subject: [PATCH 27/27] Revert "Add volume ducking" This reverts commit 01325de3a2897a24b2ba0f585d7e976d0fb44b70. --- osu.Game/Configuration/OsuConfigManager.cs | 3 --- osu.Game/OsuGame.cs | 18 ------------------ .../Settings/Sections/Audio/VolumeSettings.cs | 4 +--- 3 files changed, 1 insertion(+), 24 deletions(-) diff --git a/osu.Game/Configuration/OsuConfigManager.cs b/osu.Game/Configuration/OsuConfigManager.cs index c33dd91330..33810c9712 100644 --- a/osu.Game/Configuration/OsuConfigManager.cs +++ b/osu.Game/Configuration/OsuConfigManager.cs @@ -39,8 +39,6 @@ namespace osu.Game.Configuration }; // Audio - Set(OsuSetting.VolumeInactive, 0.25, 0, 1, 0.01); - Set(OsuSetting.MenuVoice, true); Set(OsuSetting.MenuMusic, true); @@ -103,7 +101,6 @@ namespace osu.Game.Configuration MouseDisableButtons, MouseDisableWheel, AudioOffset, - VolumeInactive, MenuMusic, MenuVoice, CursorRotation, diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs index fbbc14dd5e..bd71d37f97 100644 --- a/osu.Game/OsuGame.cs +++ b/osu.Game/OsuGame.cs @@ -19,7 +19,6 @@ using OpenTK; using System.Linq; using System.Threading; using System.Threading.Tasks; -using osu.Framework.Audio; using osu.Framework.Input.Bindings; using osu.Framework.Platform; using osu.Framework.Threading; @@ -122,8 +121,6 @@ namespace osu.Game configRuleset = LocalConfig.GetBindable(OsuSetting.Ruleset); Ruleset.Value = RulesetStore.GetRuleset(configRuleset.Value) ?? RulesetStore.AvailableRulesets.First(); Ruleset.ValueChanged += r => configRuleset.Value = r.ID ?? 0; - - LocalConfig.BindWith(OsuSetting.VolumeInactive, inactiveDuckVolume); } private ScheduledDelegate scoreLoad; @@ -401,21 +398,6 @@ namespace osu.Game return false; } - private readonly BindableDouble inactiveDuckVolume = new BindableDouble(); - - protected override void OnDeactivated() - { - base.OnDeactivated(); - Audio.AddAdjustment(AdjustableProperty.Volume, inactiveDuckVolume); - } - - protected override void OnActivated() - { - base.OnActivated(); - Audio.RemoveAdjustment(AdjustableProperty.Volume, inactiveDuckVolume); - - } - public bool OnReleased(GlobalAction action) => false; private Container mainContent; diff --git a/osu.Game/Overlays/Settings/Sections/Audio/VolumeSettings.cs b/osu.Game/Overlays/Settings/Sections/Audio/VolumeSettings.cs index 92ee01dd7a..40b9ff069b 100644 --- a/osu.Game/Overlays/Settings/Sections/Audio/VolumeSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/Audio/VolumeSettings.cs @@ -4,7 +4,6 @@ using osu.Framework.Allocation; using osu.Framework.Audio; using osu.Framework.Graphics; -using osu.Game.Configuration; namespace osu.Game.Overlays.Settings.Sections.Audio { @@ -13,12 +12,11 @@ namespace osu.Game.Overlays.Settings.Sections.Audio protected override string Header => "Volume"; [BackgroundDependencyLoader] - private void load(AudioManager audio, OsuConfigManager config) + private void load(AudioManager audio) { Children = new Drawable[] { new SettingsSlider { LabelText = "Master", Bindable = audio.Volume, KeyboardStep = 0.1f }, - new SettingsSlider { LabelText = "Master (Window Inactive)", Bindable = config.GetBindable(OsuSetting.VolumeInactive), KeyboardStep = 0.1f }, new SettingsSlider { LabelText = "Effect", Bindable = audio.VolumeSample, KeyboardStep = 0.1f }, new SettingsSlider { LabelText = "Music", Bindable = audio.VolumeTrack, KeyboardStep = 0.1f }, };