blob: 6e35f7245112622c6f61a9f5a01de6c01bf19750 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.hardware.audio;
const MAX_COUNT_DAI_SUPPORTED_NUMBER_OF_CHANNELS uint32 = 64;
const MAX_COUNT_DAI_SUPPORTED_SAMPLE_FORMATS uint32 = 4;
const MAX_COUNT_DAI_SUPPORTED_FRAME_FORMATS uint32 = 64;
const MAX_COUNT_DAI_SUPPORTED_RATES uint32 = 64;
const MAX_COUNT_DAI_SUPPORTED_BITS_PER_SLOT uint32 = 8;
const MAX_COUNT_DAI_SUPPORTED_BITS_PER_SAMPLE uint32 = 8;
type DaiSampleFormat = strict enum : uint8 {
/// Pulse Density Modulation samples.
PDM = 1;
/// Signed integer Linear Pulse Code Modulation samples, at the host endianness.
PCM_SIGNED = 2;
/// Unsigned integer Linear Pulse Code Modulation samples, at the host endianness.
PCM_UNSIGNED = 3;
/// Floating point samples, encoded per the IEEE-754 standard.
PCM_FLOAT = 4;
};
/// Either a standard or custom frame format.
type DaiFrameFormat = strict union {
/// The format type of all samples in the DAI, listed in `DaiFrameFormatStandard`.
1: frame_format_standard DaiFrameFormatStandard;
/// The format type of all samples in the DAI, specified in `DaiFrameFormatCustom`.
2: frame_format_custom DaiFrameFormatCustom;
};
/// Standard Frame format.
type DaiFrameFormatStandard = strict enum : uint8 {
/// No frame format as in samples without a frame sync like PDM.
NONE = 1;
/// Format as specified in the I2S specification (left justified, 2 channels, 32 bits per
/// channel, frame sync stays low for the left channel and high for the right channel, data
/// starts one clock cycle after frame sync changes clocked out at the falling edge of sclk).
I2S = 2;
/// Left justified, 2 channels. Data starts at frame sync changes from low to high clocked out
/// at the falling edge of sclk. The frame sync must stay high for bits_per_channel bits for the
/// first channel and low for bits_per_channel bits for the second channel.
STEREO_LEFT = 3;
/// Right justified, 2 channels. The frame sync must stay high for bits_per_channel bits for the
/// first channel and low for bits_per_channel bits for the second channel.
STEREO_RIGHT = 4;
/// Left justified, variable number of channels, data starts at frame sync changes from low to
/// high clocked out at the rising edge of sclk. The frame sync must stay high for exactly 1
/// clock cycle.
TDM1 = 5;
/// Left justified, variable number of channels, data starts one clock cycle after the frame
/// sync changes from low to high clocked out at the rising edge of sclk. The frame sync must
/// stay high for exactly 1 clock cycle.
@available(added=10)
TDM2 = 6;
/// Left justified, variable number of channels, data starts two clock cycles after the frame
/// sync changes from low to high clocked out at the rising edge of sclk. The frame sync must
/// stay high for exactly 1 clock cycle.
@available(added=10)
TDM3 = 7;
};
/// Custom Frame format.
type DaiFrameFormatCustom = struct {
/// Justification of the samples within a slot.
left_justified bool;
/// Clocking of data samples and frame sync output on either raising or falling sclk.
/// If true then the sclk raises on the raising edge of the data and frame sync, i.e.
/// the data will be sampled on the falling edge of sclk (the middle of the sclk cycle).
/// Hence, if false then data will be sampled on the raising edge of sclk.
sclk_on_raising bool;
/// Number of sclks between the beginning of a frame sync change and audio samples.
/// For example, for I2S set to 1 and for stereo left justified set to 0.
frame_sync_sclks_offset int8;
/// Number of sclks the frame sync is high within a frame.
/// For example, for I2S with 32 bits slots set to 32, for TDM usually set to 1.
frame_sync_size uint8;
};
/// DAI format. Frames are made up of `number_of_channels` samples which have `bits_per_sample` bits
/// of data within `bits_per_slot` arranged in `frame_format`. For more detailed information see
/// [Digital Audio Interface](https://fuchsia.dev/fuchsia-src/concepts/drivers/driver_architectures/audio_drivers/audio_dai).
type DaiFormat = struct {
/// Number of channels.
number_of_channels uint32;
/// Sets which channels are active via a bitmask.
/// The least significant bit corresponds to channel index 0.
channels_to_use_bitmask uint64;
/// The sample format of all samples.
sample_format DaiSampleFormat;
/// The frame format of all samples.
frame_format DaiFrameFormat;
/// The frame rate for all samples.
frame_rate uint32;
/// The bits per slot for all channels.
bits_per_slot uint8;
/// The bits per sample for all samples. Must be smaller than bits per channel for samples to
/// fit.
bits_per_sample uint8;
};
/// Formats supported by the DAI. Frames are made up of `number_of_channels` samples which have
/// `bits_per_sample` bits of data within `bits_per_slot` bits arranged in `frame_formats`.
/// All values listed in each vector are supported. When not all combinations supported by the driver
/// can be described with one `DaiSupportedFormats`, `GetDaiSupportedFormats` returns more than one
/// `DaiSupportedFormats` in the returned vector.
/// For more detailed information see
/// [Digital Audio Interface](https://fuchsia.dev/fuchsia-src/concepts/drivers/driver_architectures/audio_drivers/audio_dai).
type DaiSupportedFormats = struct {
/// Possible number of channels supported.
number_of_channels vector<uint32>:MAX_COUNT_DAI_SUPPORTED_NUMBER_OF_CHANNELS;
/// Sample formats supported.
sample_formats vector<DaiSampleFormat>:MAX_COUNT_DAI_SUPPORTED_SAMPLE_FORMATS;
/// Frame formats supported.
frame_formats vector<DaiFrameFormat>:MAX_COUNT_DAI_SUPPORTED_FRAME_FORMATS;
/// Rates supported. Values must be listed in ascending order.
frame_rates vector<uint32>:MAX_COUNT_DAI_SUPPORTED_RATES;
/// The bits per slot supported. Values must be listed in ascending order.
bits_per_slot vector<uint8>:MAX_COUNT_DAI_SUPPORTED_BITS_PER_SLOT;
/// Bits per sample supported. Values must be listed in ascending order.
bits_per_sample vector<uint8>:MAX_COUNT_DAI_SUPPORTED_BITS_PER_SAMPLE;
};