/*
 * Copyright 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.hardware.bluetooth.audio@2.1;

import @2.0::BitsPerSample;
import @2.0::ChannelMode;
import @2.0::CodecCapabilities;
import @2.0::CodecConfiguration;
import @2.0::CodecType;
import @2.0::PcmParameters;
import @2.0::SampleRate;
import @2.0::SessionType;

enum SessionType : @2.0::SessionType {
    /** Used when encoded by Bluetooth Stack and streaming to LE Audio device */
    LE_AUDIO_SOFTWARE_ENCODING_DATAPATH,
    /** Used when decoded by Bluetooth Stack and streaming to audio framework */
    LE_AUDIO_SOFTWARE_DECODED_DATAPATH,
    /** Encoding is done by HW an there is control only */
    LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH,
    /** Decoding is done by HW an there is control only */
    LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH,
};

enum CodecType : @2.0::CodecType {
    LC3 = 0x20,
};

enum SampleRate : @2.0::SampleRate {
    RATE_8000 = 0x100,
    RATE_32000 = 0x200,
};

/** Used for Software Encoding audio feed parameters */
struct PcmParameters {
    SampleRate sampleRate;
    ChannelMode channelMode;
    BitsPerSample bitsPerSample;
    /** Data interval for data transfer */
    uint32_t dataIntervalUs;
};

enum Lc3FrameDuration : uint8_t {
    DURATION_10000US = 0x00,
    DURATION_7500US = 0x01,
};

/**
 * Used for Hardware Encoding/Decoding LC3 codec parameters.
 */
struct Lc3Parameters {
    /* PCM is Input for encoder, Output for decoder */
    BitsPerSample pcmBitDepth;

    /* codec-specific parameters */
    SampleRate samplingFrequency;
    Lc3FrameDuration frameDuration;
    /* length in octets of a codec frame */
    uint32_t octetsPerFrame;
    /* Number of blocks of codec frames per single SDU (Service Data Unit) */
    uint8_t blocksPerSdu;
};

/**
 * Used to specify the capabilities of the LC3 codecs supported by Hardware Encoding.
 */
struct Lc3CodecCapabilities {
    /* This is bitfield, if bit N is set, HW Offloader supports N+1 channels at the same time.
     * Example: 0x27 = 0b00100111: One, two, three or six channels supported.*/
    uint8_t supportedChannelCounts;
    Lc3Parameters lc3Capabilities;
};

/** Used to specify the capabilities of the different session types */
safe_union AudioCapabilities {
    PcmParameters pcmCapabilities;
    CodecCapabilities codecCapabilities;
    Lc3CodecCapabilities leAudioCapabilities;
};

/**
 * Used to configure a LC3 Hardware Encoding session.
 */
struct Lc3CodecConfiguration {
    /* This is also bitfield, specifying how the channels are ordered in the outgoing media packet.
     * Bit meaning is defined in Bluetooth Assigned Numbers. */
    uint32_t audioChannelAllocation;
    Lc3Parameters lc3Config;
};

/** Used to configure either a Hardware or Software Encoding session based on session type */
safe_union AudioConfiguration {
    PcmParameters pcmConfig;
    CodecConfiguration codecConfig;
    Lc3CodecConfiguration leAudioCodecConfig;
};