Platform docs
Auth, users, webhooks & more

Music mode

For live music, karaoke, podcasts, or professional streaming, you may want to capture audio without speech processing. The iOS SDK provides an audio bitrate profile on call.microphone to switch between voice and music during a call.

Music mode

Music mode, also called Hi-Fi audio, is the .musicHighQuality audio bitrate profile. It increases the audio publish bitrate and disables speech processing, including echo cancellation, noise suppression, and automatic gain control, so instruments and backing tracks can pass through.

The SDK supports three profiles:

Profile Use case Speech processing
.voiceStandard Standard voice calls (default) Enabled
.voiceHighQuality Higher-quality speech or podcasts Enabled
.musicHighQuality Live music and unprocessed audio Disabled

The SDK uses the bitrate offered by the SFU for the selected profile. If no profile mapping is available, .voiceHighQuality and .musicHighQuality fall back to 128 kbps. Returning to .voiceStandard restores the negotiated voice bitrate. These values are bitrate limits, not guaranteed throughput.

Use a voice profile when people are talking and music mode when a performer starts playing. You can switch profiles on a running call without leaving and rejoining. Switching into or out of music mode reconfigures audio capture and may briefly interrupt captured audio.

Warning:

Music mode currently requires the device's built-in microphone with speakerphone disabled. Echo cancellation is disabled in this mode.

Allow HiFi audio on the call type

HiFi audio is allowed by default on the livestream call type.

On other call types, turn on Allow HiFi audio in the Stream Dashboard under Video & Audio > Call Types > [call type] > Settings.

Allow HiFi Audio

Both .voiceHighQuality and .musicHighQuality require this setting. Switching back to .voiceStandard does not require it.

Enabling music mode

Join the call before setting the audio bitrate profile:

import StreamVideo

let call = streamVideo.call(callType: "default", callId: "123")
try await call.join()
try await call.microphone.setAudioBitrateProfile(.musicHighQuality)

To return to standard voice capture:

try await call.microphone.setAudioBitrateProfile(.voiceStandard)

For higher-quality speech while keeping speech processing enabled:

try await call.microphone.setAudioBitrateProfile(.voiceHighQuality)

setAudioBitrateProfile is an asynchronous, throwing operation. It can fail if the call is not joined, HiFi audio is not allowed on the call type, call settings cannot be loaded, or the audio configuration cannot be applied. Handle the error in your app and update controls from the published profile rather than assuming the requested change succeeded.

Observing the current profile

call.microphone.audioBitrateProfile is a published property. It updates after a successful change and stays at the previous value if the operation fails.

import Combine

let profileSubscription = call.microphone.$audioBitrateProfile
    .sink { profile in
        let isMusicModeEnabled = profile == .musicHighQuality
        print("Music mode enabled: \(isMusicModeEnabled)")
    }

Retain the subscription for as long as you need to observe changes. In SwiftUI, observe MicrophoneManager with @ObservedObject and read its audioBitrateProfile property to keep your control in sync.

Setting the current profile again is a no-op. The selected profile survives reconnection, but resets to .voiceStandard when you leave. After joining again, select music mode again if needed.

Interaction with noise cancellation

Music mode automatically suspends the audio filter configured with call.setAudioFilter, including Stream's noise cancellation, so it does not suppress music.

Returning to a voice profile restores the requested filter once screen sharing is also inactive. You do not need to manually stop and restart noise cancellation around a music mode change.

Stereo audio

Selecting .musicHighQuality does not automatically enable stereo capture or stereo playback. Stereo playback is configured separately through audio session policies, subject to the device and audio route.

Add Chat to my app: getstream.io/SKILL.md

The fastest way to build with Stream. Start a new project or improve an existing one. Full CLI and documentation integration out of the box.


Ask your agent:

/stream Build me a Social App with Feeds and Moderation.
/stream Any livestream calls running?
/stream Video iOS v1: <Your Question>