// 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;

using zx;
using fuchsia.hardware.audio.signalprocessing;

/// Textual information about the codec.
@available(deprecated=11, removed=12)
type CodecInfo = struct {
    /// Unique identifier for the codec.
    unique_id string:UNIQUE_ID_SIZE;

    /// Name of the codec manufacturer.
    manufacturer string:MAX_UI_STRING_SIZE;

    /// Product name of the codec.
    product_name string:MAX_UI_STRING_SIZE;
};

@available(added=20)
type CodecProperties = table {
    /// Driver type is input (true) or output (false)
    /// If not included, then the driver may be used for both input and output.
    ///
    /// Optional.
    1: is_input bool;

    /// UI string for the manufacturer name. If not included, the manufacturer is unspecified.
    ///
    /// Optional.
    2: manufacturer string:MAX_UI_STRING_SIZE;

    /// UI string for the product name. If not included, the product name is unspecified.
    ///
    /// Optional.
    3: product string:MAX_UI_STRING_SIZE;

    /// Unique identifier for the codec.
    /// If not included, there is no unique id for the Codec.
    ///
    /// Optional.
    4: unique_id array<uint8, UNIQUE_ID_SIZE>;

    /// Plug Detect Capabilities.
    ///
    /// Required.
    5: plug_detect_capabilities PlugDetectCapabilities;
};

/// Gain type of representation.
///
/// # Deprecation
///
/// Not needed anymore since the functionality is available in the signal processing API defined
/// at //sdk/fidl/fuchsia.hardware.audio.signalprocessing. Use a `Gain` `Element` instead, see
/// //sdk/fidl/fuchsia.hardware.audio.signalprocessing/gain.fidl.
@available(deprecated=9, removed=12)
type GainType = strict enum : uint8 {
    /// Gain specified in dB, for example -103.0dB or +3.2dB.
    DECIBELS = 1;

    /// Gain specified as a percentage, for example 10.0% or 80.5%.
    PERCENT = 2;
};

/// Gain format/parameters.
///
/// # Deprecation
///
/// Not needed anymore since the functionality is available in the signal processing API defined
/// at //sdk/fidl/fuchsia.hardware.audio.signalprocessing. Use a `Gain` `Element` instead, see
/// //sdk/fidl/fuchsia.hardware.audio.signalprocessing/gain.fidl.
@available(deprecated=9, removed=12)
type GainFormat = table {
    /// Specifies what the numbers for gain represent, e.g. a percentage.
    ///
    /// Required.
    1: type GainType;

    /// Minimum gain.
    ///
    /// Required.
    2: min_gain float32;

    /// Maximum gain.
    ///
    /// Required.
    3: max_gain float32;

    /// Gain step in decibels, this value must not be negative, but may be zero to convey an
    /// effectively continuous range of values. Must not exceed `max_gain_db` - `min_gain_db`.
    ///
    /// Required.
    4: gain_step float32;

    /// Gain mute capability. If not included, mute is not supported.
    ///
    /// Optional.
    5: can_mute bool;

    /// Automatic Gain Control (AGC) capability. If not included, AGC is not supported.
    ///
    /// Optional.
    6: can_agc bool;
};

/// Codec format information.
type CodecFormatInfo = table {
    /// The driver's best estimate of the external delay (in nanoseconds) present in the pipeline
    /// for the chosen format. When precisely synchronizing presentation across multiple entities
    /// (e.g. devices), the external delay should be taken into account.
    /// If not included `external_delay` is unknown.
    ///
    /// Optional.
    1: external_delay zx.Duration;

    /// The driver's best estimate of the amount of time (in nanoseconds) it takes the hardware to
    /// actually start playback/capture after a `Start` command is issued.
    /// It may take some time for the hardware to get into fully operational mode, for example due
    /// a power state change. This delay must be taken into account if not getting the initial audio
    /// samples played or captured is not acceptable.
    /// If not included `turn_on_delay` is unknown.
    ///
    /// Optional.
    2: turn_on_delay zx.Duration;

    /// The driver's best estimate of the amount of time (in nanoseconds) it takes the hardware to
    /// actually stop playback/capture after a `Stop` command is issued.
    /// It may take some time for the hardware to get into fully stopped mode, for example due
    /// a power state change. This delay must be taken into account if playback/capture of samples
    /// after a 'Stop' command is not acceptable.
    /// If not included, the turn off delay is unknown.
    ///
    /// Optional.
    3: turn_off_delay zx.Duration;
};

/// For an overview see
/// [[Audio Codec Interface]](https://fuchsia.dev/fuchsia-src/development/audio/drivers/codec).
/// # Deprecation
///
/// Not supported anymore, instead use an
/// [Audio Composite](https://fuchsia.dev/fuchsia-src/development/audio/drivers/composite)
/// with one DAI and no Ring Buffer, see
/// [Audio Drivers Architecture](https://fuchsia.dev/fuchsia-src/development/audio/drivers/architecture)
@available(deprecated=20)
closed protocol Codec {
    /// Allows providing driver health state.
    compose Health;

    /// Allows providing signal processing capabilities.
    compose fuchsia.hardware.audio.signalprocessing.Connector;

    /// Resets the codec.
    /// `Reset` returns when the reset is completed. If the driver can't successfully reset the
    /// codec it will close the codec protocol channel, in this case the client may obtain a new
    /// codec protocol channel and retry.
    strict Reset() -> ();

    /// Retrieves textual information about the codec.
    @available(deprecated=11, removed=12)
    strict GetInfo() -> (struct {
        info CodecInfo;
    });

    /// Retrieves top level static properties.
    @available(added=20)
    strict GetProperties() -> (struct {
        properties CodecProperties;
    });

    /// Stops the codec operation.
    /// `Stop` returns when configuring the codec to stop is completed. This method does not wait
    /// for the hardware to actually stop playback/capture (i.e. `turn_off_delay` impact is not
    /// taken into account), nor is any such delay reflected in the returned `stop_time`.
    /// `stop_time` indicates when the driver finished configuring the codec to stop, as measured
    /// in the CLOCK_MONOTONIC timeline.
    /// If the driver cannot successfully configure the codec to stop, it will close the codec
    /// protocol channel, in which case the client may obtain a new codec protocol channel and retry.
    strict Stop() -> (struct {
        @available(removed=20)
        start_time zx.Time;

        @available(added=20)
        stop_time zx.Time;
    });

    /// Start/Re-start the codec operation.
    /// `Start` returns when configuring the codec to start is completed. This method does not wait
    /// for the hardware to actually start playback/capture (i.e. `turn_on_delay` impact is not taken
    /// into account), nor is any such delay reflected in the returned `start_time`.
    /// `start_time` indicates when the driver finished configuring the codec to start, as measured
    /// in the CLOCK_MONOTONIC timeline.
    /// If the driver can't successfully start the codec, it will close the codec protocol channel,
    /// in which case the client may obtain a new codec protocol channel and retry.
    strict Start() -> (struct {
        start_time zx.Time;
    });

    /// Returns whether a codec is bridgeable.
    ///
    /// # Deprecation
    ///
    /// Not supported anymore, bridged configurations are no longer changeable at runtime.
    /// A driver can still be configured to operate in bridged mode or not at boot time.
    @available(deprecated=17)
    strict IsBridgeable() -> (struct {
        supports_bridged_mode bool;
    });

    /// Sets a codec's bridged mode. This method is required, but it only needs to take action if
    /// the codec supports bridged mode as specified by its reply to `IsBridgeable`.
    ///
    /// # Deprecation
    ///
    /// Not supported anymore, bridged configurations are no longer changeable at runtime.
    /// A driver can still be configured to operate in bridged mode or not at boot time.
    @available(deprecated=17)
    strict SetBridgedMode(struct {
        enable_bridged_mode bool;
    });

    /// Retrieves the DAI formats supported by the codec, if not available at the time the codec
    /// may reply with an error status and the controller may retry at a later time.
    /// Retrieving multiple DaiSupportedFormats allows for cases where exclusive
    /// combinations of the parameters in DaiSupportedFormats may be supported.
    strict GetDaiFormats() -> (struct {
        formats vector<DaiSupportedFormats>:MAX_COUNT_FORMATS;
    }) error zx.Status;

    /// Sets the DAI format to be used in the interface between the controller and codec.
    /// Returns an error if not supported at the time of the request (e.g. for removable hardware).
    strict SetDaiFormat(struct {
        format DaiFormat;
    }) -> (struct {
        state CodecFormatInfo;
    }) error zx.Status;

    /// Retrieves gain format.
    ///
    /// # Deprecation
    ///
    /// Not needed anymore since the functionality is available in the signal processing API defined
    /// at //sdk/fidl/fuchsia.hardware.audio.signalprocessing. Use a `Gain` `Element` instead, see
    /// //sdk/fidl/fuchsia.hardware.audio.signalprocessing/gain.fidl.
    @available(deprecated=9, removed=12)
    strict GetGainFormat() -> (struct {
        gain_format GainFormat;
    });

    /// Retrieves Plug Detect Capabilities.
    @available(deprecated=11, removed=12)
    strict GetPlugDetectCapabilities() -> (struct {
        plug_detect_capabilities PlugDetectCapabilities;
    });

    /// Get the gain state via a hanging get. The driver will reply to the first `WatchGainState`
    /// sent by the client and this reply must include a `gain_db` set to 0dB or lower. The driver
    /// will not respond to subsequent client `WatchGainState` calls until the gain state changes
    /// from what was most recently reported.
    ///
    /// # Deprecation
    ///
    /// Not needed anymore since the functionality is available in the signal processing API defined
    /// at //sdk/fidl/fuchsia.hardware.audio.signalprocessing. Use a `Gain` `Element` instead, see
    /// //sdk/fidl/fuchsia.hardware.audio.signalprocessing/gain.fidl.
    @available(deprecated=9, removed=12)
    strict WatchGainState() -> (struct {
        gain_state GainState;
    });

    /// Client update of the gain state.
    ///
    /// # Deprecation
    ///
    /// Not needed anymore since the functionality is available in the signal processing API defined
    /// at //sdk/fidl/fuchsia.hardware.audio.signalprocessing. Use a `Gain` `Element` instead, see
    /// //sdk/fidl/fuchsia.hardware.audio.signalprocessing/gain.fidl.
    @available(deprecated=9, removed=12)
    strict SetGainState(struct {
        target_state GainState;
    });

    /// Get the plug detect state via a hanging get. The driver will reply to the first
    /// `WatchPlugState` sent by the client. The driver will not respond to subsequent client
    /// `WatchPlugState` calls until the plug state changes from what was most recently reported.
    strict WatchPlugState() -> (struct {
        plug_state PlugState;
    });
};

/// # Deprecation
///
/// Not supported anymore, instead use an
/// [Audio Composite](https://fuchsia.dev/fuchsia-src/development/audio/drivers/composite)
/// with one DAI and no Ring Buffer, see
/// [Audio Drivers Architecture](https://fuchsia.dev/fuchsia-src/development/audio/drivers/architecture)
@available(deprecated=20)
service CodecService {
    codec client_end:Codec;
};
