-
Notifications
You must be signed in to change notification settings - Fork 103
Open
Labels
bugSomething isn't workingSomething isn't working
Description
Describe the bug
Fatal java.lang.AssertionError
occurs in WebRtcAudioRecord.assertTrue()
when attempting to enable microphone through LocalParticipant.setMicrophoneEnabled(true)
. The crash happens during audio recording prewarm phase in the WebRTC native layer, despite all required permissions being properly granted.
Expected behavior
Microphone should be enabled successfully without throwing an assertion error. The setMicrophoneEnabled(true)
call should complete normally and allow audio recording to proceed.
Stack trace
Fatal Exception: java.lang.AssertionError: Expected condition to be true
at livekit.org.webrtc.audio.WebRtcAudioRecord.assertTrue(WebRtcAudioRecord.java:739)
at livekit.org.webrtc.audio.WebRtcAudioRecord.startRecordingImpl(WebRtcAudioRecord.java:582)
at livekit.org.webrtc.audio.WebRtcAudioRecord.prewarmRecordingIfNeeded(WebRtcAudioRecord.java:535)
at livekit.org.webrtc.audio.JavaAudioDeviceModule.prewarmRecording(JavaAudioDeviceModule.java:462)
at io.livekit.android.audio.JavaAudioRecordPrewarmer.prewarm(AudioRecordPrewarmer.kt:47)
at io.livekit.android.room.track.LocalAudioTrack.prewarm(LocalAudioTrack.kt:91)
at io.livekit.android.room.participant.LocalParticipant.setTrackEnabled(LocalParticipant.kt:368)
at io.livekit.android.room.participant.LocalParticipant.setTrackEnabled$default(LocalParticipant.kt:334)
at io.livekit.android.room.participant.LocalParticipant.setMicrophoneEnabled(LocalParticipant.kt:306)
at io.livekit.android.compose.local.RoomLocalKt$rememberLiveKitRoom$audioOnce$1$ret$1.invokeSuspend(RoomLocal.kt:162)
at io.livekit.android.compose.local.RoomLocalKt$rememberLiveKitRoom$audioOnce$1$ret$1.invoke(:13)
at io.livekit.android.compose.local.RoomLocalKt$rememberLiveKitRoom$audioOnce$1$ret$1.invoke(:8)
at io.livekit.android.compose.local.RoomLocalKt$HandleRoomState$1$1$2.invokeSuspend(RoomLocal.kt:61)
at io.livekit.android.compose.local.RoomLocalKt$HandleRoomState$1$1$2.invoke(:8)
at io.livekit.android.compose.local.RoomLocalKt$HandleRoomState$1$1$2.invoke(:4)
at kotlinx.coroutines.flow.FlowKt__MergeKt$mapLatest$1.invokeSuspend(Merge.kt:213)
at kotlinx.coroutines.flow.FlowKt__MergeKt$mapLatest$1.invoke(:13)
at kotlinx.coroutines.flow.FlowKt__MergeKt$mapLatest$1.invoke(:4)
at kotlinx.coroutines.flow.internal.ChannelFlowTransformLatest$flowCollect$3$1$2.invokeSuspend(Merge.kt:30)
at kotlinx.coroutines.flow.internal.ChannelFlowTransformLatest$flowCollect$3$1$2.invoke(:8)
at kotlinx.coroutines.flow.internal.ChannelFlowTransformLatest$flowCollect$3$1$2.invoke(:4)
at kotlinx.coroutines.intrinsics.UndispatchedKt.startCoroutineUndispatched(Undispatched.kt:20)
at kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:360)
at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:134)
at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch(Builders.common.kt:52)
at kotlinx.coroutines.BuildersKt.launch(:1)
at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch$default(Builders.common.kt:43)
at kotlinx.coroutines.BuildersKt.launch$default(:1)
at kotlinx.coroutines.flow.internal.ChannelFlowTransformLatest$flowCollect$3$1.emit(Merge.kt:29)
at kotlinx.coroutines.flow.StateFlowImpl.collect(StateFlow.kt:401)
at kotlinx.coroutines.flow.StateFlowImpl$collect$1.invokeSuspend(:15)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100)
at androidx.compose.ui.platform.AndroidUiDispatcher.performTrampolineDispatch(AndroidUiDispatcher.android.kt:79)
at androidx.compose.ui.platform.AndroidUiDispatcher.access$performTrampolineDispatch(AndroidUiDispatcher.android.kt:41)
at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.run(AndroidUiDispatcher.android.kt:57)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Device Info:
- OS: Android 8.1.0 (API 27)
- LiveKit SDK version: 2.17.0
- LiveKit Compose Components version: 1.3.1
- Device Specs:
- RAM Free: 1.08 GB
- Disk Free: 5.46 GB
- Orientation: Portrait
- Rooted: No
Additional context
- All permissions are properly granted:
RECORD_AUDIO
,MODIFY_AUDIO_SETTINGS
,INTERNET
,ACCESS_NETWORK_STATE
- This is NOT a permissions issue - the crash occurs at the WebRTC native layer despite having all required permissions
- Dependencies used:
livekit-lib = { group = "io.livekit", name = "livekit-android", version = "2.17.0" } livekit-components = { group = "io.livekit", name = "livekit-android-compose-components", version = "1.3.1" }
- Potential causes: Compatibility issues with older Android API level (27)
- Impact: Application crashes when attempting to enable microphone functionality
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't working