diff --git a/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/type/AudioHelper.kt b/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/type/AudioHelper.kt index 35edac88db0..07219617cee 100644 --- a/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/type/AudioHelper.kt +++ b/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/type/AudioHelper.kt @@ -69,6 +69,21 @@ internal class AudioHelper { } } + fun stopRecording() { + if ( + ::audioRecord.isInitialized && audioRecord.recordingState == AudioRecord.RECORDSTATE_RECORDING + ) { + audioRecord.stop() + } + } + + fun start() { + if ( + ::audioRecord.isInitialized && audioRecord.recordingState != AudioRecord.RECORDSTATE_RECORDING + ) { + audioRecord.startRecording() + } + } @RequiresPermission(Manifest.permission.RECORD_AUDIO) fun startRecording(): Flow<ByteArray> { @@ -110,10 +125,16 @@ internal class AudioHelper { return flow { val buffer = ByteArray(bufferSize) while (!stopRecording) { - val bytesRead = audioRecord.read(buffer, 0, buffer.size) - if (bytesRead > 0) { - emit(buffer.copyOf(bytesRead)) + if (audioRecord.recordingState != AudioRecord.RECORDSTATE_RECORDING) { + buffer.fill(0x00) + continue } + try { + val bytesRead = audioRecord.read(buffer, 0, buffer.size) + if (bytesRead > 0) { + emit(buffer.copyOf(bytesRead)) + } + } catch (_: Exception) {} } } } diff --git a/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/type/LiveSession.kt b/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/type/LiveSession.kt index b3bdae1f707..ea310ceb410 100644 --- a/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/type/LiveSession.kt +++ b/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/type/LiveSession.kt @@ -183,8 +183,13 @@ internal constructor( private fun playServerResponseAudio() { CoroutineScope(backgroundDispatcher).launch { while (isRecording) { - val x = playBackQueue.poll() ?: continue - audioHelper?.playAudio(x) + val data = playBackQueue.poll() + if (data == null) { + audioHelper?.start() + continue + } + audioHelper?.stopRecording() + audioHelper?.playAudio(data) } } }