blob: fd9cfd2e12b2632bb6c51fe3f611cfbc834216de [file] [log] [blame] [view]
# Digital Audio Interface (DAI)
Caution: This page contains information for the deprecated DAI API.
Caution: This page may contain information that is specific to the legacy
version of the driver framework (DFv1).
The DAI interface is a FIDL protocol exposed by DAI drivers. The DAI interface
controls the configuration of a DAI link for audio data transfer.
## Notation and terminology
- All indices start from 0.
- Vectors of n elements are represented as `<x0,x1,...,xn-1>`, for example a
vector with two elements 5 and 6 as `<5,6>`.
- Vectors can be nested, i.e. `<<5,6>,<7,8>>` represents a vector with 2
vectors in it.
| Term | Definition |
| ---------- | -------------------------------------------------------------- |
| DAI | Digital Audio Interface. Interface between audio HW, for :
: : instance a TDM or PDM link between controllers and codecs. :
| Frame Sync | A DAI signal that marks frame boundaries, a.k.a. LRCLK, SYNC. |
| Sclk | A DAI signal used to mark the data line(s) bits transferring, :
: : a.k.a. SCK, BCLK. :
| Mclk | Master clock, a DAI signal sometimes needed to provide a clock |
: : to DAIs. Sometimes Sclk is used as the Mclk (or Mclk is :
: : derived from the Sclk within the DAI). :
| Frame | The representation of a single moment in time across data, :
: : frame sync and sclk in the DAI. :
| Frame format | A frame's data, frame sync and sclk arrangement, e.g. location |
: : of the frame sync w.r.t. samples in the data line(s). :
| Slot | Within a frame, the bits reserved for a sample. A slot may be |
: : bigger than needed to hold the samples, e.g. 32 bits slot :
: : holding 24 or 16 bits samples. :
| Channel | A single source or destination of audio samples, usually |
: : to be rendered by a single speaker or captured by a single :
: : microphone. Every frame will contain samples in a fixed number :
: : of slots for the same fixed number of channels. :
| Sample | A digital representation of sound taken at a particular time. |
## Basic operation
The DAI client is responsible for configuring the DAI. The driver providing the
DAI interface (from here on the DAI driver) advertises supported formats and
allows the creation of a Ring Buffer for audio sample transferring.
Note that the DAI drivers are expected to perform their own shutdown, just like
any other driver (see the [Drivers](/docs/concepts/drivers/README.md) section).
## Protocol definition
The DAI protocol is defined in FIDL at
[dai.fidl](/sdk/fidl/fuchsia.hardware.audio/dai.fidl) and
[dai_format.fidl](/sdk/fidl/fuchsia.hardware.audio/dai_format.fidl).
Because the FDF does not currently provide a way to directly get a FIDL channel
for communication, we define a way to get a channel through
Banjo at [fuchsia.hardware.audio](/sdk/banjo/fuchsia.hardware.audio/audio.fidl).
Direct connection to a DAI protocol server is provided by
[dai_connector.fidl](/sdk/fidl/fuchsia.hardware.audio/dai_connector.fidl).
### Reset {#reset}
A DAI can be reset by a client at any time by issuing the `Reset` function.
### GetInfo {#get-info}
The `GetInfo` function retrieves information from the DAI including:
1. The manufacturer name.
1. The product name.
### GetDaiFormats {#get-dai-formats}
The `GetDaiFormats` function allows the DAI driver to list its supported formats
for the DAI. The supported formats may include multiple sample formats, rates,
etc. DAI driver provides the supported formats and their clients mandate which
format is to be used in the `CreateRingBuffer` function.
The DAI driver replies with a vector of `DaiSupportedFormats`, where each
`DaiSupportedFormats` includes:
1. A vector of number of channels. This lists the number of channels supported
by the DAI, for example `<2,4,6,8>`. A stereo DAI reports a vector with
one element `<2>`. Note that a DAI that takes one channel and inputs/outputs
its contents in all its inputs/outputs (e.g. 2 for a stereo amplifier) would
report a vector with one element `<1>`, if it supports either one or two
input channels, it would report a vector with two elements `<1,2>`.
2. A vector of sample formats. DAI sample formats, e.g. `PCM_SIGNED`.
3. A vector of frame formats, For example `I2S` or `TDM1`, or the `CUSTOM`
option where `DaiFrameFormatCustom` specifies each parameter of the frame
configuration individually, e.g. `frame_sync_size` and `sclk_on_raising`.
4. A vector of rates. Frame rates, for example 44100, 48000, and 96000.
5. A number of bits per slot. Number of bits in each slot in the DAI,
e.g. 32 bits per slot.
6. A vector of bits per sample. Sample widths, e.g. 24 bits per sample.
Within a single `DaiSupportedFormats`, any combination of provided parameters is
supported.
When not all combinations supported by the DAI can be described with one
`DaiSupportedFormats`, the DAI returns more than one `DaiSupportedFormats` in
the returned vector. For example, if one `DaiSupportedFormats` allows for 32
bits samples at 48KHz, and 16 bits samples at 96KHz, but not 32 bits samples at
96KHz, then the DAI will reply with 2 `DaiSupportedFormats`:
`<<32bits>,<48KHz>>` and `<<16bits>,<96KHz>>`. For simplicity, this example
ignores parameters other than rate and bits per sample. In the case where the
DAI supports either 16 or 32 bits samples at either 48 or 96KHz, the DAI would
reply with 1 `DaiSupportedFormats`: `<<16bits,32bits>,<48KHz,96KHz>>`.
Additionally, it is assumed that bits per sample is always smaller or equal to
bits per slot. Hence, a DAI can report
`<<16bits_per_slot,32bits_per_slot>,<16bits_per_sample,32bits_per_sample>>`
and this does not imply that it is reporting that 32 bits per sample on 16 bits
samples is valid, it specifies only the 3 valid combinations:
1. 16 bits slot with 16 bits samples
2. 32 bits slot with 32 bits samples
3. 32 bits slot with 16 bits samples
### GetRingBufferFormats {#get-ring-buffer-formats}
Same as the streaming interface `GetSupportedFormats` function, see
[Audio Streaming Interface](streaming.md).
### CreateRingBuffer {#create-ring-buffer}
The client specifies both the format to use in the DAI and the format to use in
the ring buffer as part of the creating of the ring buffer in the
`CreateRingBuffer` function.
The DAI format parameter specifies:
1. A number of channels. This is the number of channels in the DAI
(for instance number of channels on a TDM bus, i.e. "on the wire").
2. A channels to use bitmask. These are the channels in the DAI to be used for
data transfer. For example to specify that both channels in an I2S DAI this
must be 3.
3. A sample format.
4. A frame format.
5. A frame rate.
6. A number of bits per slot.
7. A number of bits per sample.
The ring buffer format parameter is the same as the streaming interface
`CreateRingBuffer` function, see
[Audio Streaming Interface](streaming.md).
Once `CreateRingBuffer` is successful, the DAI format configuration is considered
completed and samples can be sent across the DAI once the `RingBuffer` protocol
configuration is completed and the `RingBuffer` `Start` function has been called.
For a description of the ring buffer functionality, see the [Audio Streaming
Interface](streaming.md).
{% comment %}
> TODO(https://fxbug.dev/42142036): Add support for power control.
> TODO(https://fxbug.dev/42142037): Add support for content protection.
{% endcomment %}
## Signal processing {#signal-processing}
Defined at [Audio Signal Processing](signal-processing.md).