diff --git a/osu.Game/Beatmaps/WorkingBeatmap.cs b/osu.Game/Beatmaps/WorkingBeatmap.cs
index bb64ec796c..a1a8306b76 100644
--- a/osu.Game/Beatmaps/WorkingBeatmap.cs
+++ b/osu.Game/Beatmaps/WorkingBeatmap.cs
@@ -126,11 +126,19 @@ namespace osu.Game.Beatmaps
}
///
- /// Transfer a valid audio track into this working beatmap. Used as an optimisation to avoid reload / track swap
- /// across difficulties in the same beatmap set.
+ /// Attempts to transfer the audio track to a target working beatmap, if valid for transferring.
+ /// Used as an optimisation to avoid reload / track swap across difficulties in the same beatmap set.
///
- /// The track to transfer.
- public void TransferTrack([NotNull] Track track) => this.track = track ?? throw new ArgumentNullException(nameof(track));
+ /// The target working beatmap to transfer this track to.
+ /// Whether the track is valid and has been transferred to this working beatmap.
+ public virtual bool TryTransferTrack([NotNull] WorkingBeatmap target)
+ {
+ if (BeatmapInfo?.AudioEquals(target.BeatmapInfo) != true)
+ return false;
+
+ target.track = track;
+ return true;
+ }
///
/// Get the loaded audio track instance. must have first been called.
diff --git a/osu.Game/Overlays/MusicController.cs b/osu.Game/Overlays/MusicController.cs
index 65b06eb864..509da4302d 100644
--- a/osu.Game/Overlays/MusicController.cs
+++ b/osu.Game/Overlays/MusicController.cs
@@ -290,15 +290,8 @@ namespace osu.Game.Overlays
current = newWorking;
- if (!audioEquals || CurrentTrack.IsDummyDevice)
- {
+ if (lastWorking == null || !lastWorking.TryTransferTrack(current))
changeTrack();
- }
- else
- {
- // transfer still valid track to new working beatmap
- current.TransferTrack(lastWorking.Track);
- }
TrackChanged?.Invoke(current, direction);