Request microphone permission before audio capture starts - #1183
Draft
hiroshihorie wants to merge 1 commit into
Draft
Request microphone permission before audio capture starts#1183hiroshihorie wants to merge 1 commit into
hiroshihorie wants to merge 1 commit into
Conversation
webrtc-sdk/webrtc#265 (m144.7559.12 and later) removed the blocking mic permission request from the AudioEngine device. It now only checks the status and fails with kAudioEngineErrorInsufficientDevicePermission, so requesting permission is the SDK's job. The native plugin gains ensureMicrophoneAccess: authorized passes, denied or restricted fails, and notDetermined requests access, on iOS only while the app is active. An inactive or backgrounded app has the alert deferred by the system, and waiting on it would suspend getUserMedia and the publish queue behind it, so it fails fast instead and the next foreground attempt prompts normally. LocalTrack.createStream calls it for audio on Apple platforms before getUserMedia, which covers publishing, restartTrack on unmute, and pre-connect audio. Failures surface as TrackCreateException through the existing audio engine error mapping.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #1182 (base branch
hiroshi/native-audio-session-preset). Will be rebased ontomainonce that merges. Flutter counterpart of client-sdk-swift #1085.Why
webrtc-sdk/webrtc#265 (first shipped in
m144.7559.12) removed the blocking mic permission request from the AudioEngine device. The pre-enable check is now passive: it returnskAudioEngineErrorInsufficientDevicePermission(-9000) instead of prompting, so requesting permission is the SDK's job.flutter-webrtc still pins
144.7559.09, so this is not load-bearing yet. It is harmless there, sincegetUserMediain flutter-webrtc already prompts and the status is resolved before the device's blocking path runs. Once flutter-webrtc lands.13/.14and the pin here follows, this is what keeps the current behavior. Opening it as a draft for that reason.What Flutter already had
flutter-webrtc's
getUserMediacallsAVCaptureDevice requestAccessForMediaType:and waits for the answer, so every livekit_client mic path (publish,restartTrackon unmute, pre-connect audio) already prompted before the audio device saw the track. That part of #1085 needs no port. #1182 already maps -9000 toTrackCreateExceptionfor the direct ADM entry points (setEngineAvailability,startLocalRecording).What this adds
The one behavior from #1085 that was missing: only prompt while the app can show the alert.
ensureMicrophoneAccessinLiveKitPlugin.swift:authorizedpasses,denied/restrictedfail,notDeterminedrequests access. On iOS the request is only made whileUIApplication.shared.applicationState == .active. An inactive or backgrounded app (locked screen, CallKit wake, app switcher) has the alert deferred by the system, and awaiting it would suspendgetUserMediaand the_publishRunnerbehind it, blocking camera and screen share publishes for as long as the app stays there. Failing fast lets the next foreground attempt prompt normally. macOS can present the prompt regardless, so it always requests. No app extension concern here, the plugin is app-only.LocalTrack.createStreamcalls it forAudioCaptureOptionson Apple platforms beforegetUserMedia. That is the Flutter choke point:LocalAudioTrack.create(),restartTrack()andPreConnectAudioBuffer.startRecording()all reach it. Since the prompt in Flutter happens atgetUserMediarather than at capture start, the gate sits in front of that instead of instartCaptureas in Swift.TrackCreateExceptionthrough thedeviceAccessDeniedcode introduced in Resolve a default audio session from engine state when no policy was pushed #1182.withPreConnectAudioandPreConnectAudioBuffer.startRecordingnow say permission is requested at recording start while foregrounded, and that requesting it earlier in the app lifecycle avoids the prompt delaying the first recording.AudioManager.setEngineAvailabilityalready documents that it does not request permission (Resolve a default audio session from engine state when no policy was pushed #1182).Testing
flutter analyze,flutter test,dart format --set-exit-if-changed,import_sorter --exit-if-changedclean.Native.ensureMicrophoneAccess(no-op when unimplemented, propagatesdeviceAccessDenied). ThecreateStreamgate is behindlkPlatformIsApple()and not reachable from unit tests.Refs CLT-3243, client-sdk-swift#1085