Centralise TrackManager.AddItem logic to avoid duplicate adds

This commit is contained in:
Dean Herbert 2017-07-20 17:46:23 +09:00
parent 67b95926c4
commit 3bdd4d7d02
5 changed files with 17 additions and 28 deletions

View File

@ -135,10 +135,17 @@ private void load()
Beatmap.ValueChanged += b =>
{
// this disposal is done to stop the audio track.
// it may not be exactly what we want for cases beatmaps are reused, as it will
// trigger a fresh load of contained resources.
lastBeatmap?.Dispose();
// compare to last baetmap as sometimes the two may share a track representation (optimisation, see WorkingBeatmap.TransferTo)
if (lastBeatmap?.Track != b.Track)
{
// this disposal is done to stop the audio track.
// it may not be exactly what we want for cases beatmaps are reused, as it will
// trigger a fresh load of contained resources.
lastBeatmap?.Dispose();
Audio.Track.AddItem(b.Track);
}
lastBeatmap = b;
};

View File

@ -3,9 +3,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using osu.Framework.Allocation;
using osu.Framework.Audio.Track;
using osu.Framework.Configuration;
using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
@ -15,7 +13,6 @@
using osu.Game.Graphics;
using OpenTK;
using OpenTK.Graphics;
using osu.Framework.Extensions;
using osu.Framework.Input;
using osu.Framework.Graphics.Shapes;
@ -30,7 +27,6 @@ public class PlaylistOverlay : OverlayContainer
private FilterControl filter;
private PlaylistList list;
private TrackManager trackManager;
private BeatmapDatabase beatmaps;
private readonly Bindable<WorkingBeatmap> beatmapBacking = new Bindable<WorkingBeatmap>();
@ -43,7 +39,6 @@ private void load(OsuGameBase game, BeatmapDatabase beatmaps, OsuColour colours,
{
this.inputManager = inputManager;
this.beatmaps = beatmaps;
trackManager = game.Audio.Track;
Children = new Drawable[]
{
@ -154,13 +149,7 @@ public void PlayNext()
private void playSpecified(BeatmapInfo info)
{
beatmapBacking.Value = beatmaps.GetWorkingBeatmap(info, beatmapBacking);
Task.Run(() =>
{
var track = beatmapBacking.Value.Track;
trackManager.AddItem(track);
track.Start();
}).ContinueWith(task => Schedule(task.ThrowIfFaulted), TaskContinuationOptions.OnlyOnFaulted);
beatmapBacking.Value.Track.Start();
}
}

View File

@ -72,8 +72,6 @@ private void load(AudioManager audio, OsuConfigManager config, BeatmapDatabase b
menuVoice = config.GetBindable<bool>(OsuSetting.MenuVoice);
menuMusic = config.GetBindable<bool>(OsuSetting.MenuMusic);
var trackManager = audio.Track;
BeatmapSetInfo setInfo = null;
if (!menuMusic)
@ -106,7 +104,6 @@ private void load(AudioManager audio, OsuConfigManager config, BeatmapDatabase b
Beatmap.Value = beatmaps.GetWorkingBeatmap(setInfo.Beatmaps[0]);
track = Beatmap.Value.Track;
trackManager.AddItem(track);
welcome = audio.Sample.Get(@"welcome");
seeya = audio.Sample.Get(@"seeya");

View File

@ -119,10 +119,7 @@ private void load(AudioManager audio, BeatmapDatabase beatmaps, OsuConfigManager
Track track = Beatmap.Value.Track;
if (track != null)
{
audio.Track.AddItem(track);
adjustableSourceClock = track;
}
adjustableSourceClock = (IAdjustableClock)track ?? new StopwatchClock();

View File

@ -32,7 +32,6 @@ public abstract class SongSelect : OsuScreen
protected override BackgroundScreen CreateBackground() => new BackgroundScreenBeatmap();
private readonly BeatmapCarousel carousel;
private TrackManager trackManager;
private DialogOverlay dialogOverlay;
private static readonly Vector2 wedged_container_size = new Vector2(0.5f, 245);
@ -174,7 +173,6 @@ private void load(BeatmapDatabase beatmaps, AudioManager audio, DialogOverlay di
database.BeatmapSetAdded += onBeatmapSetAdded;
database.BeatmapSetRemoved += onBeatmapSetRemoved;
trackManager = audio.Track;
dialogOverlay = dialog;
sampleChangeDifficulty = audio.Sample.Get(@"SongSelect/select-difficulty");
@ -358,10 +356,11 @@ private void ensurePlayingSelected(bool preview = false)
{
Track track = Beatmap.Value.Track;
trackManager.AddItem(track);
if (preview) track.Seek(Beatmap.Value.Metadata.PreviewTime);
track.Start();
if (!track.IsRunning)
{
if (preview) track.Seek(Beatmap.Value.Metadata.PreviewTime);
track.Start();
}
}
private void removeBeatmapSet(BeatmapSetInfo beatmapSet)