1
0
mirror of https://github.com/ppy/osu.git synced 2024-12-15 23:03:21 +08:00

Merge pull request #9793 from peppy/fix-skinnable-sound-mute

Add more resilient logic for whether to avoid playing SkinnableSound on no volume
This commit is contained in:
Dan Balasescu 2020-08-14 19:33:34 +09:00 committed by GitHub
commit f44e55c7f5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 11 deletions

View File

@ -83,8 +83,6 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
private SkinnableSound spinningSample; private SkinnableSound spinningSample;
private const float minimum_volume = 0.0001f;
protected override void LoadSamples() protected override void LoadSamples()
{ {
base.LoadSamples(); base.LoadSamples();
@ -101,7 +99,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
AddInternal(spinningSample = new SkinnableSound(clone) AddInternal(spinningSample = new SkinnableSound(clone)
{ {
Volume = { Value = minimum_volume }, Volume = { Value = 0 },
Looping = true, Looping = true,
}); });
} }
@ -119,7 +117,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
} }
else else
{ {
spinningSample?.VolumeTo(minimum_volume, 200).Finally(_ => spinningSample.Stop()); spinningSample?.VolumeTo(0, 200).Finally(_ => spinningSample.Stop());
} }
} }

View File

@ -26,8 +26,6 @@ namespace osu.Game.Screens.Play
protected override Action BackAction => () => InternalButtons.Children.First().Click(); protected override Action BackAction => () => InternalButtons.Children.First().Click();
private const float minimum_volume = 0.0001f;
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load(OsuColour colours) private void load(OsuColour colours)
{ {
@ -38,10 +36,8 @@ namespace osu.Game.Screens.Play
AddInternal(pauseLoop = new SkinnableSound(new SampleInfo("pause-loop")) AddInternal(pauseLoop = new SkinnableSound(new SampleInfo("pause-loop"))
{ {
Looping = true, Looping = true,
Volume = { Value = 0 }
}); });
// SkinnableSound only plays a sound if its aggregate volume is > 0, so the volume must be turned up before playing it
pauseLoop.VolumeTo(minimum_volume);
} }
protected override void PopIn() protected override void PopIn()
@ -56,7 +52,7 @@ namespace osu.Game.Screens.Play
{ {
base.PopOut(); base.PopOut();
pauseLoop.VolumeTo(minimum_volume, TRANSITION_DURATION, Easing.OutQuad).Finally(_ => pauseLoop.Stop()); pauseLoop.VolumeTo(0, TRANSITION_DURATION, Easing.OutQuad).Finally(_ => pauseLoop.Stop());
} }
} }
} }

View File

@ -27,6 +27,16 @@ namespace osu.Game.Skinning
public override bool RemoveWhenNotAlive => false; public override bool RemoveWhenNotAlive => false;
public override bool RemoveCompletedTransforms => false; public override bool RemoveCompletedTransforms => false;
/// <summary>
/// Whether to play the underlying sample when aggregate volume is zero.
/// Note that this is checked at the point of calling <see cref="Play"/>; changing the volume post-play will not begin playback.
/// Defaults to false unless <see cref="Looping"/>.
/// </summary>
/// <remarks>
/// Can serve as an optimisation if it is known ahead-of-time that this behaviour is allowed in a given use case.
/// </remarks>
protected bool PlayWhenZeroVolume => Looping;
private readonly AudioContainer<DrawableSample> samplesContainer; private readonly AudioContainer<DrawableSample> samplesContainer;
public SkinnableSound(ISampleInfo hitSamples) public SkinnableSound(ISampleInfo hitSamples)
@ -86,7 +96,7 @@ namespace osu.Game.Skinning
{ {
samplesContainer.ForEach(c => samplesContainer.ForEach(c =>
{ {
if (c.AggregateVolume.Value > 0) if (PlayWhenZeroVolume || c.AggregateVolume.Value > 0)
c.Play(); c.Play();
}); });
} }