diff --git a/osu.Game/Beatmaps/IWorkingBeatmap.cs b/osu.Game/Beatmaps/IWorkingBeatmap.cs
index a916b37b85..6f0f408060 100644
--- a/osu.Game/Beatmaps/IWorkingBeatmap.cs
+++ b/osu.Game/Beatmaps/IWorkingBeatmap.cs
@@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
using System.IO;
+using System.Threading;
using osu.Framework.Audio.Track;
using osu.Framework.Graphics.Textures;
using osu.Game.Rulesets;
@@ -57,9 +58,10 @@ namespace osu.Game.Beatmaps
/// The to create a playable for.
/// The s to apply to the .
/// The maximum length in milliseconds to wait for load to complete. Defaults to 10,000ms.
+ /// Externally provided cancellation token.
/// The converted .
/// If could not be converted to .
- IBeatmap GetPlayableBeatmap(RulesetInfo ruleset, IReadOnlyList mods = null, TimeSpan? timeout = null);
+ IBeatmap GetPlayableBeatmap(RulesetInfo ruleset, IReadOnlyList mods = null, TimeSpan? timeout = null, CancellationToken cancellationToken = default);
///
/// Load a new audio track instance for this beatmap. This should be called once before accessing .
diff --git a/osu.Game/Beatmaps/WorkingBeatmap.cs b/osu.Game/Beatmaps/WorkingBeatmap.cs
index d2c0f7de0f..affc19c700 100644
--- a/osu.Game/Beatmaps/WorkingBeatmap.cs
+++ b/osu.Game/Beatmaps/WorkingBeatmap.cs
@@ -81,7 +81,7 @@ namespace osu.Game.Beatmaps
/// The applicable .
protected virtual IBeatmapConverter CreateBeatmapConverter(IBeatmap beatmap, Ruleset ruleset) => ruleset.CreateBeatmapConverter(beatmap);
- public virtual IBeatmap GetPlayableBeatmap(RulesetInfo ruleset, IReadOnlyList mods = null, TimeSpan? timeout = null)
+ public virtual IBeatmap GetPlayableBeatmap(RulesetInfo ruleset, IReadOnlyList mods = null, TimeSpan? timeout = null, CancellationToken cancellationToken = default)
{
using (var cancellationSource = createCancellationTokenSource(timeout))
{
@@ -105,7 +105,7 @@ namespace osu.Game.Beatmaps
}
// Convert
- IBeatmap converted = converter.Convert(cancellationSource.Token);
+ IBeatmap converted = converter.Convert(cancellationToken != CancellationToken.None ? cancellationToken : cancellationSource.Token);
// Apply conversion mods to the result
foreach (var mod in mods.OfType())
@@ -143,7 +143,7 @@ namespace osu.Game.Beatmaps
if (cancellationSource.IsCancellationRequested)
throw new BeatmapLoadTimeoutException(BeatmapInfo);
- obj.ApplyDefaults(converted.ControlPointInfo, converted.Difficulty, cancellationSource.Token);
+ obj.ApplyDefaults(converted.ControlPointInfo, converted.Difficulty, cancellationToken != CancellationToken.None ? cancellationToken : cancellationSource.Token);
}
}
catch (OperationCanceledException)
@@ -167,6 +167,7 @@ namespace osu.Game.Beatmaps
foreach (var mod in mods.OfType())
{
cancellationSource.Token.ThrowIfCancellationRequested();
+ cancellationToken.ThrowIfCancellationRequested();
mod.ApplyToBeatmap(converted);
}
diff --git a/osu.Game/Screens/Play/HUD/PerformancePointsCounter.cs b/osu.Game/Screens/Play/HUD/PerformancePointsCounter.cs
index ef289c2a20..922d1e6bbe 100644
--- a/osu.Game/Screens/Play/HUD/PerformancePointsCounter.cs
+++ b/osu.Game/Screens/Play/HUD/PerformancePointsCounter.cs
@@ -210,7 +210,7 @@ namespace osu.Game.Screens.Play.HUD
this.gameplayBeatmap = gameplayBeatmap;
}
- public override IBeatmap GetPlayableBeatmap(RulesetInfo ruleset, IReadOnlyList mods = null, TimeSpan? timeout = null)
+ public override IBeatmap GetPlayableBeatmap(RulesetInfo ruleset, IReadOnlyList mods = null, TimeSpan? timeout = null, CancellationToken cancellationToken = default)
=> gameplayBeatmap;
protected override IBeatmap GetBeatmap() => gameplayBeatmap;