Keep voice cleanup independent of caller cancellation and stop playback promptly

This commit is contained in:
evgeny committed 2026-10-29 13:35:19 +01:00
1 parent 48a20cda8c
commit d0d63c1d4b
2 files changed
+3 -2

No files matched your search

@@ -241,10 +241,10 @@ class AudioRecorderManager {
while (true) {
val previous = closing.get()
if (previous != null && !previous.isDone) return previous
val next = CompletableFuture<Unit>()
val next = object : CompletableFuture<Unit>() { override fun cancel(mayInterruptIfRunning: Boolean): Boolean = false }
if (closing.compareAndSet(previous, next)) { result = next; break }
}
captureRunning = false; recordingThread?.interrupt()
captureRunning = false; recordingThread?.interrupt(); stopPlayback()
try {
Thread({
var retryMs = 250L
@@ -185,6 +185,7 @@ class AudioRecorderManagerTest {
val device = plan(); assertTrue(manager.startRecording("7")); device.failures = setOf("release")
val closed = manager.requestClose()
waitUntil { NativeLib.cancels.get() == 1 }
assertFalse(closed.cancel(true))
assertFalse(closed.isDone); assertFalse(NativeLib.active)
assertThrows(IllegalStateException::class.java) { AudioRecorderManager.requireReleasedForCore() }
device.failures = emptySet(); closed.get(2, TimeUnit.SECONDS)