// 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 Linear Pulse Code Modulation samples at the host endianness.
    PCM_SIGNED = 2;

    /// Unsigned Linear Pulse Code Modulation samples at the host endianness.
    PCM_UNSIGNED = 3;

    /// Floating point samples IEEE-754 encoded.
    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;
};

/// 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.
    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.
    frame_rates vector<uint32>:MAX_COUNT_DAI_SUPPORTED_RATES;
    /// The bits per slot supported.
    bits_per_slot vector<uint8>:MAX_COUNT_DAI_SUPPORTED_BITS_PER_SLOT;
    /// Bits per sample supported.
    bits_per_sample vector<uint8>:MAX_COUNT_DAI_SUPPORTED_BITS_PER_SAMPLE;
};
