playback: fix gaps on playlist change

This commit is contained in:
Alexander Capehart 2024-10-14 12:46:06 -06:00
parent 19f3e07c8e
commit bed1dc43cd
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
3 changed files with 36 additions and 12 deletions

View file

@ -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) }
}
}

View file

@ -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()

View file

@ -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
}