1
0
mirror of https://github.com/ppy/osu.git synced 2024-09-22 08:07:24 +08:00

Fix preview track manager allowing playback of multiple tracks (#6768)

Fix preview track manager allowing playback of multiple tracks

Co-authored-by: Dean Herbert <pe@ppy.sh>
This commit is contained in:
Dean Herbert 2019-11-12 15:40:05 +09:00 committed by GitHub
commit a442e363b8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 43 additions and 17 deletions

View File

@ -7,6 +7,7 @@ using osu.Framework.Audio.Track;
using osu.Framework.Graphics.Containers;
using osu.Game.Audio;
using osu.Game.Beatmaps;
using static osu.Game.Tests.Visual.Components.TestScenePreviewTrackManager.TestPreviewTrackManager;
namespace osu.Game.Tests.Visual.Components
{
@ -59,6 +60,9 @@ namespace osu.Game.Tests.Visual.Components
AddStep("start track 2", () => track2.Start());
AddAssert("track 1 stopped", () => !track1.IsRunning);
AddAssert("track 2 started", () => track2.IsRunning);
AddStep("start track 1", () => track1.Start());
AddAssert("track 2 stopped", () => !track2.IsRunning);
AddAssert("track 1 started", () => track1.IsRunning);
}
[Test]
@ -88,9 +92,25 @@ namespace osu.Game.Tests.Visual.Components
AddAssert("stopped", () => !track.IsRunning);
}
private PreviewTrack getTrack() => trackManager.Get(null);
[Test]
public void TestNonPresentTrack()
{
TestPreviewTrack track = null;
private PreviewTrack getOwnedTrack()
AddStep("get non-present track", () =>
{
Add(new TestTrackOwner(track = getTrack()));
track.Alpha = 0;
});
AddUntilStep("wait loaded", () => track.IsLoaded);
AddStep("start", () => track.Start());
AddStep("seek to end", () => track.Track.Seek(track.Track.Length));
AddAssert("track stopped", () => !track.IsRunning);
}
private TestPreviewTrack getTrack() => (TestPreviewTrack)trackManager.Get(null);
private TestPreviewTrack getOwnedTrack()
{
var track = getTrack();
@ -122,14 +142,16 @@ namespace osu.Game.Tests.Visual.Components
}
}
private class TestPreviewTrackManager : PreviewTrackManager
public class TestPreviewTrackManager : PreviewTrackManager
{
protected override TrackManagerPreviewTrack CreatePreviewTrack(BeatmapSetInfo beatmapSetInfo, ITrackStore trackStore) => new TestPreviewTrack(beatmapSetInfo, trackStore);
protected class TestPreviewTrack : TrackManagerPreviewTrack
public class TestPreviewTrack : TrackManagerPreviewTrack
{
private readonly ITrackStore trackManager;
public new Track Track => base.Track;
public TestPreviewTrack(BeatmapSetInfo beatmapSetInfo, ITrackStore trackManager)
: base(beatmapSetInfo, trackManager)
{

View File

@ -24,36 +24,37 @@ namespace osu.Game.Audio
/// </summary>
public event Action Started;
private Track track;
protected Track Track { get; private set; }
private bool hasStarted;
[BackgroundDependencyLoader]
private void load()
{
track = GetTrack();
if (track != null)
track.Completed += Stop;
Track = GetTrack();
if (Track != null)
Track.Completed += Stop;
}
/// <summary>
/// Length of the track.
/// </summary>
public double Length => track?.Length ?? 0;
public double Length => Track?.Length ?? 0;
/// <summary>
/// The current track time.
/// </summary>
public double CurrentTime => track?.CurrentTime ?? 0;
public double CurrentTime => Track?.CurrentTime ?? 0;
/// <summary>
/// Whether the track is loaded.
/// </summary>
public bool TrackLoaded => track?.IsLoaded ?? false;
public bool TrackLoaded => Track?.IsLoaded ?? false;
/// <summary>
/// Whether the track is playing.
/// </summary>
public bool IsRunning => track?.IsRunning ?? false;
public bool IsRunning => Track?.IsRunning ?? false;
private ScheduledDelegate startDelegate;
@ -63,7 +64,7 @@ namespace osu.Game.Audio
/// <returns>Whether the track is started or already playing.</returns>
public bool Start()
{
if (track == null)
if (Track == null)
return false;
startDelegate = Schedule(() =>
@ -73,7 +74,7 @@ namespace osu.Game.Audio
hasStarted = true;
track.Restart();
Track.Restart();
Started?.Invoke();
});
@ -87,7 +88,7 @@ namespace osu.Game.Audio
{
startDelegate?.Cancel();
if (track == null)
if (Track == null)
return;
if (!hasStarted)
@ -95,7 +96,7 @@ namespace osu.Game.Audio
hasStarted = false;
track.Stop();
Track.Stop();
Stopped?.Invoke();
}

View File

@ -55,6 +55,9 @@ namespace osu.Game.Audio
track.Stopped += () => Schedule(() =>
{
if (current != track)
return;
current = null;
audio.Tracks.RemoveAdjustment(AdjustableProperty.Volume, muteBindable);
});
@ -85,7 +88,7 @@ namespace osu.Game.Audio
/// </summary>
protected virtual TrackManagerPreviewTrack CreatePreviewTrack(BeatmapSetInfo beatmapSetInfo, ITrackStore trackStore) => new TrackManagerPreviewTrack(beatmapSetInfo, trackStore);
protected class TrackManagerPreviewTrack : PreviewTrack
public class TrackManagerPreviewTrack : PreviewTrack
{
public IPreviewTrackOwner Owner { get; private set; }