From c39a586f7a6ca6b3b2ccffc352b33ebe163ebc24 Mon Sep 17 00:00:00 2001 From: "muthuraj.mr" Date: Sat, 24 Oct 2026 16:33:47 +0530 Subject: [PATCH] fix(jvm): clear a previous error when opening new media; Linux clearError no longer blocks on Main Windows kept _error in a plain field and never cleared it on open, so one failed source left error set for every later successful one, and Compose did not observe it (#253). It is now snapshot state, cleared at the start of each open. Linux clearError() did runBlocking(Dispatchers.Main), which deadlocks when called from the UI thread; snapshot state can be written directly. --- .../composemediaplayer/linux/LinuxVideoPlayerState.kt | 5 ++--- .../composemediaplayer/windows/WindowsVideoPlayerState.kt | 4 +++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/mediaplayer/src/jvmMain/kotlin/io/github/kdroidfilter/composemediaplayer/linux/LinuxVideoPlayerState.kt b/mediaplayer/src/jvmMain/kotlin/io/github/kdroidfilter/composemediaplayer/linux/LinuxVideoPlayerState.kt index bb7d8ec5..5e094ec1 100644 --- a/mediaplayer/src/jvmMain/kotlin/io/github/kdroidfilter/composemediaplayer/linux/LinuxVideoPlayerState.kt +++ b/mediaplayer/src/jvmMain/kotlin/io/github/kdroidfilter/composemediaplayer/linux/LinuxVideoPlayerState.kt @@ -713,9 +713,8 @@ class LinuxVideoPlayerState : VideoPlayerState { } override fun clearError() { - runBlocking { - withContext(Dispatchers.Main) { error = null } - } + // Snapshot state can be written from any thread; blocking on Main deadlocked when called from the UI thread. + error = null } override fun toggleFullscreen() { diff --git a/mediaplayer/src/jvmMain/kotlin/io/github/kdroidfilter/composemediaplayer/windows/WindowsVideoPlayerState.kt b/mediaplayer/src/jvmMain/kotlin/io/github/kdroidfilter/composemediaplayer/windows/WindowsVideoPlayerState.kt index a2eb89e7..ce571259 100644 --- a/mediaplayer/src/jvmMain/kotlin/io/github/kdroidfilter/composemediaplayer/windows/WindowsVideoPlayerState.kt +++ b/mediaplayer/src/jvmMain/kotlin/io/github/kdroidfilter/composemediaplayer/windows/WindowsVideoPlayerState.kt @@ -194,7 +194,7 @@ class WindowsVideoPlayerState : VideoPlayerState { } } - private var _error: VideoPlayerError? = null + private var _error: VideoPlayerError? by mutableStateOf(null) override val error get() = _error override fun clearError() { @@ -498,6 +498,8 @@ class WindowsVideoPlayerState : VideoPlayerState { mediaOperationMutex.withLock { try { isLoading = true + // An error from a previous source must not stick to this one. + clearError() // Stop playback and release existing resources val wasPlaying = _isPlaying