refactor: improve player lifecycle

This commit is contained in:
2026-07-08 16:21:59 +02:00
parent 2399a440dd
commit d6d99fb142
3 changed files with 23 additions and 9 deletions
@@ -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
}
}
@@ -82,15 +82,23 @@ internal class PlaybackRepositoryImpl(
@OptIn(ExperimentalCoroutinesApi::class)
private val currentPosition: Flow<Duration> = 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() {
@@ -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()
}
}