From d6d99fb14269082260aec2a1000a7a670cc23032 Mon Sep 17 00:00:00 2001 From: Antoine Jaury Date: Wed, 8 Jul 2026 16:21:59 +0200 Subject: [PATCH] refactor: improve player lifecycle --- .../chombev/player/data/AndroidAudioPlayer.kt | 2 ++ .../player/data/PlaybackRepositoryImpl.kt | 27 +++++++++++++------ .../player/ui/viewmodel/PlayerViewModel.kt | 3 ++- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/core/audioplayer/src/androidMain/kotlin/bzh/ajaury/chombev/player/data/AndroidAudioPlayer.kt b/core/audioplayer/src/androidMain/kotlin/bzh/ajaury/chombev/player/data/AndroidAudioPlayer.kt index 46e571b..a389835 100644 --- a/core/audioplayer/src/androidMain/kotlin/bzh/ajaury/chombev/player/data/AndroidAudioPlayer.kt +++ b/core/audioplayer/src/androidMain/kotlin/bzh/ajaury/chombev/player/data/AndroidAudioPlayer.kt @@ -79,9 +79,11 @@ internal class AndroidAudioPlayer( override fun stop() { player.stop() + _playbackState.value = PlaybackState.IDLE } override fun release() { player.release() + _playbackState.value = PlaybackState.IDLE } } diff --git a/data/playback/src/commonMain/kotlin/bzh/ajaury/chombev/player/data/PlaybackRepositoryImpl.kt b/data/playback/src/commonMain/kotlin/bzh/ajaury/chombev/player/data/PlaybackRepositoryImpl.kt index 9aa5609..4666592 100644 --- a/data/playback/src/commonMain/kotlin/bzh/ajaury/chombev/player/data/PlaybackRepositoryImpl.kt +++ b/data/playback/src/commonMain/kotlin/bzh/ajaury/chombev/player/data/PlaybackRepositoryImpl.kt @@ -82,15 +82,23 @@ internal class PlaybackRepositoryImpl( @OptIn(ExperimentalCoroutinesApi::class) private val currentPosition: Flow = playbackState.flatMapLatest { state -> - if (state in listOf(PlaybackState.PLAYING, PlaybackState.PAUSED)) { - flow { - while (true) { - emit(audioPlayer.currentPosition) - delay(POSITION_POLL_INTERVAL) + when (state) { + in listOf(PlaybackState.PLAYING, PlaybackState.PAUSED) -> { + flow { + while (true) { + emit(audioPlayer.currentPosition) + delay(POSITION_POLL_INTERVAL) + } } } - } else { - flowOf(audioPlayer.currentPosition) + + PlaybackState.IDLE -> { + flowOf(Duration.ZERO) + } + + else -> { + flowOf(audioPlayer.currentPosition) + } } } @@ -304,7 +312,9 @@ internal class PlaybackRepositoryImpl( ) override suspend fun stop() { - cancelRunningBreakJob() + breakJob?.cancel() + isBreaking.value = false + subtitle.value = Subtitle(emptyList()) audioPlayer.stop() } @@ -312,6 +322,7 @@ internal class PlaybackRepositoryImpl( breakJob?.cancel() isBreaking.value = false audioPlayer.release() + subtitle.value = Subtitle(emptyList()) } private suspend fun cancelRunningBreakJob() { diff --git a/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/viewmodel/PlayerViewModel.kt b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/viewmodel/PlayerViewModel.kt index 54a2fe5..59765d7 100644 --- a/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/viewmodel/PlayerViewModel.kt +++ b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/viewmodel/PlayerViewModel.kt @@ -59,6 +59,8 @@ class PlayerViewModel( fun loadRecord() { viewModelScope.launch { + playbackRepository.stop() + logger.debug("Loading record $recordId") val alreadyLoadedRecord = record.value if (alreadyLoadedRecord != null) { @@ -177,6 +179,5 @@ class PlayerViewModel( override fun onCleared() { super.onCleared() audioSessionManager.deactivate() - playbackRepository.release() } }