Fix editor playing too many sounds when user performs a manual seek during playback

This commit is contained in:
Dean Herbert
2022-11-09 17:42:33 +09:00
parent 30700ee68b
commit 4457648b1c

View File

@ -234,7 +234,7 @@ namespace osu.Game.Screens.Edit
AddInternal(editorBeatmap = new EditorBeatmap(playableBeatmap, loadableBeatmap.GetSkin(), loadableBeatmap.BeatmapInfo)); AddInternal(editorBeatmap = new EditorBeatmap(playableBeatmap, loadableBeatmap.GetSkin(), loadableBeatmap.BeatmapInfo));
dependencies.CacheAs(editorBeatmap); dependencies.CacheAs(editorBeatmap);
editorBeatmap.UpdateInProgress.BindValueChanged(updateInProgress); editorBeatmap.UpdateInProgress.BindValueChanged(_ => updateSampleDisabledState());
canSave = editorBeatmap.BeatmapInfo.Ruleset.CreateInstance() is ILegacyRuleset; canSave = editorBeatmap.BeatmapInfo.Ruleset.CreateInstance() is ILegacyRuleset;
@ -659,7 +659,7 @@ namespace osu.Game.Screens.Edit
if (isNewBeatmap || HasUnsavedChanges) if (isNewBeatmap || HasUnsavedChanges)
{ {
samplePlaybackDisabled.Value = true; updateSampleDisabledState();
dialogOverlay?.Push(new PromptForSaveDialog(confirmExit, confirmExitWithSave, cancelExit)); dialogOverlay?.Push(new PromptForSaveDialog(confirmExit, confirmExitWithSave, cancelExit));
return true; return true;
} }
@ -729,27 +729,6 @@ namespace osu.Game.Screens.Edit
this.Exit(); 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 #region Clipboard support
private EditorMenuItem cutMenuItem; private EditorMenuItem cutMenuItem;
@ -883,11 +862,28 @@ namespace osu.Game.Screens.Edit
} }
} }
[CanBeNull]
private ScheduledDelegate playbackDisabledDebounce;
private void updateSampleDisabledState() private void updateSampleDisabledState()
{ {
samplePlaybackDisabled.Value = clock.SeekingOrStopped.Value bool shouldDisableSamples = clock.SeekingOrStopped.Value
|| currentScreen is not ComposeScreen || 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) private void seek(UIEvent e, int direction)