mirror of
https://github.com/ppy/osu.git
synced 2024-12-15 18:33:22 +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:
commit
f44e55c7f5
@ -83,8 +83,6 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
|
||||
|
||||
private SkinnableSound spinningSample;
|
||||
|
||||
private const float minimum_volume = 0.0001f;
|
||||
|
||||
protected override void LoadSamples()
|
||||
{
|
||||
base.LoadSamples();
|
||||
@ -101,7 +99,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
|
||||
|
||||
AddInternal(spinningSample = new SkinnableSound(clone)
|
||||
{
|
||||
Volume = { Value = minimum_volume },
|
||||
Volume = { Value = 0 },
|
||||
Looping = true,
|
||||
});
|
||||
}
|
||||
@ -119,7 +117,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
|
||||
}
|
||||
else
|
||||
{
|
||||
spinningSample?.VolumeTo(minimum_volume, 200).Finally(_ => spinningSample.Stop());
|
||||
spinningSample?.VolumeTo(0, 200).Finally(_ => spinningSample.Stop());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -26,8 +26,6 @@ namespace osu.Game.Screens.Play
|
||||
|
||||
protected override Action BackAction => () => InternalButtons.Children.First().Click();
|
||||
|
||||
private const float minimum_volume = 0.0001f;
|
||||
|
||||
[BackgroundDependencyLoader]
|
||||
private void load(OsuColour colours)
|
||||
{
|
||||
@ -38,10 +36,8 @@ namespace osu.Game.Screens.Play
|
||||
AddInternal(pauseLoop = new SkinnableSound(new SampleInfo("pause-loop"))
|
||||
{
|
||||
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()
|
||||
@ -56,7 +52,7 @@ namespace osu.Game.Screens.Play
|
||||
{
|
||||
base.PopOut();
|
||||
|
||||
pauseLoop.VolumeTo(minimum_volume, TRANSITION_DURATION, Easing.OutQuad).Finally(_ => pauseLoop.Stop());
|
||||
pauseLoop.VolumeTo(0, TRANSITION_DURATION, Easing.OutQuad).Finally(_ => pauseLoop.Stop());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -27,6 +27,16 @@ namespace osu.Game.Skinning
|
||||
public override bool RemoveWhenNotAlive => 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;
|
||||
|
||||
public SkinnableSound(ISampleInfo hitSamples)
|
||||
@ -86,7 +96,7 @@ namespace osu.Game.Skinning
|
||||
{
|
||||
samplesContainer.ForEach(c =>
|
||||
{
|
||||
if (c.AggregateVolume.Value > 0)
|
||||
if (PlayWhenZeroVolume || c.AggregateVolume.Value > 0)
|
||||
c.Play();
|
||||
});
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user