Handle beatmap track changing in a saner way

This commit is contained in:
Dean Herbert 2020-03-04 19:09:52 +09:00
parent 7464a486d9
commit bac35b2a68

View File

@ -396,18 +396,27 @@ namespace osu.Game
private void beatmapChanged(ValueChangedEvent<WorkingBeatmap> beatmap)
{
var nextBeatmap = beatmap.NewValue;
if (nextBeatmap?.Track != null)
nextBeatmap.Track.Completed += currentTrackCompleted;
var oldBeatmap = beatmap.OldValue;
if (oldBeatmap?.Track != null)
oldBeatmap.Track.Completed -= currentTrackCompleted;
beatmap.OldValue?.CancelAsyncLoad();
updateModDefaults();
oldBeatmap?.CancelAsyncLoad();
nextBeatmap?.BeginAsyncLoad();
var newBeatmap = beatmap.NewValue;
if (newBeatmap != null)
{
newBeatmap.Track.Completed += () => Scheduler.AddOnce(() => trackCompleted(newBeatmap));
newBeatmap.BeginAsyncLoad();
}
void trackCompleted(WorkingBeatmap b)
{
// the source of track completion is the audio thread, so the beatmap may have changed before a firing.
if (Beatmap.Value != b)
return;
if (Beatmap.Value.Track.Looping && !Beatmap.Disabled)
musicController.NextTrack();
}
}
private void modsChanged(ValueChangedEvent<IReadOnlyList<Mod>> mods)
@ -428,18 +437,6 @@ namespace osu.Game
}
}
private void currentTrackCompleted()
{
if (Beatmap.Value is DummyWorkingBeatmap)
return;
Schedule(() =>
{
if (Beatmap.Value.Track.Looping && !Beatmap.Disabled)
musicController.NextTrack();
});
}
#endregion
private ScheduledDelegate performFromMainMenuTask;