From 28d21abceaa715a2b826721dc1429e15c8a2d41e Mon Sep 17 00:00:00 2001 From: Vinay Guthal Date: Fri, 10 Apr 2026 11:21:21 -0400 Subject: [PATCH 1/2] update android kt to not have blocking audio threads --- .../google/firebase/ai/common/util/android.kt | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/ai-logic/firebase-ai/src/main/kotlin/com/google/firebase/ai/common/util/android.kt b/ai-logic/firebase-ai/src/main/kotlin/com/google/firebase/ai/common/util/android.kt index 9f1bbd37260..f7123c5c554 100644 --- a/ai-logic/firebase-ai/src/main/kotlin/com/google/firebase/ai/common/util/android.kt +++ b/ai-logic/firebase-ai/src/main/kotlin/com/google/firebase/ai/common/util/android.kt @@ -38,17 +38,22 @@ internal fun AudioRecord.readAsFlow() = flow { while (true) { if (recordingState != AudioRecord.RECORDSTATE_RECORDING) { - // delay uses a different scheduler in the backend, so it's "stickier" in its enforcement when - // compared to yield. - delay(0) + // Avoid busy looping when not recording + delay(20) continue } - val bytesRead = read(buffer, 0, buffer.size) + + // Use non-blocking read to avoid leaking threads if the hardware blocks + val bytesRead = read(buffer, 0, buffer.size, AudioRecord.READ_NON_BLOCKING) + if (bytesRead > 0) { emit(buffer.copyOf(bytesRead)) + } else if (bytesRead == 0) { + // No data available yet, wait a bit + delay(10) + } else { + // Error read, small delay to avoid tight loop + delay(50) } - // delay uses a different scheduler in the backend, so it's "stickier" in its enforcement when - // compared to yield. - delay(0) } } From fc9b537e0e6a5421999065df5e9b7079c092bad7 Mon Sep 17 00:00:00 2001 From: Vinay Guthal Date: Fri, 10 Apr 2026 11:39:11 -0400 Subject: [PATCH 2/2] spotless apply --- .../main/kotlin/com/google/firebase/ai/common/util/android.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ai-logic/firebase-ai/src/main/kotlin/com/google/firebase/ai/common/util/android.kt b/ai-logic/firebase-ai/src/main/kotlin/com/google/firebase/ai/common/util/android.kt index f7123c5c554..4041088e64f 100644 --- a/ai-logic/firebase-ai/src/main/kotlin/com/google/firebase/ai/common/util/android.kt +++ b/ai-logic/firebase-ai/src/main/kotlin/com/google/firebase/ai/common/util/android.kt @@ -42,10 +42,10 @@ internal fun AudioRecord.readAsFlow() = flow { delay(20) continue } - + // Use non-blocking read to avoid leaking threads if the hardware blocks val bytesRead = read(buffer, 0, buffer.size, AudioRecord.READ_NON_BLOCKING) - + if (bytesRead > 0) { emit(buffer.copyOf(bytesRead)) } else if (bytesRead == 0) {