Delivering an immersive sound expertise with Spatial Audio


Posted by Nevin Mital – Developer Relations Engineer, Android Media

In Android 13 (API degree 33), we launched a brand new standardized platform structure for spatial audio, a premium and extra participating sound expertise. With spatial audio, your content material sounds extra sensible to customers by making it sound as if they’re in the course of the motion. The person devices from a band may be separated and “positioned” across the consumer, or the sound from a whale may develop because it approaches from behind and taper off because it swims away. Learn on to study extra about Android’s assist for spatial audio and methods to implement the function in your app.

Spatial audio on Android

There are two most important distinctions of spatial audio:

  • With static spatial audio, the sounds are anchored to the consumer and transfer with them. A hen chirping to their left will all the time be on their left, regardless of how they flip or transfer their head.
  • With spatial audio with head monitoring, the sounds are positioned within the setting across the consumer. By turning their head to the left, the consumer will now hear the hen chirping in entrance of them.

On Android, solely multi-channel audio configured with the suitable AudioAttributes and AudioFormat is spatialized by default, although OEMs can customise this conduct. On gadgets the place the OEM has built-in a spatializer impact, static spatial audio will work when any headset is related to the machine, although head-tracked spatial audio requires a headset with appropriate head monitoring sensors. OEMs like Pixel, OnePlus, and Xiaomi have already made these experiences accessible to their customers.

Implementing & testing spatial audio

The simplest approach to combine with this function is to make use of ExoPlayer! If you happen to use ExoPlayer from Jetpack Media3 launch 1.0.0 or newer, ExoPlayer will configure the decoder to stop multi-channel audio from being downmixed to stereo and the default monitor choice conduct will have in mind whether or not or not spatialization is feasible. This implies your content material simply wants to incorporate a multi-channel audio monitor that ExoPlayer can choose. ExoPlayer will monitor the machine’s state and choose a multi-channel monitor when spatialization is feasible, or change to a stereo monitor if not.

Android 12L (API degree 32) added the brand new Spatializer class to assist you to question the spatialization capabilities of the machine. There are 4 situations that should all be true for the machine to output spatialized audio:

val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
val spatializer = audioManager.spatializer

if (

spatializer.immersiveAudioLevel != Spatializer.SPATIALIZER_IMMERSIVE_LEVEL_NONE

&& spatializer.isEnabled

&& spatializer.isAvailable

&& spatializer.canBeSpatialized(audioAttributes, audioFormat)
) {

} else {


ExoPlayer performs these checks when deciding which audio monitor to pick out. To additional examine if head monitoring is offered, you may name the isHeadTrackerAvailable() methodology. The Spatializer class additionally contains the next listeners to have the ability to react to modifications within the machine’s state:


For modifications in whether or not the spatializer is enabled or available.


For modifications in whether or not head tracking is offered.

With these indicators, you may manually modify your playback for spatial audio. Notice that in case you are not utilizing ExoPlayer, it’s best to make certain to configure the decoder to output multi-channel audio when potential by setting the max channel rely to a big quantity with MediaFormat.setInteger(MediaFormat.KEY_MAX_OUTPUT_CHANNEL_COUNT, ##). See how ExoPlayer does this on GitHub. There are two methods to stop spatialization relying in your use-case. In case your audio is already spatialized, name setIsContentSpatialized(true) when configuring the AudioAttributes to your audio stream to stop the audio from being double-processed. In all different circumstances, you may as an alternative name setSpatializationBehavior(AudioAttributes.SPATIALIZATION_BEHAVIOR_NEVER) to disable spatialization altogether.

As talked about beforehand, utilizing spatial audio requires a supported machine (that’s, getImmersiveAudioLevel() does not return SPATIALIZER_IMMERSIVE_LEVEL_NONE) and a related headset. To check spatial audio, begin by ensuring the function is enabled in settings:

  • For wired headsets, go to System settings > Sound & vibration > Spatial audio.
  • For wi-fi headsets, go to System settings > Linked gadgets > Gear icon to your wi-fi machine > Spatial audio.

Notice that for spatial audio with head monitoring, the headset will need to have head monitoring sensors which are appropriate with the machine, corresponding to Pixel Buds Professional with a Pixel telephone, and head monitoring should even be enabled in settings.

Subsequent steps

Listening to is believing, so we extremely suggest attempting out spatial audio for your self! You’ll be able to see an instance implementation in our pattern app, Universal Android Music Player. And for extra particulars on every thing mentioned right here, take a look at our spatial audio developer guide.


Related Articles

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button