mirror of
https://github.com/ppy/osu.git
synced 2025-02-13 15:03:13 +08:00
Fix editor playing too many sounds when user performs a manual seek during playback
This commit is contained in:
parent
30700ee68b
commit
4457648b1c
@ -234,7 +234,7 @@ namespace osu.Game.Screens.Edit
|
||||
AddInternal(editorBeatmap = new EditorBeatmap(playableBeatmap, loadableBeatmap.GetSkin(), loadableBeatmap.BeatmapInfo));
|
||||
dependencies.CacheAs(editorBeatmap);
|
||||
|
||||
editorBeatmap.UpdateInProgress.BindValueChanged(updateInProgress);
|
||||
editorBeatmap.UpdateInProgress.BindValueChanged(_ => updateSampleDisabledState());
|
||||
|
||||
canSave = editorBeatmap.BeatmapInfo.Ruleset.CreateInstance() is ILegacyRuleset;
|
||||
|
||||
@ -659,7 +659,7 @@ namespace osu.Game.Screens.Edit
|
||||
|
||||
if (isNewBeatmap || HasUnsavedChanges)
|
||||
{
|
||||
samplePlaybackDisabled.Value = true;
|
||||
updateSampleDisabledState();
|
||||
dialogOverlay?.Push(new PromptForSaveDialog(confirmExit, confirmExitWithSave, cancelExit));
|
||||
return true;
|
||||
}
|
||||
@ -729,27 +729,6 @@ namespace osu.Game.Screens.Edit
|
||||
this.Exit();
|
||||
}
|
||||
|
||||
#region Mute from update application
|
||||
|
||||
private ScheduledDelegate temporaryMuteRestorationDelegate;
|
||||
private bool temporaryMuteFromUpdateInProgress;
|
||||
|
||||
private void updateInProgress(ValueChangedEvent<bool> obj)
|
||||
{
|
||||
temporaryMuteFromUpdateInProgress = true;
|
||||
updateSampleDisabledState();
|
||||
|
||||
// Debounce is arbitrarily high enough to avoid flip-flopping the value each other frame.
|
||||
temporaryMuteRestorationDelegate?.Cancel();
|
||||
temporaryMuteRestorationDelegate = Scheduler.AddDelayed(() =>
|
||||
{
|
||||
temporaryMuteFromUpdateInProgress = false;
|
||||
updateSampleDisabledState();
|
||||
}, 50);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Clipboard support
|
||||
|
||||
private EditorMenuItem cutMenuItem;
|
||||
@ -883,11 +862,28 @@ namespace osu.Game.Screens.Edit
|
||||
}
|
||||
}
|
||||
|
||||
[CanBeNull]
|
||||
private ScheduledDelegate playbackDisabledDebounce;
|
||||
|
||||
private void updateSampleDisabledState()
|
||||
{
|
||||
samplePlaybackDisabled.Value = clock.SeekingOrStopped.Value
|
||||
bool shouldDisableSamples = clock.SeekingOrStopped.Value
|
||||
|| currentScreen is not ComposeScreen
|
||||
|| temporaryMuteFromUpdateInProgress;
|
||||
|| editorBeatmap.UpdateInProgress.Value
|
||||
|| dialogOverlay?.CurrentDialog != null;
|
||||
|
||||
playbackDisabledDebounce?.Cancel();
|
||||
|
||||
if (shouldDisableSamples)
|
||||
{
|
||||
samplePlaybackDisabled.Value = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Debounce re-enabling arbitrarily high enough to avoid flip-flopping during beatmap updates
|
||||
// or rapid user seeks.
|
||||
playbackDisabledDebounce = Scheduler.AddDelayed(() => samplePlaybackDisabled.Value = false, 50);
|
||||
}
|
||||
}
|
||||
|
||||
private void seek(UIEvent e, int direction)
|
||||
|
Loading…
Reference in New Issue
Block a user