diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/StreamAudioMixer.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/StreamAudioMixer.kt index fc92001c..b87ed90d 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/StreamAudioMixer.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/StreamAudioMixer.kt @@ -24,6 +24,16 @@ internal object StreamAudioMixer { LogManager.addLog("INFO", "stream", "mixer input detached id=${input.id} count=${inputs.size}") } + /** После join всех viewers, вне main thread; запуск новых viewers блокирует CallController. */ + fun awaitIdle() { + val closing = synchronized(lock) { + check(inputs.isEmpty()) { "Stream mixer still has ${inputs.size} inputs after viewer release" } + worker + } + closing?.join() + LogManager.addLog("INFO", "stream", "shared audio output released for call") + } + private fun run() { val audio = StreamAudioOutput(log = { LogManager.addLog("INFO", "stream", "mixer $it") }) val mix = StreamMixBuffer() diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/StreamPlayerEngine.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/StreamPlayerEngine.kt index 6685f831..48071025 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/StreamPlayerEngine.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/StreamPlayerEngine.kt @@ -33,7 +33,10 @@ class StreamPlayerEngine(private val group: Long, private val source: Long, priv player.mutableStatus.value = R.string.stream_ended player.stop() } - withContext(Dispatchers.IO) { for (player in stopped) player.worker?.join() } + withContext(Dispatchers.IO) { + for (player in stopped) player.worker?.join() + StreamAudioMixer.awaitIdle() + } players.removeAll(stopped.toSet()) mutableViewing.value = players.isNotEmpty() LogManager.addLog("INFO", "stream", "viewers released for call count=${stopped.size}")