/*
 * Copyright (C) 2018 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.audio.common@5.0;

/*
 *
 *  IDs and Handles
 *
 */

/**
 * Handle type for identifying audio sources and sinks.
 */
typedef int32_t AudioIoHandle;

/**
 * Audio hw module handle functions or structures referencing a module.
 */
typedef int32_t AudioModuleHandle;

/**
 * Each port has a unique ID or handle allocated by policy manager.
 */
typedef int32_t AudioPortHandle;

/**
 * Each patch is identified by a handle at the interface used to create that
 * patch. For instance, when a patch is created by the audio HAL, the HAL
 * allocates and returns a handle.  This handle is unique to a given audio HAL
 * hardware module.  But the same patch receives another system wide unique
 * handle allocated by the framework.  This unique handle is used for all
 * transactions inside the framework.
 */
typedef int32_t AudioPatchHandle;

/**
 * A HW synchronization source returned by the audio HAL.
 */
typedef uint32_t AudioHwSync;

/**
 * Each port has a unique ID or handle allocated by policy manager.
 */
@export(name="")
enum AudioHandleConsts : int32_t {
    AUDIO_IO_HANDLE_NONE = 0,
    AUDIO_MODULE_HANDLE_NONE = 0,
    AUDIO_PORT_HANDLE_NONE = 0,
    AUDIO_PATCH_HANDLE_NONE = 0,
};

/**
 * Commonly used structure for passing unique identifieds (UUID).
 * For the definition of UUID, refer to ITU-T X.667 spec.
 */
struct Uuid {
    uint32_t timeLow;
    uint16_t timeMid;
    uint16_t versionAndTimeHigh;
    uint16_t variantAndClockSeqHigh;
    uint8_t[6] node;
};


/*
 *
 *  Audio streams
 *
 */

/**
 * Audio stream type describing the intended use case of a stream.
 */
@export(name="audio_stream_type_t", value_prefix="AUDIO_STREAM_")
enum AudioStreamType : int32_t {
    // These values must kept in sync with
    //  frameworks/base/media/java/android/media/AudioSystem.java
    DEFAULT          = -1,
    MIN              = 0,
    VOICE_CALL       = 0,
    SYSTEM           = 1,
    RING             = 2,
    MUSIC            = 3,
    ALARM            = 4,
    NOTIFICATION     = 5,
    BLUETOOTH_SCO    = 6,
    ENFORCED_AUDIBLE = 7,  // Sounds that cannot be muted by user and must be
                           // routed to speaker
    DTMF             = 8,
    TTS              = 9,  // Transmitted Through Speaker.  Plays over speaker
                           // only, silent on other devices
    ACCESSIBILITY    = 10, // For accessibility talk back prompts
};

@export(name="audio_source_t", value_prefix="AUDIO_SOURCE_")
enum AudioSource : int32_t {
    // These values must kept in sync with
    //  frameworks/base/media/java/android/media/MediaRecorder.java,
    //  frameworks/av/services/audiopolicy/AudioPolicyService.cpp,
    //  system/media/audio_effects/include/audio_effects/audio_effects_conf.h
    DEFAULT             = 0,
    MIC                 = 1,
    VOICE_UPLINK        = 2,
    VOICE_DOWNLINK      = 3,
    VOICE_CALL          = 4,
    CAMCORDER           = 5,
    VOICE_RECOGNITION   = 6,
    VOICE_COMMUNICATION = 7,
    /**
     * Source for the mix to be presented remotely. An example of remote
     * presentation is Wifi Display where a dongle attached to a TV can be used
     * to play the mix captured by this audio source.
     */
    REMOTE_SUBMIX       = 8,
    /**
     * Source for unprocessed sound. Usage examples include level measurement
     * and raw signal analysis.
     */
    UNPROCESSED         = 9,

    FM_TUNER            = 1998,
};

typedef int32_t AudioSession;
/**
 * Special audio session values.
 */
@export(name="audio_session_t", value_prefix="AUDIO_SESSION_")
enum AudioSessionConsts : int32_t {
    /**
     * Session for effects attached to a particular output stream
     * (value must be less than 0)
     */
    OUTPUT_STAGE = -1,
    /**
     * Session for effects applied to output mix. These effects can
     * be moved by audio policy manager to another output stream
     * (value must be 0)
     */
    OUTPUT_MIX = 0,
    /**
     * Application does not specify an explicit session ID to be used, and
     * requests a new session ID to be allocated. Corresponds to
     * AudioManager.AUDIO_SESSION_ID_GENERATE and
     * AudioSystem.AUDIO_SESSION_ALLOCATE.
     */
    ALLOCATE = 0,
    /**
     * For use with AudioRecord::start(), this indicates no trigger session.
     * It is also used with output tracks and patch tracks, which never have a
     * session.
     */
    NONE = 0
};

/**
 * Audio format  is a 32-bit word that consists of:
 *   main format field (upper 8 bits)
 *   sub format field (lower 24 bits).
 *
 * The main format indicates the main codec type. The sub format field indicates
 * options and parameters for each format. The sub format is mainly used for
 * record to indicate for instance the requested bitrate or profile.  It can
 * also be used for certain formats to give informations not present in the
 * encoded audio stream (e.g. octet alignement for AMR).
 */
@export(name="audio_format_t", value_prefix="AUDIO_FORMAT_")
enum AudioFormat : uint32_t {
    INVALID             = 0xFFFFFFFFUL,
    DEFAULT             = 0,
    PCM                 = 0x00000000UL,
    MP3                 = 0x01000000UL,
    AMR_NB              = 0x02000000UL,
    AMR_WB              = 0x03000000UL,
    AAC                 = 0x04000000UL,
    /** Deprecated, Use AAC_HE_V1 */
    HE_AAC_V1           = 0x05000000UL,
    /** Deprecated, Use AAC_HE_V2 */
    HE_AAC_V2           = 0x06000000UL,
    VORBIS              = 0x07000000UL,
    OPUS                = 0x08000000UL,
    AC3                 = 0x09000000UL,
    E_AC3               = 0x0A000000UL,
    DTS                 = 0x0B000000UL,
    DTS_HD              = 0x0C000000UL,
    /** IEC61937 is encoded audio wrapped in 16-bit PCM. */
    IEC61937            = 0x0D000000UL,
    DOLBY_TRUEHD        = 0x0E000000UL,
    EVRC                = 0x10000000UL,
    EVRCB               = 0x11000000UL,
    EVRCWB              = 0x12000000UL,
    EVRCNW              = 0x13000000UL,
    AAC_ADIF            = 0x14000000UL,
    WMA                 = 0x15000000UL,
    WMA_PRO             = 0x16000000UL,
    AMR_WB_PLUS         = 0x17000000UL,
    MP2                 = 0x18000000UL,
    QCELP               = 0x19000000UL,
    DSD                 = 0x1A000000UL,
    FLAC                = 0x1B000000UL,
    ALAC                = 0x1C000000UL,
    APE                 = 0x1D000000UL,
    AAC_ADTS            = 0x1E000000UL,
    SBC                 = 0x1F000000UL,
    APTX                = 0x20000000UL,
    APTX_HD             = 0x21000000UL,
    AC4                 = 0x22000000UL,
    LDAC                = 0x23000000UL,
    /** Dolby Metadata-enhanced Audio Transmission */
    MAT                 = 0x24000000UL,
    /** Deprecated */
    MAIN_MASK           = 0xFF000000UL,
    SUB_MASK            = 0x00FFFFFFUL,

    /* Subformats */
    PCM_SUB_16_BIT        = 0x1, // PCM signed 16 bits
    PCM_SUB_8_BIT         = 0x2, // PCM unsigned 8 bits
    PCM_SUB_32_BIT        = 0x3, // PCM signed .31 fixed point
    PCM_SUB_8_24_BIT      = 0x4, // PCM signed 8.23 fixed point
    PCM_SUB_FLOAT         = 0x5, // PCM single-precision float pt
    PCM_SUB_24_BIT_PACKED = 0x6, // PCM signed .23 fix pt (3 bytes)

    MP3_SUB_NONE          = 0x0,

    AMR_SUB_NONE          = 0x0,

    AAC_SUB_MAIN          = 0x1,
    AAC_SUB_LC            = 0x2,
    AAC_SUB_SSR           = 0x4,
    AAC_SUB_LTP           = 0x8,
    AAC_SUB_HE_V1         = 0x10,
    AAC_SUB_SCALABLE      = 0x20,
    AAC_SUB_ERLC          = 0x40,
    AAC_SUB_LD            = 0x80,
    AAC_SUB_HE_V2         = 0x100,
    AAC_SUB_ELD           = 0x200,
    AAC_SUB_XHE           = 0x300,

    VORBIS_SUB_NONE       = 0x0,

    E_AC3_SUB_JOC         = 0x1,

    MAT_SUB_1_0           = 0x1,
    MAT_SUB_2_0           = 0x2,
    MAT_SUB_2_1           = 0x3,

    /* Aliases */
    /** note != AudioFormat.ENCODING_PCM_16BIT */
    PCM_16_BIT          = (PCM | PCM_SUB_16_BIT),
    /** note != AudioFormat.ENCODING_PCM_8BIT */
    PCM_8_BIT           = (PCM | PCM_SUB_8_BIT),
    PCM_32_BIT          = (PCM | PCM_SUB_32_BIT),
    PCM_8_24_BIT        = (PCM | PCM_SUB_8_24_BIT),
    PCM_FLOAT           = (PCM | PCM_SUB_FLOAT),
    PCM_24_BIT_PACKED   = (PCM | PCM_SUB_24_BIT_PACKED),
    AAC_MAIN            = (AAC | AAC_SUB_MAIN),
    AAC_LC              = (AAC | AAC_SUB_LC),
    AAC_SSR             = (AAC | AAC_SUB_SSR),
    AAC_LTP             = (AAC | AAC_SUB_LTP),
    AAC_HE_V1           = (AAC | AAC_SUB_HE_V1),
    AAC_SCALABLE        = (AAC | AAC_SUB_SCALABLE),
    AAC_ERLC            = (AAC | AAC_SUB_ERLC),
    AAC_LD              = (AAC | AAC_SUB_LD),
    AAC_HE_V2           = (AAC | AAC_SUB_HE_V2),
    AAC_ELD             = (AAC | AAC_SUB_ELD),
    AAC_XHE             = (AAC | AAC_SUB_XHE),
    AAC_ADTS_MAIN       = (AAC_ADTS | AAC_SUB_MAIN),
    AAC_ADTS_LC         = (AAC_ADTS | AAC_SUB_LC),
    AAC_ADTS_SSR        = (AAC_ADTS | AAC_SUB_SSR),
    AAC_ADTS_LTP        = (AAC_ADTS | AAC_SUB_LTP),
    AAC_ADTS_HE_V1      = (AAC_ADTS | AAC_SUB_HE_V1),
    AAC_ADTS_SCALABLE   = (AAC_ADTS | AAC_SUB_SCALABLE),
    AAC_ADTS_ERLC       = (AAC_ADTS | AAC_SUB_ERLC),
    AAC_ADTS_LD         = (AAC_ADTS | AAC_SUB_LD),
    AAC_ADTS_HE_V2      = (AAC_ADTS | AAC_SUB_HE_V2),
    AAC_ADTS_ELD        = (AAC_ADTS | AAC_SUB_ELD),
    AAC_ADTS_XHE        = (AAC_ADTS | AAC_SUB_XHE),
    E_AC3_JOC           = (E_AC3 | E_AC3_SUB_JOC),
    MAT_1_0             = (MAT | MAT_SUB_1_0),
    MAT_2_0             = (MAT | MAT_SUB_2_0),
    MAT_2_1             = (MAT | MAT_SUB_2_1),
};

/**
 * Usage of these values highlights places in the code that use 2- or 8- channel
 * assumptions.
 */
@export(name="")
enum FixedChannelCount : int32_t {
    FCC_2 = 2, // This is typically due to legacy implementation of stereo I/O
    FCC_8 = 8  // This is typically due to audio mixer and resampler limitations
};

/**
 * A channel mask per se only defines the presence or absence of a channel, not
 * the order.  See AUDIO_INTERLEAVE_* for the platform convention of order.
 *
 * AudioChannelMask is an opaque type and its internal layout should not be
 * assumed as it may change in the future.  Instead, always use functions
 * to examine it.
 *
 * These are the current representations:
 *
 *   REPRESENTATION_POSITION
 *     is a channel mask representation for position assignment.  Each low-order
 *     bit corresponds to the spatial position of a transducer (output), or
 *     interpretation of channel (input).  The user of a channel mask needs to
 *     know the context of whether it is for output or input.  The constants
 *     OUT_* or IN_* apply to the bits portion.  It is not permitted for no bits
 *     to be set.
 *
 *   REPRESENTATION_INDEX
 *     is a channel mask representation for index assignment.  Each low-order
 *     bit corresponds to a selected channel.  There is no platform
 *     interpretation of the various bits.  There is no concept of output or
 *     input.  It is not permitted for no bits to be set.
 *
 * All other representations are reserved for future use.
 *
 * Warning: current representation distinguishes between input and output, but
 * this will not the be case in future revisions of the platform. Wherever there
 * is an ambiguity between input and output that is currently resolved by
 * checking the channel mask, the implementer should look for ways to fix it
 * with additional information outside of the mask.
 */
@export(name="", value_prefix="AUDIO_CHANNEL_")
enum AudioChannelMask : uint32_t {
    /** must be 0 for compatibility */
    REPRESENTATION_POSITION = 0,
    /** 1 is reserved for future use */
    REPRESENTATION_INDEX    = 2,
    /* 3 is reserved for future use */

    /** These can be a complete value of AudioChannelMask */
    NONE                      = 0x0,
    INVALID                   = 0xC0000000,

   /*
    * These can be the bits portion of an AudioChannelMask
    * with representation REPRESENTATION_POSITION.
    */

    /** output channels */
    OUT_FRONT_LEFT            = 0x1,
    OUT_FRONT_RIGHT           = 0x2,
    OUT_FRONT_CENTER          = 0x4,
    OUT_LOW_FREQUENCY         = 0x8,
    OUT_BACK_LEFT             = 0x10,
    OUT_BACK_RIGHT            = 0x20,
    OUT_FRONT_LEFT_OF_CENTER  = 0x40,
    OUT_FRONT_RIGHT_OF_CENTER = 0x80,
    OUT_BACK_CENTER           = 0x100,
    OUT_SIDE_LEFT             = 0x200,
    OUT_SIDE_RIGHT            = 0x400,
    OUT_TOP_CENTER            = 0x800,
    OUT_TOP_FRONT_LEFT        = 0x1000,
    OUT_TOP_FRONT_CENTER      = 0x2000,
    OUT_TOP_FRONT_RIGHT       = 0x4000,
    OUT_TOP_BACK_LEFT         = 0x8000,
    OUT_TOP_BACK_CENTER       = 0x10000,
    OUT_TOP_BACK_RIGHT        = 0x20000,
    OUT_TOP_SIDE_LEFT         = 0x40000,
    OUT_TOP_SIDE_RIGHT        = 0x80000,

    /**
     * Haptic channel characteristics are specific to a device and
     * only used to play device specific resources (eg: ringtones).
     * The HAL can freely map A and B to haptic controllers, the
     * framework shall not interpret those values and forward them
     * from the device audio assets.
     */
    OUT_HAPTIC_A              = 0x20000000,
    OUT_HAPTIC_B              = 0x10000000,

    OUT_MONO     = OUT_FRONT_LEFT,
    OUT_STEREO   = (OUT_FRONT_LEFT | OUT_FRONT_RIGHT),
    OUT_2POINT1  = (OUT_FRONT_LEFT | OUT_FRONT_RIGHT | OUT_LOW_FREQUENCY),
    OUT_2POINT0POINT2 = (OUT_FRONT_LEFT | OUT_FRONT_RIGHT |
                         OUT_TOP_SIDE_LEFT | OUT_TOP_SIDE_RIGHT),
    OUT_2POINT1POINT2 = (OUT_FRONT_LEFT | OUT_FRONT_RIGHT |
                         OUT_TOP_SIDE_LEFT | OUT_TOP_SIDE_RIGHT |
                         OUT_LOW_FREQUENCY),
    OUT_3POINT0POINT2 = (OUT_FRONT_LEFT | OUT_FRONT_CENTER | OUT_FRONT_RIGHT |
                         OUT_TOP_SIDE_LEFT | OUT_TOP_SIDE_RIGHT),
    OUT_3POINT1POINT2 = (OUT_FRONT_LEFT | OUT_FRONT_CENTER | OUT_FRONT_RIGHT |
                        OUT_TOP_SIDE_LEFT | OUT_TOP_SIDE_RIGHT |
                        OUT_LOW_FREQUENCY),
    OUT_QUAD     = (OUT_FRONT_LEFT | OUT_FRONT_RIGHT |
            OUT_BACK_LEFT | OUT_BACK_RIGHT),
    OUT_QUAD_BACK = OUT_QUAD,
    /** like OUT_QUAD_BACK with *_SIDE_* instead of *_BACK_* */
    OUT_QUAD_SIDE = (OUT_FRONT_LEFT | OUT_FRONT_RIGHT |
            OUT_SIDE_LEFT | OUT_SIDE_RIGHT),
    OUT_SURROUND = (OUT_FRONT_LEFT | OUT_FRONT_RIGHT |
            OUT_FRONT_CENTER | OUT_BACK_CENTER),
    OUT_PENTA = (OUT_QUAD | OUT_FRONT_CENTER),
    OUT_5POINT1   = (OUT_FRONT_LEFT | OUT_FRONT_RIGHT |
            OUT_FRONT_CENTER | OUT_LOW_FREQUENCY |
            OUT_BACK_LEFT | OUT_BACK_RIGHT),
    OUT_5POINT1_BACK = OUT_5POINT1,
    /** like OUT_5POINT1_BACK with *_SIDE_* instead of *_BACK_* */
    OUT_5POINT1_SIDE = (OUT_FRONT_LEFT | OUT_FRONT_RIGHT |
            OUT_FRONT_CENTER | OUT_LOW_FREQUENCY |
            OUT_SIDE_LEFT | OUT_SIDE_RIGHT),
    OUT_5POINT1POINT2  = (OUT_5POINT1 | OUT_TOP_SIDE_LEFT | OUT_TOP_SIDE_RIGHT),
    OUT_5POINT1POINT4  = (OUT_5POINT1 |
            OUT_TOP_FRONT_LEFT | OUT_TOP_FRONT_RIGHT |
            OUT_TOP_BACK_LEFT | OUT_TOP_BACK_RIGHT),
    OUT_6POINT1 = (OUT_FRONT_LEFT | OUT_FRONT_RIGHT |
            OUT_FRONT_CENTER | OUT_LOW_FREQUENCY |
            OUT_BACK_LEFT | OUT_BACK_RIGHT |
            OUT_BACK_CENTER),
    /** matches the correct AudioFormat.CHANNEL_OUT_7POINT1_SURROUND */
    OUT_7POINT1  = (OUT_FRONT_LEFT | OUT_FRONT_RIGHT |
            OUT_FRONT_CENTER | OUT_LOW_FREQUENCY |
            OUT_BACK_LEFT | OUT_BACK_RIGHT |
            OUT_SIDE_LEFT | OUT_SIDE_RIGHT),
    OUT_7POINT1POINT2  = (OUT_7POINT1 | OUT_TOP_SIDE_LEFT | OUT_TOP_SIDE_RIGHT),
    OUT_7POINT1POINT4  = (OUT_7POINT1 |
            OUT_TOP_FRONT_LEFT | OUT_TOP_FRONT_RIGHT |
            OUT_TOP_BACK_LEFT | OUT_TOP_BACK_RIGHT),
    OUT_MONO_HAPTIC_A = (OUT_FRONT_LEFT | OUT_HAPTIC_A),
    OUT_STEREO_HAPTIC_A = (OUT_FRONT_LEFT | OUT_FRONT_RIGHT | OUT_HAPTIC_A),
    OUT_HAPTIC_AB = (OUT_HAPTIC_A | OUT_HAPTIC_B),
    OUT_MONO_HAPTIC_AB = (OUT_FRONT_LEFT | OUT_HAPTIC_A | OUT_HAPTIC_B),
    OUT_STEREO_HAPTIC_AB = (OUT_FRONT_LEFT | OUT_FRONT_RIGHT |
            OUT_HAPTIC_A | OUT_HAPTIC_B),
    // Note that the 2.0 OUT_ALL* have been moved to helper functions

    /* These are bits only, not complete values */

    /** input channels */
    IN_LEFT            = 0x4,
    IN_RIGHT           = 0x8,
    IN_FRONT           = 0x10,
    IN_BACK            = 0x20,
    IN_LEFT_PROCESSED  = 0x40,
    IN_RIGHT_PROCESSED = 0x80,
    IN_FRONT_PROCESSED = 0x100,
    IN_BACK_PROCESSED  = 0x200,
    IN_PRESSURE        = 0x400,
    IN_X_AXIS          = 0x800,
    IN_Y_AXIS          = 0x1000,
    IN_Z_AXIS          = 0x2000,
    IN_BACK_LEFT       = 0x10000,
    IN_BACK_RIGHT      = 0x20000,
    IN_CENTER          = 0x40000,
    IN_LOW_FREQUENCY   = 0x100000,
    IN_TOP_LEFT        = 0x200000,
    IN_TOP_RIGHT       = 0x400000,

    IN_VOICE_UPLINK    = 0x4000,
    IN_VOICE_DNLINK    = 0x8000,

    IN_MONO   = IN_FRONT,
    IN_STEREO = (IN_LEFT | IN_RIGHT),
    IN_FRONT_BACK = (IN_FRONT | IN_BACK),
    IN_6 = (IN_LEFT | IN_RIGHT |
            IN_FRONT | IN_BACK |
            IN_LEFT_PROCESSED | IN_RIGHT_PROCESSED),
    IN_2POINT0POINT2 = (IN_LEFT | IN_RIGHT | IN_TOP_LEFT | IN_TOP_RIGHT),
    IN_2POINT1POINT2 = (IN_LEFT | IN_RIGHT | IN_TOP_LEFT | IN_TOP_RIGHT |
            IN_LOW_FREQUENCY),
    IN_3POINT0POINT2 = (IN_LEFT | IN_CENTER | IN_RIGHT | IN_TOP_LEFT | IN_TOP_RIGHT),
    IN_3POINT1POINT2 = (IN_LEFT | IN_CENTER | IN_RIGHT |
            IN_TOP_LEFT | IN_TOP_RIGHT | IN_LOW_FREQUENCY),
    IN_5POINT1 = (IN_LEFT | IN_CENTER | IN_RIGHT |
                  IN_BACK_LEFT | IN_BACK_RIGHT | IN_LOW_FREQUENCY),
    IN_VOICE_UPLINK_MONO = (IN_VOICE_UPLINK | IN_MONO),
    IN_VOICE_DNLINK_MONO = (IN_VOICE_DNLINK | IN_MONO),
    IN_VOICE_CALL_MONO   = (IN_VOICE_UPLINK_MONO |
            IN_VOICE_DNLINK_MONO),
    // Note that the 2.0 IN_ALL* have been moved to helper functions

    COUNT_MAX    = 30,
    INDEX_HDR    = REPRESENTATION_INDEX << COUNT_MAX,
    INDEX_MASK_1 = INDEX_HDR | ((1 << 1) - 1),
    INDEX_MASK_2 = INDEX_HDR | ((1 << 2) - 1),
    INDEX_MASK_3 = INDEX_HDR | ((1 << 3) - 1),
    INDEX_MASK_4 = INDEX_HDR | ((1 << 4) - 1),
    INDEX_MASK_5 = INDEX_HDR | ((1 << 5) - 1),
    INDEX_MASK_6 = INDEX_HDR | ((1 << 6) - 1),
    INDEX_MASK_7 = INDEX_HDR | ((1 << 7) - 1),
    INDEX_MASK_8 = INDEX_HDR | ((1 << 8) - 1)
};

/**
 * Major modes for a mobile device. The current mode setting affects audio
 * routing.
 */
@export(name="audio_mode_t", value_prefix="AUDIO_MODE_")
enum AudioMode : int32_t {
    NORMAL           = 0,
    RINGTONE         = 1,
    /** Calls handled by the telephony stack (Eg: PSTN). */
    IN_CALL          = 2,
    /** Calls handled by apps (Eg: Hangout). */
    IN_COMMUNICATION = 3,
};

@export(name="", value_prefix="AUDIO_DEVICE_")
enum AudioDevice : uint32_t {
    NONE                          = 0x0,
    /** reserved bits */
    BIT_IN                        = 0x80000000,
    BIT_DEFAULT                   = 0x40000000,
    /** output devices */
    OUT_EARPIECE                  = 0x1,
    OUT_SPEAKER                   = 0x2,
    OUT_WIRED_HEADSET             = 0x4,
    OUT_WIRED_HEADPHONE           = 0x8,
    OUT_BLUETOOTH_SCO             = 0x10,
    OUT_BLUETOOTH_SCO_HEADSET     = 0x20,
    OUT_BLUETOOTH_SCO_CARKIT      = 0x40,
    OUT_BLUETOOTH_A2DP            = 0x80,
    OUT_BLUETOOTH_A2DP_HEADPHONES = 0x100,
    OUT_BLUETOOTH_A2DP_SPEAKER    = 0x200,
    OUT_AUX_DIGITAL               = 0x400,
    OUT_HDMI                      = OUT_AUX_DIGITAL,
    /** uses an analog connection (multiplexed over the USB pins for instance) */
    OUT_ANLG_DOCK_HEADSET         = 0x800,
    OUT_DGTL_DOCK_HEADSET         = 0x1000,
    /** USB accessory mode: Android device is USB device and dock is USB host */
    OUT_USB_ACCESSORY             = 0x2000,
    /** USB host mode: Android device is USB host and dock is USB device */
    OUT_USB_DEVICE                = 0x4000,
    OUT_REMOTE_SUBMIX             = 0x8000,
    /** Telephony voice TX path */
    OUT_TELEPHONY_TX              = 0x10000,
    /** Analog jack with line impedance detected */
    OUT_LINE                      = 0x20000,
    /** HDMI Audio Return Channel */
    OUT_HDMI_ARC                  = 0x40000,
    /** S/PDIF out */
    OUT_SPDIF                     = 0x80000,
    /** FM transmitter out */
    OUT_FM                        = 0x100000,
    /** Line out for av devices */
    OUT_AUX_LINE                  = 0x200000,
    /** limited-output speaker device for acoustic safety */
    OUT_SPEAKER_SAFE              = 0x400000,
    OUT_IP                        = 0x800000,
    /** audio bus implemented by the audio system (e.g an MOST stereo channel) */
    OUT_BUS                       = 0x1000000,
    OUT_PROXY                     = 0x2000000,
    OUT_USB_HEADSET               = 0x4000000,
    OUT_HEARING_AID               = 0x8000000,
    OUT_ECHO_CANCELLER            = 0x10000000,
    OUT_DEFAULT                   = BIT_DEFAULT,
    // Note that the 2.0 OUT_ALL* have been moved to helper functions

    /** input devices */
    IN_COMMUNICATION         = BIT_IN | 0x1,
    IN_AMBIENT               = BIT_IN | 0x2,
    IN_BUILTIN_MIC           = BIT_IN | 0x4,
    IN_BLUETOOTH_SCO_HEADSET = BIT_IN | 0x8,
    IN_WIRED_HEADSET         = BIT_IN | 0x10,
    IN_AUX_DIGITAL           = BIT_IN | 0x20,
    IN_HDMI                  = IN_AUX_DIGITAL,
    /** Telephony voice RX path */
    IN_VOICE_CALL            = BIT_IN | 0x40,
    IN_TELEPHONY_RX          = IN_VOICE_CALL,
    IN_BACK_MIC              = BIT_IN | 0x80,
    IN_REMOTE_SUBMIX         = BIT_IN | 0x100,
    IN_ANLG_DOCK_HEADSET     = BIT_IN | 0x200,
    IN_DGTL_DOCK_HEADSET     = BIT_IN | 0x400,
    IN_USB_ACCESSORY         = BIT_IN | 0x800,
    IN_USB_DEVICE            = BIT_IN | 0x1000,
    /** FM tuner input */
    IN_FM_TUNER              = BIT_IN | 0x2000,
    /** TV tuner input */
    IN_TV_TUNER              = BIT_IN | 0x4000,
    /** Analog jack with line impedance detected */
    IN_LINE                  = BIT_IN | 0x8000,
    /** S/PDIF in */
    IN_SPDIF                 = BIT_IN | 0x10000,
    IN_BLUETOOTH_A2DP        = BIT_IN | 0x20000,
    IN_LOOPBACK              = BIT_IN | 0x40000,
    IN_IP                    = BIT_IN | 0x80000,
    /** audio bus implemented by the audio system (e.g an MOST stereo channel) */
    IN_BUS                   = BIT_IN | 0x100000,
    IN_PROXY                 = BIT_IN | 0x1000000,
    IN_USB_HEADSET           = BIT_IN | 0x2000000,
    IN_BLUETOOTH_BLE         = BIT_IN | 0x4000000,
    IN_DEFAULT               = BIT_IN | BIT_DEFAULT,

    // Note that the 2.0 IN_ALL* have been moved to helper functions
};

/**
 * The audio output flags serve two purposes:
 *
 *  - when an AudioTrack is created they indicate a "wish" to be connected to an
 *    output stream with attributes corresponding to the specified flags;
 *
 *  - when present in an output profile descriptor listed for a particular audio
 *    hardware module, they indicate that an output stream can be opened that
 *    supports the attributes indicated by the flags.
 *
 * The audio policy manager will try to match the flags in the request
 * (when getOuput() is called) to an available output stream.
 */
@export(name="audio_output_flags_t", value_prefix="AUDIO_OUTPUT_FLAG_")
enum AudioOutputFlag : int32_t {
    NONE    = 0x0, // no attributes
    DIRECT  = 0x1, // this output directly connects a track
                   // to one output stream: no software mixer
    PRIMARY = 0x2, // this output is the primary output of the device. It is
                   // unique and must be present. It is opened by default and
                   // receives routing, audio mode and volume controls related
                   // to voice calls.
    FAST    = 0x4,    // output supports "fast tracks", defined elsewhere
    DEEP_BUFFER      = 0x8,   // use deep audio buffers
    COMPRESS_OFFLOAD = 0x10,  // offload playback of compressed streams to
                              // hardware codec
    NON_BLOCKING     = 0x20,  // use non-blocking write
    HW_AV_SYNC = 0x40,   // output uses a hardware A/V sync
    TTS        = 0x80,   // output for streams transmitted through speaker at a
                         // sample rate high enough to accommodate lower-range
                         // ultrasonic p/b
    RAW        = 0x100,  // minimize signal processing
    SYNC       = 0x200,  // synchronize I/O streams
    IEC958_NONAUDIO = 0x400, // Audio stream contains compressed audio in SPDIF
                             // data bursts, not PCM.
    DIRECT_PCM = 0x2000,     // Audio stream containing PCM data that needs
                             // to pass through compress path for DSP post proc.
    MMAP_NOIRQ = 0x4000, // output operates in MMAP no IRQ mode.
    VOIP_RX = 0x8000,    // preferred output for VoIP calls.
    /** preferred output for call music */
    INCALL_MUSIC = 0x10000,
};

/**
 * The audio input flags are analogous to audio output flags.
 * Currently they are used only when an AudioRecord is created,
 * to indicate a preference to be connected to an input stream with
 * attributes corresponding to the specified flags.
 */
@export(name="audio_input_flags_t", value_prefix="AUDIO_INPUT_FLAG_")
enum AudioInputFlag : int32_t {
    NONE         = 0x0,  // no attributes
    FAST         = 0x1,  // prefer an input that supports "fast tracks"
    HW_HOTWORD   = 0x2,  // prefer an input that captures from hw hotword source
    RAW          = 0x4,  // minimize signal processing
    SYNC         = 0x8,  // synchronize I/O streams
    MMAP_NOIRQ   = 0x10, // input operates in MMAP no IRQ mode.
    VOIP_TX      = 0x20, // preferred input for VoIP calls.
    HW_AV_SYNC   = 0x40, // input connected to an output that uses a hardware A/V sync
};

@export(name="audio_usage_t", value_prefix="AUDIO_USAGE_")
enum AudioUsage : int32_t {
    // These values must kept in sync with
    //  frameworks/base/media/java/android/media/AudioAttributes.java
    // Note that not all framework values are exposed
    UNKNOWN                            = 0,
    MEDIA                              = 1,
    VOICE_COMMUNICATION                = 2,
    VOICE_COMMUNICATION_SIGNALLING     = 3,
    ALARM                              = 4,
    NOTIFICATION                       = 5,
    NOTIFICATION_TELEPHONY_RINGTONE    = 6,
    ASSISTANCE_ACCESSIBILITY           = 11,
    ASSISTANCE_NAVIGATION_GUIDANCE     = 12,
    ASSISTANCE_SONIFICATION            = 13,
    GAME                               = 14,
    VIRTUAL_SOURCE                     = 15,
    ASSISTANT                          = 16,
};

/** Type of audio generated by an application. */
@export(name="audio_content_type_t", value_prefix="AUDIO_CONTENT_TYPE_")
enum AudioContentType : uint32_t {
    // Do not change these values without updating their counterparts
    // in frameworks/base/media/java/android/media/AudioAttributes.java
    UNKNOWN      = 0,
    SPEECH       = 1,
    MUSIC        = 2,
    MOVIE        = 3,
    SONIFICATION = 4,
};

/**
 * Additional information about the stream passed to hardware decoders.
 */
struct AudioOffloadInfo {
    uint32_t sampleRateHz;
    bitfield<AudioChannelMask> channelMask;
    AudioFormat format;
    AudioStreamType streamType;
    uint32_t bitRatePerSecond;
    int64_t durationMicroseconds;  // -1 if unknown
    bool hasVideo;
    bool isStreaming;
    uint32_t bitWidth;
    uint32_t bufferSize;
    AudioUsage usage;
};

/**
 * Commonly used audio stream configuration parameters.
 */
struct AudioConfig {
    uint32_t sampleRateHz;
    bitfield<AudioChannelMask> channelMask;
    AudioFormat format;
    AudioOffloadInfo offloadInfo;
    uint64_t frameCount;
};

/** Metadata of a playback track for a StreamOut. */
struct PlaybackTrackMetadata {
    AudioUsage usage;
    AudioContentType contentType;
    /**
     * Positive linear gain applied to the track samples. 0 being muted and 1 is no attenuation,
     * 2 means double amplification...
     * Must not be negative.
     */
    float gain;
};

/** Metadatas of the source of a StreamOut. */
struct SourceMetadata {
    vec<PlaybackTrackMetadata> tracks;
};

/** Metadata of a record track for a StreamIn. */
struct RecordTrackMetadata {
    AudioSource source;
    /**
     * Positive linear gain applied to the track samples. 0 being muted and 1 is no attenuation,
     * 2 means double amplification...
     * Must not be negative.
     */
    float gain;
};

/** Metadatas of the source of a StreamIn. */
struct SinkMetadata {
    vec<RecordTrackMetadata> tracks;
};


/*
 *
 *  Volume control
 *
 */

/**
 * Type of gain control exposed by an audio port.
 */
@export(name="", value_prefix="AUDIO_GAIN_MODE_")
enum AudioGainMode : uint32_t {
    JOINT = 0x1,    // supports joint channel gain control
    CHANNELS = 0x2, // supports separate channel gain control
    RAMP = 0x4      // supports gain ramps
};

/**
 * An audio_gain struct is a representation of a gain stage.
 * A gain stage is always attached to an audio port.
 */
struct AudioGain {
    bitfield<AudioGainMode> mode;
    bitfield<AudioChannelMask> channelMask; // channels which gain an be controlled
    int32_t minValue;     // minimum gain value in millibels
    int32_t maxValue;     // maximum gain value in millibels
    int32_t defaultValue; // default gain value in millibels
    uint32_t stepValue;   // gain step in millibels
    uint32_t minRampMs;   // minimum ramp duration in ms
    uint32_t maxRampMs;   // maximum ramp duration in ms
};

/**
 * The gain configuration structure is used to get or set the gain values of a
 * given port.
 */
struct AudioGainConfig {
    int32_t index;  // index of the corresponding AudioGain in AudioPort.gains
    AudioGainMode mode;
    AudioChannelMask channelMask;  // channels which gain value follows
    /**
     * 4 = sizeof(AudioChannelMask),
     * 8 is not "FCC_8", so it won't need to be changed for > 8 channels.
     * Gain values in millibels for each channel ordered from LSb to MSb in
     * channel mask. The number of values is 1 in joint mode or
     * popcount(channel_mask).
     */
    int32_t[4 * 8] values;
    uint32_t rampDurationMs;  // ramp duration in ms
};


/*
 *
 *  Routing control
 *
 */

/*
 * Types defined here are used to describe an audio source or sink at internal
 * framework interfaces (audio policy, patch panel) or at the audio HAL.
 * Sink and sources are grouped in a concept of “audio port” representing an
 * audio end point at the edge of the system managed by the module exposing
 * the interface.
 */

/** Audio port role: either source or sink */
@export(name="audio_port_role_t", value_prefix="AUDIO_PORT_ROLE_")
enum AudioPortRole : int32_t {
    NONE,
    SOURCE,
    SINK,
};

/**
 * Audio port type indicates if it is a session (e.g AudioTrack), a mix (e.g
 * PlaybackThread output) or a physical device (e.g OUT_SPEAKER)
 */
@export(name="audio_port_type_t", value_prefix="AUDIO_PORT_TYPE_")
enum AudioPortType : int32_t {
    NONE,
    DEVICE,
    MIX,
    SESSION,
};

/**
 * Extension for audio port configuration structure when the audio port is a
 * hardware device.
 */
struct AudioPortConfigDeviceExt {
    AudioModuleHandle hwModule;  // module the device is attached to
    AudioDevice type;            // device type (e.g OUT_SPEAKER)
    uint8_t[32] address;         // device address. "" if N/A
};

/**
 * Extension for audio port configuration structure when the audio port is an
 * audio session.
 */
struct AudioPortConfigSessionExt {
    AudioSession session;
};

/**
 * Flags indicating which fields are to be considered in AudioPortConfig.
 */
@export(name="", value_prefix="AUDIO_PORT_CONFIG_")
enum AudioPortConfigMask : uint32_t {
    SAMPLE_RATE = 0x1,
    CHANNEL_MASK =  0x2,
    FORMAT = 0x4,
    GAIN = 0x8,
};

/**
 * Audio port configuration structure used to specify a particular configuration
 * of an audio port.
 */
struct AudioPortConfig {
    AudioPortHandle id;
    bitfield<AudioPortConfigMask> configMask;
    uint32_t sampleRateHz;
    bitfield<AudioChannelMask> channelMask;
    AudioFormat format;
    AudioGainConfig gain;
    AudioPortType type;  // type is used as a discriminator for Ext union
    AudioPortRole role;  // role is used as a discriminator for UseCase union
    union Ext {
        AudioPortConfigDeviceExt device;
        struct AudioPortConfigMixExt {
            AudioModuleHandle hwModule; // module the stream is attached to
            AudioIoHandle ioHandle;     // I/O handle of the input/output stream
            union UseCase {
                AudioStreamType stream;
                AudioSource source;
            } useCase;
        } mix;
        AudioPortConfigSessionExt session;
    } ext;
};

/**
 * Extension for audio port structure when the audio port is a hardware device.
 */
struct AudioPortDeviceExt {
    AudioModuleHandle hwModule;    // module the device is attached to
    AudioDevice type;
    /** 32 byte string identifying the port. */
    uint8_t[32] address;
};

/**
 * Latency class of the audio mix.
 */
@export(name="audio_mix_latency_class_t", value_prefix="AUDIO_LATENCY_")
enum AudioMixLatencyClass : int32_t {
    LOW,
    NORMAL
};

struct AudioPortMixExt {
    AudioModuleHandle hwModule;     // module the stream is attached to
    AudioIoHandle ioHandle;         // I/O handle of the stream
    AudioMixLatencyClass latencyClass;
};

/**
 * Extension for audio port structure when the audio port is an audio session.
 */
struct AudioPortSessionExt {
    AudioSession session;
};

struct AudioPort {
    AudioPortHandle id;
    AudioPortRole role;
    string name;
    vec<uint32_t> sampleRates;
    vec<bitfield<AudioChannelMask>> channelMasks;
    vec<AudioFormat> formats;
    vec<AudioGain> gains;
    AudioPortConfig activeConfig; // current audio port configuration
    AudioPortType type;  // type is used as a discriminator
    union Ext {
        AudioPortDeviceExt device;
        AudioPortMixExt mix;
        AudioPortSessionExt session;
    } ext;
};

struct ThreadInfo {
    int64_t pid;
    int64_t tid;
};
