music: fix crash on playlist add

Caused by the new state restoration code being bugged and applying on
playlist changes, then combined with the playlist code not properly
switching to the main context when dispatching a library update.
This commit is contained in:
Alexander Capehart 2024-02-26 15:26:23 -07:00
parent ddc321893d
commit 44b7a435d1
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
2 changed files with 6 additions and 11 deletions

View file

@ -305,35 +305,35 @@ constructor(
val userLibrary = synchronized(this) { userLibrary ?: return } val userLibrary = synchronized(this) { userLibrary ?: return }
logD("Creating playlist $name with ${songs.size} songs") logD("Creating playlist $name with ${songs.size} songs")
userLibrary.createPlaylist(name, songs) userLibrary.createPlaylist(name, songs)
dispatchLibraryChange(device = false, user = true) withContext(Dispatchers.Main) { dispatchLibraryChange(device = false, user = true) }
} }
override suspend fun renamePlaylist(playlist: Playlist, name: String) { override suspend fun renamePlaylist(playlist: Playlist, name: String) {
val userLibrary = synchronized(this) { userLibrary ?: return } val userLibrary = synchronized(this) { userLibrary ?: return }
logD("Renaming $playlist to $name") logD("Renaming $playlist to $name")
userLibrary.renamePlaylist(playlist, name) userLibrary.renamePlaylist(playlist, name)
dispatchLibraryChange(device = false, user = true) withContext(Dispatchers.Main) { dispatchLibraryChange(device = false, user = true) }
} }
override suspend fun deletePlaylist(playlist: Playlist) { override suspend fun deletePlaylist(playlist: Playlist) {
val userLibrary = synchronized(this) { userLibrary ?: return } val userLibrary = synchronized(this) { userLibrary ?: return }
logD("Deleting $playlist") logD("Deleting $playlist")
userLibrary.deletePlaylist(playlist) userLibrary.deletePlaylist(playlist)
dispatchLibraryChange(device = false, user = true) withContext(Dispatchers.Main) { dispatchLibraryChange(device = false, user = true) }
} }
override suspend fun addToPlaylist(songs: List<Song>, playlist: Playlist) { override suspend fun addToPlaylist(songs: List<Song>, playlist: Playlist) {
val userLibrary = synchronized(this) { userLibrary ?: return } val userLibrary = synchronized(this) { userLibrary ?: return }
logD("Adding ${songs.size} songs to $playlist") logD("Adding ${songs.size} songs to $playlist")
userLibrary.addToPlaylist(playlist, songs) userLibrary.addToPlaylist(playlist, songs)
dispatchLibraryChange(device = false, user = true) withContext(Dispatchers.Main) { dispatchLibraryChange(device = false, user = true) }
} }
override suspend fun rewritePlaylist(playlist: Playlist, songs: List<Song>) { override suspend fun rewritePlaylist(playlist: Playlist, songs: List<Song>) {
val userLibrary = synchronized(this) { userLibrary ?: return } val userLibrary = synchronized(this) { userLibrary ?: return }
logD("Rewriting $playlist with ${songs.size} songs") logD("Rewriting $playlist with ${songs.size} songs")
userLibrary.rewritePlaylist(playlist, songs) userLibrary.rewritePlaylist(playlist, songs)
dispatchLibraryChange(device = false, user = true) withContext(Dispatchers.Main) { dispatchLibraryChange(device = false, user = true) }
} }
@Synchronized @Synchronized

View file

@ -780,14 +780,9 @@ class PlaybackStateManagerImpl @Inject constructor() : PlaybackStateManager {
val oldStateMirror = stateMirror val oldStateMirror = stateMirror
if (oldStateMirror.rawQueue != rawQueue) { if (oldStateMirror.rawQueue != rawQueue) {
logD("Queue changed, must reload player") logD("Queue changed, must reload player")
stateHolder?.playing(false)
stateHolder?.applySavedState(parent, rawQueue, StateAck.NewPlayback) 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?.seekTo(savedState.positionMs)
stateHolder?.playing(false)
} }
} }