diff --git a/app/src/main/java/org/oxycblt/auxio/playback/service/ExoPlaybackStateHolder.kt b/app/src/main/java/org/oxycblt/auxio/playback/service/ExoPlaybackStateHolder.kt index 4e95e54d4..2947052c2 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/service/ExoPlaybackStateHolder.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/service/ExoPlaybackStateHolder.kt @@ -47,6 +47,7 @@ import org.oxycblt.auxio.music.MusicParent import org.oxycblt.auxio.music.MusicRepository import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.playback.PlaybackSettings +import org.oxycblt.auxio.playback.msToSecs import org.oxycblt.auxio.playback.persist.PersistenceRepository import org.oxycblt.auxio.playback.replaygain.ReplayGainAudioProcessor import org.oxycblt.auxio.playback.state.DeferredPlayback @@ -363,13 +364,15 @@ class ExoPlaybackStateHolder( override fun applySavedState( parent: MusicParent?, rawQueue: RawQueue, + positionMs: Long, + repeatMode: RepeatMode, ack: StateAck.NewPlayback? ) { - logD("Applying saved state") - var sendEvent = false + var sendNewPlaybackEvent = false + var shouldSeek = false if (this.parent != parent) { this.parent = parent - sendEvent = true + sendNewPlaybackEvent = true } if (rawQueue != resolveQueue()) { player.setMediaItems(rawQueue.heap.map { it.buildMediaItem() }) @@ -382,9 +385,18 @@ class ExoPlaybackStateHolder( player.seekTo(rawQueue.heapIndex, C.TIME_UNSET) player.prepare() player.pause() - sendEvent = true + sendNewPlaybackEvent = true + shouldSeek = true } - if (sendEvent) { + + repeatMode(repeatMode) + // Positions in milliseconds will drift during tight restores (i.e what the music loader + // does to sanitize the state), compare by seconds instead. + if (positionMs.msToSecs() != player.currentPosition.msToSecs() || shouldSeek) { + player.seekTo(positionMs) + } + + if (sendNewPlaybackEvent) { ack?.let { playbackManager.ack(this, it) } } } diff --git a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateHolder.kt b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateHolder.kt index c2c51f0ce..4d1cdca98 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateHolder.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateHolder.kt @@ -145,7 +145,13 @@ interface PlaybackStateHolder { * @param ack The [StateAck] to return to [PlaybackStateManager]. If null, do not return any * ack. */ - fun applySavedState(parent: MusicParent?, rawQueue: RawQueue, ack: StateAck.NewPlayback?) + fun applySavedState( + parent: MusicParent?, + rawQueue: RawQueue, + positionMs: Long, + repeatMode: RepeatMode, + ack: StateAck.NewPlayback? + ) /** End whatever ongoing playback session may be going on */ fun endSession() diff --git a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt index 494ab2c0e..283a3e6f7 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt @@ -416,9 +416,12 @@ class PlaybackStateManagerImpl @Inject constructor() : PlaybackStateManager { this.stateHolder = stateHolder if (isInitialized && currentSong != null) { - stateHolder.applySavedState(stateMirror.parent, stateMirror.rawQueue, null) - stateHolder.seekTo(stateMirror.progression.calculateElapsedPositionMs()) - stateHolder.playing(false) + stateHolder.applySavedState( + stateMirror.parent, + stateMirror.rawQueue, + stateMirror.progression.calculateElapsedPositionMs(), + stateMirror.repeatMode, + null) } pendingDeferredPlayback?.let(stateHolder::handleDeferred) } @@ -795,9 +798,12 @@ class PlaybackStateManagerImpl @Inject constructor() : PlaybackStateManager { index }) - stateHolder.applySavedState(savedState.parent, rawQueue, StateAck.NewPlayback) - stateHolder.seekTo(savedState.positionMs) - stateHolder.repeatMode(savedState.repeatMode) + stateHolder.applySavedState( + savedState.parent, + rawQueue, + savedState.positionMs, + savedState.repeatMode, + StateAck.NewPlayback) isInitialized = true }