21.3 review fixes: guard superseded-seek failures; restore post-recovery retry

C6/AC8: IsStillActiveSeek() predicate guards all three SeekBeyondBuffer
failure exits, so a superseded seek never recovers over a newer seek's
state. AC6: empty scheduler routes to seekBeyondBuffer so a same-target
retry (seek or play) refetches instead of no-oping.
This commit is contained in:
daniel-c-harvey
2026-06-23 23:55:28 -04:00
parent af4cb186f3
commit b93881cd66
4 changed files with 102 additions and 15 deletions
@@ -118,6 +118,16 @@ public abstract class AudioPlayerService : IPlayerService, IAsyncDisposable
IsPlaying = true;
IsPaused = false;
}
else if (IsPaused)
{
// Play failed while the player is paused — the scheduler may be empty after a
// failed refill (AC6 recovery). Re-issue a seek at the current position: the
// seek path routes to seekBeyondBuffer when the scheduler is empty (Phase 21.3
// fix), triggering a real refetch rather than returning "Streaming not ready".
// We return early here; Seek owns its own state mutations and NotifyStateChanged.
await Seek(CurrentTime);
return;
}
}
if (!result.Success)
@@ -128,7 +138,7 @@ public abstract class AudioPlayerService : IPlayerService, IAsyncDisposable
{
ErrorMessage = null;
}
await NotifyStateChanged();
}
catch (Exception ex)