// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using System.Diagnostics; using JetBrains.Annotations; using osu.Framework.Audio; using osu.Framework.Bindables; namespace osu.Game.Beatmaps { /// /// A for the beatmap. /// This should be used sparingly in-favour of . /// public abstract class BindableBeatmap : NonNullableBindable { protected AudioManager AudioManager; private WorkingBeatmap lastBeatmap; protected BindableBeatmap(WorkingBeatmap defaultValue, AudioManager audioManager) : base(defaultValue) { // we don't want to attempt to update tracks if we are a bound copy. if (audioManager != null) { AudioManager = audioManager; ValueChanged += b => updateAudioTrack(b.NewValue); // If the track has changed prior to this being called, let's register it if (Value != Default) updateAudioTrack(Value); } } private void updateAudioTrack(WorkingBeatmap beatmap) { var trackLoaded = lastBeatmap?.TrackLoaded ?? false; // compare to last beatmap as sometimes the two may share a track representation (optimisation, see WorkingBeatmap.TransferTo) if (!trackLoaded || lastBeatmap?.Track != beatmap.Track) { if (trackLoaded) { Debug.Assert(lastBeatmap != null); Debug.Assert(lastBeatmap.Track != null); lastBeatmap.RecycleTrack(); } } lastBeatmap = beatmap; } /// /// Retrieve a new instance weakly bound to this . /// If you are further binding to events of the retrieved , ensure a local reference is held. /// [NotNull] public new abstract BindableBeatmap GetBoundCopy(); } }