playback: readd service reinit

Make sure the service is properly re-initialized when it dies and is
then restarted.
This commit is contained in:
Alexander Capehart 2024-01-13 20:43:51 -07:00
parent b2d71f8903
commit 3267ae98be
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
3 changed files with 20 additions and 6 deletions

View file

@ -62,7 +62,7 @@ interface PlaybackStateHolder {
fun handleDeferred(action: DeferredPlayback): Boolean
fun applySavedState(parent: MusicParent?, rawQueue: RawQueue)
fun applySavedState(parent: MusicParent?, rawQueue: RawQueue, ack: StateAck.NewPlayback?)
}
sealed interface StateAck {

View file

@ -217,6 +217,11 @@ interface PlaybackStateManager {
*/
fun playing(isPlaying: Boolean)
/**
* Update the current [RepeatMode].
*
* @param repeatMode The new [RepeatMode].
*/
fun repeatMode(repeatMode: RepeatMode)
/**
@ -407,8 +412,11 @@ class PlaybackStateManagerImpl @Inject constructor() : PlaybackStateManager {
}
this.stateHolder = stateHolder
// TODO: Re-init player
if (isInitialized) {
stateHolder.applySavedState(stateMirror.parent, stateMirror.rawQueue, null)
stateHolder.seekTo(stateMirror.progression.calculateElapsedPositionMs())
stateHolder.playing(false)
}
}
@Synchronized
@ -770,12 +778,14 @@ class PlaybackStateManagerImpl @Inject constructor() : PlaybackStateManager {
if (oldStateMirror.rawQueue != rawQueue) {
logD("Queue changed, must reload player")
stateHolder?.applySavedState(parent, rawQueue)
stateHolder?.applySavedState(parent, rawQueue, StateAck.NewPlayback)
stateHolder?.playing(false)
}
if (oldStateMirror.progression.calculateElapsedPositionMs() != savedState.positionMs) {
logD("Seeking to saved position ${savedState.positionMs}ms")
stateHolder?.seekTo(savedState.positionMs)
stateHolder?.playing(false)
}
isInitialized = true

View file

@ -369,11 +369,15 @@ class PlaybackService :
return true
}
override fun applySavedState(parent: MusicParent?, rawQueue: RawQueue) {
override fun applySavedState(
parent: MusicParent?,
rawQueue: RawQueue,
ack: StateAck.NewPlayback?
) {
this.parent = parent
player.applyQueue(rawQueue)
player.prepare()
playbackManager.ack(this, StateAck.NewPlayback)
ack?.let { playbackManager.ack(this, it) }
}
// --- PLAYER OVERRIDES ---