diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiSpectatorScreen.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiSpectatorScreen.cs
index bab613bed7..dce996696b 100644
--- a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiSpectatorScreen.cs
+++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiSpectatorScreen.cs
@@ -357,12 +357,18 @@ namespace osu.Game.Tests.Visual.Multiplayer
///
/// Tests spectating with a beatmap that has a high value.
+ ///
+ /// This test is not intended not to check the correct initial time value, but only to guard against
+ /// gameplay potentially getting stuck in a stopped state due to lead in time being present.
///
[Test]
public void TestAudioLeadIn() => testLeadIn(b => b.BeatmapInfo.AudioLeadIn = 2000);
///
/// Tests spectating with a beatmap that has a storyboard element with a negative start time (i.e. intro storyboard element).
+ ///
+ /// This test is not intended not to check the correct initial time value, but only to guard against
+ /// gameplay potentially getting stuck in a stopped state due to lead in time being present.
///
[Test]
public void TestIntroStoryboardElement() => testLeadIn(b =>
@@ -384,7 +390,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
AddUntilStep("wait for player load", () => spectatorScreen.AllPlayersLoaded);
- AddWaitStep("wait for progression", 3);
+ AddUntilStep($"wait for clock running", () => getInstance(PLAYER_1_ID).SpectatorPlayerClock.IsRunning);
assertNotCatchingUp(PLAYER_1_ID);
assertRunning(PLAYER_1_ID);
diff --git a/osu.Game/Screens/OnlinePlay/Multiplayer/Spectate/SpectatorPlayerClock.cs b/osu.Game/Screens/OnlinePlay/Multiplayer/Spectate/SpectatorPlayerClock.cs
index 7801f22437..62731c6903 100644
--- a/osu.Game/Screens/OnlinePlay/Multiplayer/Spectate/SpectatorPlayerClock.cs
+++ b/osu.Game/Screens/OnlinePlay/Multiplayer/Spectate/SpectatorPlayerClock.cs
@@ -77,7 +77,10 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Spectate
{
if (IsRunning)
{
- double elapsedSource = masterClock.ElapsedFrameTime;
+ // When in catch-up mode, the source is usually not running.
+ // In such a case, its elapsed time may be zero, which would cause catch-up to get stuck.
+ // To avoid this, use a constant 16ms elapsed time for now. Probably not too correct, but this whole logic isn't too correct anyway.
+ double elapsedSource = masterClock.ElapsedFrameTime != 0 ? masterClock.ElapsedFrameTime : 16;
double elapsed = elapsedSource * Rate;
CurrentTime += elapsed;