mirror of
https://github.com/osukey/osukey.git
synced 2025-07-02 16:59:53 +09:00
@ -8,6 +8,7 @@ using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using JetBrains.Annotations;
|
||||
using osu.Framework.Audio;
|
||||
using osu.Framework.Audio.Track;
|
||||
using osu.Framework.Graphics.Textures;
|
||||
@ -20,8 +21,6 @@ using osu.Game.Rulesets.UI;
|
||||
using osu.Game.Skinning;
|
||||
using osu.Game.Storyboards;
|
||||
|
||||
#nullable enable
|
||||
|
||||
namespace osu.Game.Beatmaps
|
||||
{
|
||||
[ExcludeFromDynamicCompile]
|
||||
@ -31,28 +30,28 @@ namespace osu.Game.Beatmaps
|
||||
public readonly BeatmapSetInfo BeatmapSetInfo;
|
||||
|
||||
// TODO: remove once the fallback lookup is not required (and access via `working.BeatmapInfo.Metadata` directly).
|
||||
public BeatmapMetadata Metadata => BeatmapInfo.Metadata ?? BeatmapSetInfo.Metadata;
|
||||
public BeatmapMetadata Metadata => BeatmapInfo.Metadata ?? BeatmapSetInfo?.Metadata ?? new BeatmapMetadata();
|
||||
|
||||
public Waveform Waveform => waveform.Value;
|
||||
|
||||
public Storyboard Storyboard => storyboard.Value;
|
||||
|
||||
public Texture? Background => GetBackground(); // Texture uses ref counting, so we want to return a new instance every usage.
|
||||
public Texture Background => GetBackground(); // Texture uses ref counting, so we want to return a new instance every usage.
|
||||
|
||||
public ISkin? Skin => skin.Value;
|
||||
public ISkin Skin => skin.Value;
|
||||
|
||||
private AudioManager? audioManager { get; }
|
||||
private AudioManager audioManager { get; }
|
||||
|
||||
private CancellationTokenSource? loadCancellationSource;
|
||||
private CancellationTokenSource loadCancellationSource = new CancellationTokenSource();
|
||||
|
||||
private readonly object beatmapFetchLock = new object();
|
||||
|
||||
private readonly Lazy<Waveform> waveform;
|
||||
private readonly Lazy<Storyboard> storyboard;
|
||||
private readonly Lazy<ISkin?> skin;
|
||||
private Track? track; // track is not Lazy as we allow transferring and loading multiple times.
|
||||
private readonly Lazy<ISkin> skin;
|
||||
private Track track; // track is not Lazy as we allow transferring and loading multiple times.
|
||||
|
||||
protected WorkingBeatmap(BeatmapInfo beatmapInfo, AudioManager? audioManager)
|
||||
protected WorkingBeatmap(BeatmapInfo beatmapInfo, AudioManager audioManager)
|
||||
{
|
||||
this.audioManager = audioManager;
|
||||
|
||||
@ -61,7 +60,7 @@ namespace osu.Game.Beatmaps
|
||||
|
||||
waveform = new Lazy<Waveform>(GetWaveform);
|
||||
storyboard = new Lazy<Storyboard>(GetStoryboard);
|
||||
skin = new Lazy<ISkin?>(GetSkin);
|
||||
skin = new Lazy<ISkin>(GetSkin);
|
||||
}
|
||||
|
||||
#region Resource getters
|
||||
@ -69,9 +68,9 @@ namespace osu.Game.Beatmaps
|
||||
protected virtual Waveform GetWaveform() => new Waveform(null);
|
||||
protected virtual Storyboard GetStoryboard() => new Storyboard { BeatmapInfo = BeatmapInfo };
|
||||
|
||||
protected abstract IBeatmap? GetBeatmap();
|
||||
protected abstract Texture? GetBackground();
|
||||
protected abstract Track? GetBeatmapTrack();
|
||||
protected abstract IBeatmap GetBeatmap();
|
||||
protected abstract Texture GetBackground();
|
||||
protected abstract Track GetBeatmapTrack();
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new skin instance for this beatmap.
|
||||
@ -81,7 +80,7 @@ namespace osu.Game.Beatmaps
|
||||
/// (e.g. for editing purposes, to avoid state pollution).
|
||||
/// For standard reading purposes, <see cref="Skin"/> should always be used directly.
|
||||
/// </remarks>
|
||||
protected internal abstract ISkin? GetSkin();
|
||||
protected internal abstract ISkin GetSkin();
|
||||
|
||||
#endregion
|
||||
|
||||
@ -94,6 +93,7 @@ namespace osu.Game.Beatmaps
|
||||
lock (beatmapFetchLock)
|
||||
{
|
||||
loadCancellationSource?.Cancel();
|
||||
loadCancellationSource = new CancellationTokenSource();
|
||||
|
||||
if (beatmapLoadTask?.IsCompleted != true)
|
||||
beatmapLoadTask = null;
|
||||
@ -130,7 +130,7 @@ namespace osu.Game.Beatmaps
|
||||
/// across difficulties in the same beatmap set.
|
||||
/// </summary>
|
||||
/// <param name="track">The track to transfer.</param>
|
||||
public void TransferTrack(Track track) => this.track = track ?? throw new ArgumentNullException(nameof(track));
|
||||
public void TransferTrack([NotNull] Track track) => this.track = track ?? throw new ArgumentNullException(nameof(track));
|
||||
|
||||
/// <summary>
|
||||
/// Get the loaded audio track instance. <see cref="LoadTrack"/> must have first been called.
|
||||
@ -143,9 +143,6 @@ namespace osu.Game.Beatmaps
|
||||
if (!TrackLoaded)
|
||||
throw new InvalidOperationException($"Cannot access {nameof(Track)} without first calling {nameof(LoadTrack)}.");
|
||||
|
||||
// Covered by TrackLoaded call above.
|
||||
Debug.Assert(track != null);
|
||||
|
||||
return track;
|
||||
}
|
||||
}
|
||||
@ -173,7 +170,7 @@ namespace osu.Game.Beatmaps
|
||||
break;
|
||||
}
|
||||
|
||||
return audioManager?.Tracks.GetVirtual(length) ?? throw new InvalidOperationException($"Attempted to get virtual track without providing an {nameof(AudioManager)}");
|
||||
return audioManager.Tracks.GetVirtual(length);
|
||||
}
|
||||
|
||||
#endregion
|
||||
@ -182,7 +179,7 @@ namespace osu.Game.Beatmaps
|
||||
|
||||
public virtual bool BeatmapLoaded => beatmapLoadTask?.IsCompleted ?? false;
|
||||
|
||||
public IBeatmap? Beatmap
|
||||
public IBeatmap Beatmap
|
||||
{
|
||||
get
|
||||
{
|
||||
@ -207,7 +204,7 @@ namespace osu.Game.Beatmaps
|
||||
}
|
||||
}
|
||||
|
||||
private Task<IBeatmap>? beatmapLoadTask;
|
||||
private Task<IBeatmap> beatmapLoadTask;
|
||||
|
||||
private Task<IBeatmap> loadBeatmapAsync()
|
||||
{
|
||||
@ -225,7 +222,7 @@ namespace osu.Game.Beatmaps
|
||||
b.BeatmapInfo = BeatmapInfo;
|
||||
|
||||
return b;
|
||||
}, (loadCancellationSource = new CancellationTokenSource()).Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);
|
||||
}, loadCancellationSource.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);
|
||||
}
|
||||
}
|
||||
|
||||
@ -233,7 +230,7 @@ namespace osu.Game.Beatmaps
|
||||
|
||||
#region Playable beatmap
|
||||
|
||||
public IBeatmap GetPlayableBeatmap(IRulesetInfo ruleset, IReadOnlyList<Mod>? mods = null)
|
||||
public IBeatmap GetPlayableBeatmap(IRulesetInfo ruleset, IReadOnlyList<Mod> mods = null)
|
||||
{
|
||||
try
|
||||
{
|
||||
@ -256,9 +253,6 @@ namespace osu.Game.Beatmaps
|
||||
if (rulesetInstance == null)
|
||||
throw new RulesetLoadException("Creating ruleset instance failed when attempting to create playable beatmap.");
|
||||
|
||||
if (Beatmap == null)
|
||||
throw new InvalidOperationException("Beatmap could not be loaded.");
|
||||
|
||||
IBeatmapConverter converter = CreateBeatmapConverter(Beatmap, rulesetInstance);
|
||||
|
||||
// Check if the beatmap can be converted
|
||||
@ -338,7 +332,7 @@ namespace osu.Game.Beatmaps
|
||||
|
||||
public override string ToString() => BeatmapInfo.ToString();
|
||||
|
||||
public abstract Stream? GetStream(string storagePath);
|
||||
public abstract Stream GetStream(string storagePath);
|
||||
|
||||
IBeatmapInfo IWorkingBeatmap.BeatmapInfo => BeatmapInfo;
|
||||
|
||||
|
Reference in New Issue
Block a user