diff --git a/osu.Game/Screens/Play/GameplayClockContainer.cs b/osu.Game/Screens/Play/GameplayClockContainer.cs
index 5cd17d92c4..1c8a3e51ac 100644
--- a/osu.Game/Screens/Play/GameplayClockContainer.cs
+++ b/osu.Game/Screens/Play/GameplayClockContainer.cs
@@ -63,8 +63,7 @@ namespace osu.Game.Screens.Play
///
public virtual void Start()
{
- // Ensure that the source clock is set.
- ChangeSource(SourceClock);
+ ensureSourceClockSet();
if (!AdjustableSource.IsRunning)
{
@@ -100,6 +99,7 @@ namespace osu.Game.Screens.Play
///
public virtual void Reset()
{
+ ensureSourceClockSet();
Seek(0);
// Manually stop the source in order to not affect the IsPaused state.
@@ -115,6 +115,19 @@ namespace osu.Game.Screens.Play
/// The new source.
protected void ChangeSource(IClock sourceClock) => AdjustableSource.ChangeSource(SourceClock = sourceClock);
+ ///
+ /// Ensures that the is set to , if it hasn't been given a source yet.
+ /// This is usually done before a seek to avoid accidentally seeking only the adjustable source in decoupled mode,
+ /// but not the actual source clock.
+ /// That will pretty much only happen on the very first call of this method, as the source clock is passed in the constructor,
+ /// but it is not yet set on the adjustable source there.
+ ///
+ private void ensureSourceClockSet()
+ {
+ if (AdjustableSource.Source == null)
+ ChangeSource(SourceClock);
+ }
+
protected override void Update()
{
if (!IsPaused.Value)