// 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.bluetooth.bredr;

using fuchsia.hardware.audio;
using zx;

enum ScoErrorCode {
    FAILURE = 1;
    CANCELLED = 2;
    INVALID_ARGUMENTS = 3;
};

/// Codec parameter sets defined in the Hands-Free Profile specification (v1.8, section 5.7).
enum HfpParameterSet : uint8 {
    MSBC_T1 = 1;
    MSBC_T2 = 2;
    CVSD_S1 = 3;
    CVSD_S2 = 4;
    CVSD_S3 = 5;
    CVSD_S4 = 6;
    CVSD_D0 = 7;
    CVSD_D1 = 8;
};

/// The coding format used for synchronous connection data.
enum CodingFormat : uint8 {
    MULAW = 1;
    ALAW = 2;
    CVSD = 3;
    TRANSPARENT = 4;
    LINEAR_PCM = 5;
    MSBC = 6;
};

/// Indicates the audio transport that should be used for the data on a synchronous
/// connection.
enum DataPath : uint8 {
    /// The HCI transport.
    HOST = 1;

    /// Transport audio data directly between the controller and the audio hardware.
    // TODO(fxbug.dev/62161): Document how offloading is configured.
    OFFLOAD = 2;

    /// The audio test mode transport. See Core Spec v5.2, Vol 4, Part E, Section 7.6.2 for details.
    TEST = 3;
};

table ScoConnectionParameters {
    /// Set of SCO parameters from the Hands-Free Profile specification.
    /// Required.
    1: HfpParameterSet parameter_set;

    /// The over-the-air coding format used for transmitted and received data.
    /// Required.
    2: CodingFormat air_coding_format;

    /// Frame size produced by the codec in the context of over-the-air coding.
    /// Required.
    3: uint16 air_frame_size;

    /// Host-controller data rate in bytes/second.
    /// Required.
    4: uint32 io_bandwidth;

    /// The coding format used over the transport.
    /// Required.
    5: CodingFormat io_coding_format;

    /// The number of bits in each sample/frame of data.
    /// Required.
    6: uint16 io_frame_size;

    /// The data format over the transport for linear samples.
    /// Ignored for non-linear coding formats.
    /// Optional.
    /// SIGNED indicates 2's complement sign encoding.
    /// FLOAT is not supported.
    7: fuchsia.hardware.audio.SampleFormat io_pcm_data_format;

    /// For linear samples, indicates how many bit positions the MSB of the sample is away
    /// from the MSB of the data.
    /// Ignored for non-linear coding formats.
    /// Optional.
    /// Default: 0.
    8: uint8 io_pcm_sample_payload_msb_position;

    /// The data transport.
    /// Required.
    9: DataPath path;
};

resource table ScoConnection {
    /// Socket for transmitting/receiving data over the synchronous connection.
    /// Closing the socket will close the connection.
    /// If audio is offloaded, data written to the socket will be dropped and reads will fail.
    1: zx.handle:SOCKET socket;
};

/// Represents an active synchronous connection request by a profile.
/// Either `Connected()` or `Error()` will be called and then server will close the protocol.
protocol ScoConnectionReceiver {
    /// Called upon successful connection establishment.
    Connected(ScoConnection connection);

    /// Called when connection establishment fails or is cancelled by the host.
    Error(ScoErrorCode error);
};
