mirror of
https://github.com/ppy/osu.git
synced 2025-03-19 07:07:18 +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:
commit
a442e363b8
@ -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)
|
||||
{
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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; }
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user