From 95b40c41e41a663b5de61e77942d15318a40f6b2 Mon Sep 17 00:00:00 2001 From: davidliu Date: Tue, 21 Apr 2026 18:14:41 +0900 Subject: [PATCH 1/2] AudioOptions: Added disableAudioPrewarming flag --- .changeset/sharp-bikes-grab.md | 5 +++++ .../main/java/io/livekit/android/LiveKitOverrides.kt | 11 +++++++++++ .../java/io/livekit/android/dagger/InjectionNames.kt | 1 + .../java/io/livekit/android/dagger/OverridesModule.kt | 4 ++++ .../main/java/io/livekit/android/dagger/RTCModule.kt | 11 +++++++++-- 5 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 .changeset/sharp-bikes-grab.md diff --git a/.changeset/sharp-bikes-grab.md b/.changeset/sharp-bikes-grab.md new file mode 100644 index 000000000..3f07836e0 --- /dev/null +++ b/.changeset/sharp-bikes-grab.md @@ -0,0 +1,5 @@ +--- +"client-sdk-android": minor +--- + +AudioOptions: Added disableAudioPrewarming flag diff --git a/livekit-android-sdk/src/main/java/io/livekit/android/LiveKitOverrides.kt b/livekit-android-sdk/src/main/java/io/livekit/android/LiveKitOverrides.kt index 2df843d14..bcc60c54f 100644 --- a/livekit-android-sdk/src/main/java/io/livekit/android/LiveKitOverrides.kt +++ b/livekit-android-sdk/src/main/java/io/livekit/android/LiveKitOverrides.kt @@ -140,6 +140,17 @@ class AudioOptions( * Options for processing the mic and incoming audio. */ val audioProcessorOptions: AudioProcessorOptions? = null, + + /** + * Devices may take some time initializing the audio stack for recording. + * Prewarming allows starting up the underlying audio recording prior to publish, letting + * the audio device be ready immediately when the track is fully published. + * + * If set to true, disables audio recording prewarming (and the related + * [LocalAudioTrack.prewarm] function), and audio resources are only used while the + * track is connected and published. Defaults to false. + */ + val disableAudioPrewarming: Boolean = false, ) /** diff --git a/livekit-android-sdk/src/main/java/io/livekit/android/dagger/InjectionNames.kt b/livekit-android-sdk/src/main/java/io/livekit/android/dagger/InjectionNames.kt index 6efb8680c..e7f098ca0 100644 --- a/livekit-android-sdk/src/main/java/io/livekit/android/dagger/InjectionNames.kt +++ b/livekit-android-sdk/src/main/java/io/livekit/android/dagger/InjectionNames.kt @@ -55,6 +55,7 @@ object InjectionNames { const val OVERRIDE_AUDIO_DEVICE_MODULE = "override_audio_device_module" const val OVERRIDE_AUDIO_PROCESSOR_OPTIONS = "override_audio_processor_options" const val OVERRIDE_JAVA_AUDIO_DEVICE_MODULE_CUSTOMIZER = "override_java_audio_device_module_customizer" + const val OVERRIDE_DISABLE_AUDIO_PREWARM = "override_disable_audio_prewarm" const val OVERRIDE_VIDEO_ENCODER_FACTORY = "override_video_encoder_factory" const val OVERRIDE_VIDEO_DECODER_FACTORY = "override_video_decoder_factory" const val OVERRIDE_AUDIO_HANDLER = "override_audio_handler" diff --git a/livekit-android-sdk/src/main/java/io/livekit/android/dagger/OverridesModule.kt b/livekit-android-sdk/src/main/java/io/livekit/android/dagger/OverridesModule.kt index c12aa5701..ec5f1a034 100644 --- a/livekit-android-sdk/src/main/java/io/livekit/android/dagger/OverridesModule.kt +++ b/livekit-android-sdk/src/main/java/io/livekit/android/dagger/OverridesModule.kt @@ -69,6 +69,10 @@ class OverridesModule(private val overrides: LiveKitOverrides) { @Named(InjectionNames.OVERRIDE_AUDIO_OUTPUT_TYPE) fun audioOutputType() = overrides.audioOptions?.audioOutputType + @Provides + @Named(InjectionNames.OVERRIDE_DISABLE_AUDIO_PREWARM) + fun disableAudioPrewarm() = overrides.audioOptions?.disableAudioPrewarming ?: false + @Provides @Named(InjectionNames.OVERRIDE_PEER_CONNECTION_FACTORY_OPTIONS) fun peerConnectionFactoryOptions() = overrides.peerConnectionFactoryOptions diff --git a/livekit-android-sdk/src/main/java/io/livekit/android/dagger/RTCModule.kt b/livekit-android-sdk/src/main/java/io/livekit/android/dagger/RTCModule.kt index 5ec4e0b7b..1198b13d4 100644 --- a/livekit-android-sdk/src/main/java/io/livekit/android/dagger/RTCModule.kt +++ b/livekit-android-sdk/src/main/java/io/livekit/android/dagger/RTCModule.kt @@ -250,10 +250,17 @@ internal object RTCModule { } @Provides - fun audioPrewarmer(audioDeviceModule: AudioDeviceModule): AudioRecordPrewarmer { - return if (audioDeviceModule is JavaAudioDeviceModule) { + fun audioPrewarmer( + @Named(InjectionNames.OVERRIDE_DISABLE_AUDIO_PREWARM) + disableAudioPrewarm: Boolean, + audioDeviceModule: AudioDeviceModule, + ): AudioRecordPrewarmer { + return if (disableAudioPrewarm) { + NoAudioRecordPrewarmer() + } else if (audioDeviceModule is JavaAudioDeviceModule) { JavaAudioRecordPrewarmer(audioDeviceModule) } else { + LKLog.w { "Custom audio device module detected. Audio record prewarming is not available." } NoAudioRecordPrewarmer() } } From c803276c7572edd67a941781ee1bb0b9a1f90a7b Mon Sep 17 00:00:00 2001 From: davidliu Date: Tue, 21 Apr 2026 19:02:29 +0900 Subject: [PATCH 2/2] spotless --- .../src/main/java/io/livekit/android/LiveKitOverrides.kt | 2 +- .../src/main/java/io/livekit/android/dagger/InjectionNames.kt | 2 +- .../src/main/java/io/livekit/android/dagger/OverridesModule.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/livekit-android-sdk/src/main/java/io/livekit/android/LiveKitOverrides.kt b/livekit-android-sdk/src/main/java/io/livekit/android/LiveKitOverrides.kt index bcc60c54f..6a175b0d4 100644 --- a/livekit-android-sdk/src/main/java/io/livekit/android/LiveKitOverrides.kt +++ b/livekit-android-sdk/src/main/java/io/livekit/android/LiveKitOverrides.kt @@ -1,5 +1,5 @@ /* - * Copyright 2023-2025 LiveKit, Inc. + * Copyright 2023-2026 LiveKit, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/livekit-android-sdk/src/main/java/io/livekit/android/dagger/InjectionNames.kt b/livekit-android-sdk/src/main/java/io/livekit/android/dagger/InjectionNames.kt index e7f098ca0..4d0d8967a 100644 --- a/livekit-android-sdk/src/main/java/io/livekit/android/dagger/InjectionNames.kt +++ b/livekit-android-sdk/src/main/java/io/livekit/android/dagger/InjectionNames.kt @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 LiveKit, Inc. + * Copyright 2023-2026 LiveKit, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/livekit-android-sdk/src/main/java/io/livekit/android/dagger/OverridesModule.kt b/livekit-android-sdk/src/main/java/io/livekit/android/dagger/OverridesModule.kt index ec5f1a034..5dcc77e2a 100644 --- a/livekit-android-sdk/src/main/java/io/livekit/android/dagger/OverridesModule.kt +++ b/livekit-android-sdk/src/main/java/io/livekit/android/dagger/OverridesModule.kt @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 LiveKit, Inc. + * Copyright 2023-2026 LiveKit, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License.