Every mpv time-pos tick updated PlayerState.currentTime and bufferedTime,
re-rendering the invisible player controls, progress bar and chapter
segments several times per second while the app played in the
background, which drained the battery during long audio-only sessions.
- PlayerState keeps currentTime/bufferedTime current for readers but
stops notifying observers while publishesTimeUpdates is off;
PlayerService turns it off on entering the background and back on
(with one catch-up notification) before returning to the foreground
- MarqueeText pauses its animation timeline outside the active scene
- Replace the 100 ms polling loops in RemoteControlCoordinator and
ToastManager (iOS/tvOS) with observation-driven waits
Main-thread samples during 30 s of background audio-only playback on an
iPhone 12 mini went from 1289 to 248.