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

Merge pull request #11818 from peppy/fix-default-preview-time

Fix preview point not being set correctly for beatmaps which don't specify an explicit time value
This commit is contained in:
Dan Balasescu 2021-02-18 17:40:12 +09:00 committed by GitHub
commit 1d567e2b2d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 36 additions and 16 deletions

View File

@ -51,7 +51,12 @@ namespace osu.Game.Beatmaps
[JsonProperty(@"tags")] [JsonProperty(@"tags")]
public string Tags { get; set; } public string Tags { get; set; }
/// <summary>
/// The time in milliseconds to begin playing the track for preview purposes.
/// If -1, the track should begin playing at 40% of its length.
/// </summary>
public int PreviewTime { get; set; } public int PreviewTime { get; set; }
public string AudioFile { get; set; } public string AudioFile { get; set; }
public string BackgroundFile { get; set; } public string BackgroundFile { get; set; }

View File

@ -266,6 +266,26 @@ namespace osu.Game.Beatmaps
[NotNull] [NotNull]
public Track LoadTrack() => loadedTrack = GetBeatmapTrack() ?? GetVirtualTrack(1000); public Track LoadTrack() => loadedTrack = GetBeatmapTrack() ?? GetVirtualTrack(1000);
/// <summary>
/// Reads the correct track restart point from beatmap metadata and sets looping to enabled.
/// </summary>
public void PrepareTrackForPreviewLooping()
{
Track.Looping = true;
Track.RestartPoint = Metadata.PreviewTime;
if (Track.RestartPoint == -1)
{
if (!Track.IsLoaded)
{
// force length to be populated (https://github.com/ppy/osu-framework/issues/4202)
Track.Seek(Track.CurrentTime);
}
Track.RestartPoint = 0.4f * Track.Length;
}
}
/// <summary> /// <summary>
/// Transfer a valid audio track into this working beatmap. Used as an optimisation to avoid reload / track swap /// Transfer a valid audio track into this working beatmap. Used as an optimisation to avoid reload / track swap
/// across difficulties in the same beatmap set. /// across difficulties in the same beatmap set.

View File

@ -168,7 +168,7 @@ namespace osu.Game.Screens.Menu
{ {
// Only start the current track if it is the menu music. A beatmap's track is started when entering the Main Menu. // Only start the current track if it is the menu music. A beatmap's track is started when entering the Main Menu.
if (UsingThemedIntro) if (UsingThemedIntro)
Track.Restart(); Track.Start();
} }
protected override void LogoArriving(OsuLogo logo, bool resuming) protected override void LogoArriving(OsuLogo logo, bool resuming)

View File

@ -179,14 +179,15 @@ namespace osu.Game.Screens.Menu
base.OnEntering(last); base.OnEntering(last);
buttons.FadeInFromZero(500); buttons.FadeInFromZero(500);
var metadata = Beatmap.Value.Metadata;
if (last is IntroScreen && musicController.TrackLoaded) if (last is IntroScreen && musicController.TrackLoaded)
{ {
if (!musicController.CurrentTrack.IsRunning) var track = musicController.CurrentTrack;
// presume the track is the current beatmap's track. not sure how correct this assumption is but it has worked until now.
if (!track.IsRunning)
{ {
musicController.CurrentTrack.Seek(metadata.PreviewTime != -1 ? metadata.PreviewTime : 0.4f * musicController.CurrentTrack.Length); Beatmap.Value.PrepareTrackForPreviewLooping();
musicController.CurrentTrack.Start(); track.Restart();
} }
} }

View File

@ -173,9 +173,7 @@ namespace osu.Game.Screens.OnlinePlay.Match
if (track != null) if (track != null)
{ {
track.RestartPoint = Beatmap.Value.Metadata.PreviewTime; Beatmap.Value.PrepareTrackForPreviewLooping();
track.Looping = true;
music?.EnsurePlayingSomething(); music?.EnsurePlayingSomething();
} }
} }
@ -185,10 +183,7 @@ namespace osu.Game.Screens.OnlinePlay.Match
var track = Beatmap?.Value?.Track; var track = Beatmap?.Value?.Track;
if (track != null) if (track != null)
{
track.Looping = false; track.Looping = false;
track.RestartPoint = 0;
}
} }
} }
} }

View File

@ -648,8 +648,9 @@ namespace osu.Game.Screens.Select
{ {
Debug.Assert(!isHandlingLooping); Debug.Assert(!isHandlingLooping);
music.CurrentTrack.Looping = isHandlingLooping = true; isHandlingLooping = true;
ensureTrackLooping(Beatmap.Value, TrackChangeDirection.None);
music.TrackChanged += ensureTrackLooping; music.TrackChanged += ensureTrackLooping;
} }
@ -665,7 +666,7 @@ namespace osu.Game.Screens.Select
} }
private void ensureTrackLooping(WorkingBeatmap beatmap, TrackChangeDirection changeDirection) private void ensureTrackLooping(WorkingBeatmap beatmap, TrackChangeDirection changeDirection)
=> music.CurrentTrack.Looping = true; => beatmap.PrepareTrackForPreviewLooping();
public override bool OnBackButton() public override bool OnBackButton()
{ {
@ -719,8 +720,6 @@ namespace osu.Game.Screens.Select
bool isNewTrack = !lastTrack.TryGetTarget(out var last) || last != track; bool isNewTrack = !lastTrack.TryGetTarget(out var last) || last != track;
track.RestartPoint = Beatmap.Value.Metadata.PreviewTime;
if (!track.IsRunning && (music.UserPauseRequested != true || isNewTrack)) if (!track.IsRunning && (music.UserPauseRequested != true || isNewTrack))
music.Play(true); music.Play(true);