playback: fix gaps on playlist change
This commit is contained in:
parent
19f3e07c8e
commit
bed1dc43cd
3 changed files with 36 additions and 12 deletions
|
@ -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) }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue