# Best practices These recommendations help you ship a reliable audio experience with the Video SDK for macOS. ## Permissions The SDK cannot capture from the microphone until the user has granted microphone access. Add an `NSMicrophoneUsageDescription` entry to your app's `Info.plist` and request permission _before_ you call `startAudio`. - Request microphone access when the user takes an action that needs audio (such as joining a session or clicking "Unmute"), not at app launch. - If the user denies access, surface a clear message and a path to **System Settings > Privacy & Security > Microphone**. For details, see [Requesting Authorization for Media Capture on macOS](https://developer.apple.com/documentation/avfoundation/cameras_and_media_capture/requesting_authorization_for_media_capture_on_macos?language=objc). ## Device selection Desktop users frequently have multiple microphones and speakers (built-in, USB headset, external interface). Offer a settings UI built from `getMicList` and `getSpeakerList` so users can choose, and remember their selection between sessions. For more information, see [Select an audio device](/docs/video-sdk/macos/audio/advanced/#select-an-audio-device). ## Enable audio with a clear action Connect audio in response to an explicit user action, and reflect the connection and mute state prominently in your UI. Connecting audio silently in the background can surprise users and trip permission prompts at unexpected times. ## Show mute and talking status Use the [audio events](/docs/video-sdk/macos/audio/audio-events/) to keep your UI in sync: - Implement `onUserAudioStatusChanged` to show each user's current mute state. - Implement `onUserActiveAudioChanged` to show a talking/active-speaker indicator. ## Host controls When you mute everyone with [`muteAllAudio`](/docs/video-sdk/macos/audio/host-controls/#mute-everyone), decide deliberately whether to allow users to unmute themselves, and communicate that state in your UI so participants understand why their unmute control is or isn't available. ## Lifecycle Stop audio when the user explicitly leaves the session. Keep audio connection and mute state in your view model so it survives view reloads.