blob: 4219c39c2b531cf114acaa16960bfb5a1f06cfef [file] [log] [blame] [view]
# Audio Drivers Architecture
Caution: This page may contain information that is specific to the legacy
version of the driver framework (DFv1).
In Fuchsia there are many ways drivers can be architected as defined by the
number of drivers used, how they communicate and their responsibilities. Audio
drivers responsibilities are determined by the interface(s) exposed to driver
clients, clients could be other drivers or applications users of the drivers
facilities.
## Definitions
| Term | Definition |
| -------------------- | ---------------------------------------------------- |
| Codec | A real or virtual device that encodes/decodes a |
: : signal from digital/analog to/from analog/digital :
: : including all combinations, e.g. digital to digital. :
: : Example codecs include DAC-Amplifiers combos and ADC :
: : converters. :
| Controller or engine | The HW part of a system that manages the audio |
: : signals, for example an SOC's audio subsystem. :
| DAI | Digital Audio Interface. Interface between audio HW, |
: : for instance a TDM or PDM link between controllers :
: : and codecs. :
# Audio interfaces
The main API in use by applications is the
[Audio Streaming Interface](streaming.md). This API allows applications to
capture or render audio. Examples of audio applications using audio drivers with
the streaming interface include
[audio_core](/src/media/audio/audio_core/v1/README.md) and
[audio-driver-ctl](/src/media/audio/tools/audio-driver-ctl). The former is the
core of the audio system (providing software mixing, routing, etc.) and the
latter is a utility used for testing and bringup of new platforms.
A driver providing the streaming interface abstracts the HW functionality
described in the API, but it does not need to be the driver actually configuring
all the HW. A common split in audio HW is to have an audio engine that
configures a DAI communicating with an audio HW codec. In this split we can have
one driver for the audio engine and one for the codec. The
[Codec Interface](codec.md) allows having a driver for the codec implementation
and another driver configuring the audio engine HW including the DAI and driving
the codec(s) configuration. In this configuration the codec(s) are secondary to
the controller. For instance the mt8167-tdm-output was a driver for the MediaTek
MT8167S audio subsystem (audio engine) also providing the streaming interface
for applications and communicating with any codec driver, for example a
[tas58xx](/src/media/audio/drivers/codecs/tas58xx) exposing the codec interface
as shown below:
```
+-----------------+
| audio_core |
+-----------------+
|
Streaming Interface
|
+-----------------+
|mt8167-tdm-output|
+-----------------+
|
Codec Interface
|
+-----------------+
| tas58xx |
+-----------------+
```
Another way to architect drivers with the engine/codec split is to have a codec
providing the streaming audio interface, and the audio engine providing a
[DAI interface](dai.md). For example a
[aml-g12-tdm-dai](/src/media/audio/drivers/aml-g12-tdm/dai.cc) driver for the
AMLogic g12 audio subsystem (audio engine) providing the DAI interface for other
drivers or applications to use, and a codec can drive the engine and provide the
streaming interface to applications like audio-driver-ctl.
```
+-----------------+
|audio-driver-ctl |
+-----------------+
|
Streaming Interface
|
+-----------------+
| codec-driver |
+-----------------+
|
DAI Interface
|
+-----------------+
| aml-g12-tdm-dai |
+-----------------+
```
We can also have a non-driver component use either DAI or codec interface to
access an audio engine or audio HW codec directly. In the figure below we have
Bluetooth Audio providing the streaming interface and making use of the DAI
interface to configure the AMLogic g12 audio subsystem:
```
+-----------------+ Streaming +-----------------+
| BT Stack +-----------------+ audio_core |
+-----------------+ Interface +-----------------+
|
DAI Interface
|
+-----------------+
| aml-g12-tdm-dai |
+-----------------+
```
It is also possible to have both the DAI and codec interfaces in use, for
example tied with another driver providing the streaming interface. An example
usage of this architecture for a system with two different codecs physically
connected to the same DAI stream.
```
+-----------------+
| audio_core |
+-----------------+
|
Streaming Interface
|
+-----------------+
+----------+ glue driver +----------+
| +-----------------+ |
| | |
DAI Interface Codec Interface Codec Interface
| | |
+-----------------+ +-----------------+ +-----------------+
| aml-g12-tdm-dai | | tas-5720 | | tas-5720 |
+-----------------+ +-----------------+ +-----------------+
```
Finally, it is also possible to just have one driver configuring all HW and
exposing the streaming interface. This should be used when there is no logical
DAI or codec HW separation:
```
+-----------------+
| audio_core |
+-----------------+
|
Streaming Interface
|
+-----------------+
|USB audio driver |
+-----------------+
```