This page describes the audio architecture of Ubuntu Touch and outlines several details.
- Android Audio HAL
General audio architecture
Pulseaudio includes a module to use the Android Audio HAL layer to deal with audio in a generic way on Android based devices. We've forked the upstream project from Jolla at some point and added some additional features like earphone hotplug etc.
All management of the things exposed by Pulseaudio is currently done by telepathy-ofono. It keeps control over which output and input are selected for audio. It also switches the necessary bits to enable support for voicecalls or to enable HFP when available.
Call Audio routing
When a call comes in basically three components are involved into this for audio routing:
The following sequence diagram gives a short overview of what happens when a call comes in and is picked up by the user.
HFP Audio Setup
For HFP audio setup the following components are involved:
The procedure to setup HFP looks like this
- At system startup ofono registers a profile handler for HFP with bluez
- When a HFP profile is connected the actual connection setup is done by ofono but triggered by bluez through the registered profile handler
PulseAudio waits for a bluetooth device with HFP support gets connected and then export a card object for it which has three possible profiles to select from: a2dp_sink, headset_head_unit, off
Once a service level connection for HFP between both sides is established ofono exports a org.ofono.HandsfreeAudioCard instance
- When a call comes in telepathy-ofono sets the headset_head_unit profile for the available bluetooth audio card
Once ofono has established the SCO connection it hands over a file descriptor to PulseAudio by calling the NewConnection method of the registered object which implements the org.ofono.HandsfreeAudioAgent interface.
Once PulseAudio gets the file descriptor for the SCO handed over it streams all audio on that channel.
When the call with the remote party is over telepathy-ofono switches the profile of the PulseAudio card back to a2dp_sink or off which thne causes PulseAudio to call org.ofono.HandsfreeAudioCard.Disconnect which closes the whole SCO connection to the remote side