From 3bcf87b5b4334f595e44954e53213068f878140d Mon Sep 17 00:00:00 2001 From: austinried <4966622+austinried@users.noreply.github.com> Date: Sat, 26 Sep 2026 19:33:35 +0000 Subject: [PATCH] prepare the restored track so the first play is instant Restore set the window with autoplay = false and never prepared, so the first tap paid for the connection, the first range request and the startup buffer. Prepare once the window is set; toggling play then only starts playback. --- .../kotlin/com/subtracks/playback/PlaybackController.kt | 1 + .../kotlin/com/subtracks/playback/PlaybackControllerTest.kt | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/subtracks/playback/PlaybackController.kt b/app/src/main/kotlin/com/subtracks/playback/PlaybackController.kt index cf72a35b..b6350f31 100644 --- a/app/src/main/kotlin/com/subtracks/playback/PlaybackController.kt +++ b/app/src/main/kotlin/com/subtracks/playback/PlaybackController.kt @@ -662,6 +662,7 @@ class PlaybackController( val position = queueRepository.cursor().coerceIn(0, snapshot.size - 1) lastSavedPositionMs = queueRepository.cursorPositionMs().coerceAtLeast(0) loadWindow(position, autoplay = false, startPositionMs = lastSavedPositionMs) + player?.prepare() } private suspend fun stop() = startLock.withLock { stopLocked() } diff --git a/app/src/test/kotlin/com/subtracks/playback/PlaybackControllerTest.kt b/app/src/test/kotlin/com/subtracks/playback/PlaybackControllerTest.kt index be87c516..d596fbb7 100644 --- a/app/src/test/kotlin/com/subtracks/playback/PlaybackControllerTest.kt +++ b/app/src/test/kotlin/com/subtracks/playback/PlaybackControllerTest.kt @@ -144,18 +144,20 @@ class PlaybackControllerTest { } @Test - fun togglingPlayOnARestoredQueuePreparesBeforePlaying() { + fun aRestoredQueueIsPreparedBeforeTheFirstPlay() { seedAlbum(5, sourceId = 1) runBlocking { queues.replace(listOf(queues.albumEntry(1, "al1"))) } controller.connect() await { handle.items.isNotEmpty() } + await { handle.operations.contains("prepare") } + handle.operations.clear() controller.togglePlayPause() await { handle.operations.contains("play") } - assertEquals(listOf("prepare", "play"), handle.operations) + assertEquals(listOf("play"), handle.operations) } @Test