xref: /btstack/src/classic/avdtp.h (revision 48070a6f9a60a06fd4d6b4b3b7a756c5fb6a7edb)
18ef7100fSMilanka Ringwald /*
28ef7100fSMilanka Ringwald  * Copyright (C) 2016 BlueKitchen GmbH
38ef7100fSMilanka Ringwald  *
48ef7100fSMilanka Ringwald  * Redistribution and use in source and binary forms, with or without
58ef7100fSMilanka Ringwald  * modification, are permitted provided that the following conditions
68ef7100fSMilanka Ringwald  * are met:
78ef7100fSMilanka Ringwald  *
88ef7100fSMilanka Ringwald  * 1. Redistributions of source code must retain the above copyright
98ef7100fSMilanka Ringwald  *    notice, this list of conditions and the following disclaimer.
108ef7100fSMilanka Ringwald  * 2. Redistributions in binary form must reproduce the above copyright
118ef7100fSMilanka Ringwald  *    notice, this list of conditions and the following disclaimer in the
128ef7100fSMilanka Ringwald  *    documentation and/or other materials provided with the distribution.
138ef7100fSMilanka Ringwald  * 3. Neither the name of the copyright holders nor the names of
148ef7100fSMilanka Ringwald  *    contributors may be used to endorse or promote products derived
158ef7100fSMilanka Ringwald  *    from this software without specific prior written permission.
168ef7100fSMilanka Ringwald  * 4. Any redistribution, use, or modification is done solely for
178ef7100fSMilanka Ringwald  *    personal benefit and not for any commercial purpose or for
188ef7100fSMilanka Ringwald  *    monetary gain.
198ef7100fSMilanka Ringwald  *
208ef7100fSMilanka Ringwald  * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
218ef7100fSMilanka Ringwald  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
228ef7100fSMilanka Ringwald  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
232fca4dadSMilanka Ringwald  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN
242fca4dadSMilanka Ringwald  * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
258ef7100fSMilanka Ringwald  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
268ef7100fSMilanka Ringwald  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
278ef7100fSMilanka Ringwald  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
288ef7100fSMilanka Ringwald  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
298ef7100fSMilanka Ringwald  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
308ef7100fSMilanka Ringwald  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
318ef7100fSMilanka Ringwald  * SUCH DAMAGE.
328ef7100fSMilanka Ringwald  *
338ef7100fSMilanka Ringwald  * Please inquire about commercial licensing options at
348ef7100fSMilanka Ringwald  * [email protected]
358ef7100fSMilanka Ringwald  *
368ef7100fSMilanka Ringwald  */
378ef7100fSMilanka Ringwald 
38fe5a6c4eSMilanka Ringwald /**
39fe5a6c4eSMilanka Ringwald  * Audio/Video Distribution Transport Protocol (AVDTP)
408ef7100fSMilanka Ringwald  *
418ef7100fSMilanka Ringwald  * This protocol defines A/V stream negotiation, establishment, and transmission
428ef7100fSMilanka Ringwald  * procedures. Also specified are the message formats that are exchanged between
438ef7100fSMilanka Ringwald  * such devices to transport their A/V streams in A/V distribution applications.
448ef7100fSMilanka Ringwald  *
458ef7100fSMilanka Ringwald  * Media packets are unidirectional, they travel downstream from AVDTP Source to AVDTP Sink.
468ef7100fSMilanka Ringwald  */
478ef7100fSMilanka Ringwald 
4880e33422SMatthias Ringwald #ifndef AVDTP_H
4980e33422SMatthias Ringwald #define AVDTP_H
508ef7100fSMilanka Ringwald 
518ef7100fSMilanka Ringwald #include <stdint.h>
528ef7100fSMilanka Ringwald #include "hci.h"
53747ec646SMilanka Ringwald #include "btstack_ring_buffer.h"
548ef7100fSMilanka Ringwald 
558ef7100fSMilanka Ringwald #if defined __cplusplus
568ef7100fSMilanka Ringwald extern "C" {
578ef7100fSMilanka Ringwald #endif
588ef7100fSMilanka Ringwald 
598366bc41SMatthias Ringwald // Limit L2CAP MTU to fit largest packet for BR/EDR
608366bc41SMatthias Ringwald #define AVDTP_L2CAP_MTU (HCI_ACL_3DH5_SIZE - L2CAP_HEADER_SIZE)
618366bc41SMatthias Ringwald 
6267ae582dSMilanka Ringwald #define AVDTP_MAX_NUM_SEPS 10
6367ae582dSMilanka Ringwald #define AVDTP_MAX_CSRC_NUM 15
6467ae582dSMilanka Ringwald #define AVDTP_MAX_CONTENT_PROTECTION_TYPE_VALUE_LEN 10
658ef7100fSMilanka Ringwald 
668ef7100fSMilanka Ringwald // Supported Features
671904e5a1SMilanka Ringwald #define AVDTP_SOURCE_FEATURE_MASK_PLAYER        0x0001u
681904e5a1SMilanka Ringwald #define AVDTP_SOURCE_FEATURE_MASK_MICROPHONE    0x0002u
691904e5a1SMilanka Ringwald #define AVDTP_SOURCE_FEATURE_MASK_TUNER         0x0004u
701904e5a1SMilanka Ringwald #define AVDTP_SOURCE_FEATURE_MASK_MIXER         0x0008u
718ef7100fSMilanka Ringwald 
721904e5a1SMilanka Ringwald #define AVDTP_SINK_FEATURE_MASK_HEADPHONE       0x0001u
731904e5a1SMilanka Ringwald #define AVDTP_SINK_FEATURE_MASK_SPEAKER         0x0002u
741904e5a1SMilanka Ringwald #define AVDTP_SINK_FEATURE_MASK_RECORDER        0x0004u
751904e5a1SMilanka Ringwald #define AVDTP_SINK_FEATURE_MASK_AMPLIFIER       0x0008u
768ef7100fSMilanka Ringwald 
778ef7100fSMilanka Ringwald // ACP to INT, Signal Response Header Error Codes
785b391ed7SMatthias Ringwald #define AVDTP_ERROR_CODE_BAD_HEADER_FORMAT     0x01
798ef7100fSMilanka Ringwald 
808ef7100fSMilanka Ringwald // ACP to INT, Signal Response Payload Format Error Codes
815b391ed7SMatthias Ringwald #define AVDTP_ERROR_CODE_BAD_LENGTH                 0x11
825b391ed7SMatthias Ringwald #define AVDTP_ERROR_CODE_BAD_ACP_SEID               0x12
835b391ed7SMatthias Ringwald #define AVDTP_ERROR_CODE_SEP_IN_USE                 0x13
845b391ed7SMatthias Ringwald #define AVDTP_ERROR_CODE_SEP_NOT_IN_USE             0x14
855b391ed7SMatthias Ringwald #define AVDTP_ERROR_CODE_BAD_SERV_CATEGORY          0x17
865b391ed7SMatthias Ringwald #define AVDTP_ERROR_CODE_BAD_PAYLOAD_FORMAT         0x18
875b391ed7SMatthias Ringwald #define AVDTP_ERROR_CODE_NOT_SUPPORTED_COMMAND      0x19
885b391ed7SMatthias Ringwald #define AVDTP_ERROR_CODE_INVALID_CAPABILITIES       0x1A
898ef7100fSMilanka Ringwald 
908ef7100fSMilanka Ringwald // ACP to INT, Signal Response Transport Service Capabilities Error Codes
915b391ed7SMatthias Ringwald #define AVDTP_ERROR_CODE_BAD_RECOVERY_TYPE          0x22
925b391ed7SMatthias Ringwald #define AVDTP_ERROR_CODE_BAD_MEDIA_TRANSPORT_FORMAT 0x23
935b391ed7SMatthias Ringwald #define AVDTP_ERROR_CODE_BAD_RECOVERY_FORMAT        0x25
945b391ed7SMatthias Ringwald #define AVDTP_ERROR_CODE_BAD_ROHC_FORMAT            0x26
955b391ed7SMatthias Ringwald #define AVDTP_ERROR_CODE_BAD_CP_FORMAT              0x27
965b391ed7SMatthias Ringwald #define AVDTP_ERROR_CODE_BAD_MULTIPLEXING_FORMAT    0x28
975b391ed7SMatthias Ringwald #define AVDTP_ERROR_CODE_UNSUPPORTED_CONFIGURATION  0x29
988ef7100fSMilanka Ringwald 
998ef7100fSMilanka Ringwald // ACP to INT, Procedure Error Codes
1005b391ed7SMatthias Ringwald #define AVDTP_ERROR_CODE_BAD_STATE                  0x31
101485c0a4cSMilanka Ringwald 
1025b391ed7SMatthias Ringwald // Internal Error Codes
103485c0a4cSMilanka Ringwald #define AVDTP_INVALID_SEP_SEID                      0xFF
104485c0a4cSMilanka Ringwald 
105dbc2e432SMilanka Ringwald typedef enum {
106dbc2e432SMilanka Ringwald     CODEC_SPECIFIC_ERROR_CODE_ACCEPT                             = 0x00,
107dbc2e432SMilanka Ringwald     CODEC_SPECIFIC_ERROR_CODE_INVALID_CODEC_TYPE                 = 0xC1,
108dbc2e432SMilanka Ringwald     CODEC_SPECIFIC_ERROR_CODE_NOT_SUPPORTED_CODEC_TYPE           = 0xC2,
109dbc2e432SMilanka Ringwald     CODEC_SPECIFIC_ERROR_CODE_INVALID_SAMPLING_FREQUENCY         = 0xC3,
11013993a42SMilanka Ringwald     CODEC_SPECIFIC_ERROR_CODE_NOT_SUPPORTED_SAMPLING_FREQUENCY   = 0xC4,
111dbc2e432SMilanka Ringwald     CODEC_SPECIFIC_ERROR_CODE_INVALID_CHANNEL_MODE               = 0xC5,
112b8163c86SMilanka Ringwald     CODEC_SPECIFIC_ERROR_CODE_NOT_SUPPORTED_CHANNEL_MODE         = 0xC6,
113dbc2e432SMilanka Ringwald     CODEC_SPECIFIC_ERROR_CODE_INVALID_SUBBANDS                   = 0xC7,
114b8163c86SMilanka Ringwald     CODEC_SPECIFIC_ERROR_CODE_NOT_SUPPORTED_SUBBANDS             = 0xC8,
115dbc2e432SMilanka Ringwald     CODEC_SPECIFIC_ERROR_CODE_INVALID_ALLOCATION_METHOD          = 0xC9,
116b8163c86SMilanka Ringwald     CODEC_SPECIFIC_ERROR_CODE_NOT_SUPPORTED_ALLOCATION_METHOD    = 0xCA,
117dbc2e432SMilanka Ringwald     CODEC_SPECIFIC_ERROR_CODE_INVALID_MINIMUM_BITPOOL_VALUE      = 0xCB,
118dbc2e432SMilanka Ringwald     CODEC_SPECIFIC_ERROR_CODE_INVALID_MAXIMUM_BITPOOL_VALUE      = 0xCD,
119b8163c86SMilanka Ringwald     CODEC_SPECIFIC_ERROR_CODE_NOT_SUPPORTED_VBR                  = 0xD3,
120dbc2e432SMilanka Ringwald     CODEC_SPECIFIC_ERROR_CODE_INVALID_OBJECT_TYPE                = 0xD6,
121f8c3a130SMilanka Ringwald     CODEC_SPECIFIC_ERROR_CODE_NOT_SUPPORTED_OBJECT_TYPE          = 0xD7,
122dbc2e432SMilanka Ringwald     CODEC_SPECIFIC_ERROR_CODE_INVALID_CHANNELS                   = 0xD8,
123f8c3a130SMilanka Ringwald     CODEC_SPECIFIC_ERROR_CODE_NOT_SUPPORTED_CHANNELS             = 0xD9,
124dbc2e432SMilanka Ringwald     CODEC_SPECIFIC_ERROR_CODE_INVALID_BLOCK_LENGTH               = 0xDD,
125f8c3a130SMilanka Ringwald     CODEC_SPECIFIC_ERROR_CODE_INVALID_DRC                        = 0xE4,
126dbc2e432SMilanka Ringwald } codec_specific_error_code_t;
127f0c39502SMilanka Ringwald 
1288ef7100fSMilanka Ringwald // Signal Identifier fields
1298ef7100fSMilanka Ringwald typedef enum {
130b0920f25SMilanka Ringwald     AVDTP_SI_NONE = 0x00,
1318ef7100fSMilanka Ringwald     AVDTP_SI_DISCOVER = 0x01,
1328ef7100fSMilanka Ringwald     AVDTP_SI_GET_CAPABILITIES,
1338ef7100fSMilanka Ringwald     AVDTP_SI_SET_CONFIGURATION,
1348ef7100fSMilanka Ringwald     AVDTP_SI_GET_CONFIGURATION,
1358ef7100fSMilanka Ringwald     AVDTP_SI_RECONFIGURE, //5
1368ef7100fSMilanka Ringwald     AVDTP_SI_OPEN,  //6
1378ef7100fSMilanka Ringwald     AVDTP_SI_START, //7
1388ef7100fSMilanka Ringwald     AVDTP_SI_CLOSE,
1398ef7100fSMilanka Ringwald     AVDTP_SI_SUSPEND,
1408ef7100fSMilanka Ringwald     AVDTP_SI_ABORT, //10
1418ef7100fSMilanka Ringwald     AVDTP_SI_SECURITY_CONTROL,
1428ef7100fSMilanka Ringwald     AVDTP_SI_GET_ALL_CAPABILITIES, //12
14348ce193cSMilanka Ringwald     AVDTP_SI_DELAYREPORT,
14448ce193cSMilanka Ringwald #ifdef ENABLE_AVDTP_ACCEPTOR_EXPLICIT_START_STREAM_CONFIRMATION
14548ce193cSMilanka Ringwald     AVDTP_SI_ACCEPT_START
14648ce193cSMilanka Ringwald #endif
1478ef7100fSMilanka Ringwald } avdtp_signal_identifier_t;
1488ef7100fSMilanka Ringwald 
1498ef7100fSMilanka Ringwald typedef enum {
1508ef7100fSMilanka Ringwald     AVDTP_SINGLE_PACKET = 0,
1518ef7100fSMilanka Ringwald     AVDTP_START_PACKET    ,
1528ef7100fSMilanka Ringwald     AVDTP_CONTINUE_PACKET ,
1538ef7100fSMilanka Ringwald     AVDTP_END_PACKET
1548ef7100fSMilanka Ringwald } avdtp_packet_type_t;
1558ef7100fSMilanka Ringwald 
1568ef7100fSMilanka Ringwald typedef enum {
1578ef7100fSMilanka Ringwald     AVDTP_CMD_MSG = 0,
1588ef7100fSMilanka Ringwald     AVDTP_GENERAL_REJECT_MSG   ,
1598ef7100fSMilanka Ringwald     AVDTP_RESPONSE_ACCEPT_MSG ,
1608ef7100fSMilanka Ringwald     AVDTP_RESPONSE_REJECT_MSG
1618ef7100fSMilanka Ringwald } avdtp_message_type_t;
1628ef7100fSMilanka Ringwald 
1638ef7100fSMilanka Ringwald typedef enum {
1648ef7100fSMilanka Ringwald     AVDTP_AUDIO = 0,
1658ef7100fSMilanka Ringwald     AVDTP_VIDEO,
1668ef7100fSMilanka Ringwald     AVDTP_MULTIMEDIA
1678ef7100fSMilanka Ringwald } avdtp_media_type_t;
1688ef7100fSMilanka Ringwald 
1698ef7100fSMilanka Ringwald typedef enum {
1708ef7100fSMilanka Ringwald     AVDTP_CODEC_SBC             = 0x00,
1718ef7100fSMilanka Ringwald     AVDTP_CODEC_MPEG_1_2_AUDIO  = 0x01,
1728ef7100fSMilanka Ringwald     AVDTP_CODEC_MPEG_2_4_AAC    = 0x02,
173e787eab0SMilanka Ringwald     AVDTP_CODEC_MPEG_D_USAC     = 0x03,
1748ef7100fSMilanka Ringwald     AVDTP_CODEC_ATRAC_FAMILY    = 0x04,
1758ef7100fSMilanka Ringwald     AVDTP_CODEC_NON_A2DP        = 0xFF
1768ef7100fSMilanka Ringwald } avdtp_media_codec_type_t;
1778ef7100fSMilanka Ringwald 
1788ef7100fSMilanka Ringwald typedef enum {
17924d5fe84SMilanka Ringwald     AVDTP_USAC_OBJECT_TYPE_MPEG_D_DRC = 0x00,
18024d5fe84SMilanka Ringwald     AVDTP_USAC_OBJECT_TYPE_RFU
18124d5fe84SMilanka Ringwald } avdtp_usac_object_type_t;
18224d5fe84SMilanka Ringwald 
18324d5fe84SMilanka Ringwald typedef enum {
1848ef7100fSMilanka Ringwald     AVDTP_CONTENT_PROTECTION_DTCP = 0x0001,
1858ef7100fSMilanka Ringwald     AVDTP_CONTENT_PROTECTION_SCMS_T = 0x0002
1868ef7100fSMilanka Ringwald } avdtp_content_protection_type_t;
1878ef7100fSMilanka Ringwald 
1888ef7100fSMilanka Ringwald typedef enum {
1898ef7100fSMilanka Ringwald     AVDTP_SOURCE = 0,
1908ef7100fSMilanka Ringwald     AVDTP_SINK
1918ef7100fSMilanka Ringwald } avdtp_sep_type_t;
1928ef7100fSMilanka Ringwald 
1938ef7100fSMilanka Ringwald typedef enum {
1945ace758fSMilanka Ringwald     AVDTP_ROLE_SOURCE = 0,
195149deddbSMilanka Ringwald     AVDTP_ROLE_SINK
1965ace758fSMilanka Ringwald } avdtp_role_t;
1975ace758fSMilanka Ringwald 
1985ace758fSMilanka Ringwald typedef enum {
1998ef7100fSMilanka Ringwald     AVDTP_SERVICE_CATEGORY_INVALID_0 = 0x00,
2008ef7100fSMilanka Ringwald     AVDTP_MEDIA_TRANSPORT = 0X01,
2018ef7100fSMilanka Ringwald     AVDTP_REPORTING,
2028ef7100fSMilanka Ringwald     AVDTP_RECOVERY,
2038ef7100fSMilanka Ringwald     AVDTP_CONTENT_PROTECTION, //4
2048ef7100fSMilanka Ringwald     AVDTP_HEADER_COMPRESSION, //5
2058ef7100fSMilanka Ringwald     AVDTP_MULTIPLEXING,       //6
2068ef7100fSMilanka Ringwald     AVDTP_MEDIA_CODEC,        //7
2078ef7100fSMilanka Ringwald     AVDTP_DELAY_REPORTING,    //8
2088ef7100fSMilanka Ringwald     AVDTP_SERVICE_CATEGORY_INVALID_FF = 0xFF
2098ef7100fSMilanka Ringwald } avdtp_service_category_t;
2108ef7100fSMilanka Ringwald 
2118ef7100fSMilanka Ringwald typedef struct {
2128ef7100fSMilanka Ringwald     uint8_t recovery_type;                  // 0x01 = RFC2733
2138ef7100fSMilanka Ringwald     uint8_t maximum_recovery_window_size;   // 0x01 to 0x18, for a Transport Packet
2148ef7100fSMilanka Ringwald     uint8_t maximum_number_media_packets;   // 0x01 to 0x18, The maximum number of media packets a specific parity code covers
2158ef7100fSMilanka Ringwald } avdtp_recovery_capabilities_t;
2168ef7100fSMilanka Ringwald 
2178ef7100fSMilanka Ringwald typedef struct {
2188ef7100fSMilanka Ringwald     avdtp_media_type_t       media_type;
2198ef7100fSMilanka Ringwald     avdtp_media_codec_type_t media_codec_type;
2208ef7100fSMilanka Ringwald     uint16_t  media_codec_information_len;
22178d08d09SMilanka Ringwald     uint8_t * media_codec_information;
2228ef7100fSMilanka Ringwald } adtvp_media_codec_capabilities_t;
2238ef7100fSMilanka Ringwald 
224c79ed74cSMilanka Ringwald 
225c79ed74cSMilanka Ringwald typedef struct {
2268ef7100fSMilanka Ringwald     uint16_t cp_type;
2278ef7100fSMilanka Ringwald     uint16_t cp_type_value_len;
22867ae582dSMilanka Ringwald     uint8_t cp_type_value[AVDTP_MAX_CONTENT_PROTECTION_TYPE_VALUE_LEN];
2298ef7100fSMilanka Ringwald } adtvp_content_protection_t;
2308ef7100fSMilanka Ringwald 
2318ef7100fSMilanka Ringwald typedef struct{
2328ef7100fSMilanka Ringwald     uint8_t back_ch;  // byte0 - bit 8; 0=Not Available/Not Used; 1=Available/In Use
2338ef7100fSMilanka Ringwald     uint8_t media;    // byte0 - bit 7
2348ef7100fSMilanka Ringwald     uint8_t recovery; // byte0 - bit 6
2358ef7100fSMilanka Ringwald } avdtp_header_compression_capabilities_t;
2368ef7100fSMilanka Ringwald 
2378ef7100fSMilanka Ringwald typedef struct{
2388ef7100fSMilanka Ringwald     uint8_t fragmentation; // byte0 - bit 8, Allow Adaptation Layer Fragmentation, 0 no, 1 yes
2398ef7100fSMilanka Ringwald     // Request/indicate value of the Transport Session Identifier for a media, reporting, or recovery transport sessions, respectively
2408ef7100fSMilanka Ringwald     uint8_t transport_identifiers_num;
2418ef7100fSMilanka Ringwald     uint8_t transport_session_identifiers[3];   // byte1, upper 5bits, 0x01 to 0x1E
2428ef7100fSMilanka Ringwald     // Request/indicate value for TCID for a media, reporting, or transport session
2438ef7100fSMilanka Ringwald     uint8_t tcid[3];         // byte2 0x01 to 0x1E
2448ef7100fSMilanka Ringwald } avdtp_multiplexing_mode_capabilities_t;
2458ef7100fSMilanka Ringwald 
2468ef7100fSMilanka Ringwald typedef struct{
2478ef7100fSMilanka Ringwald     avdtp_recovery_capabilities_t recovery;
2488ef7100fSMilanka Ringwald     adtvp_media_codec_capabilities_t media_codec;
2498ef7100fSMilanka Ringwald     adtvp_content_protection_t content_protection;
2508ef7100fSMilanka Ringwald     avdtp_header_compression_capabilities_t header_compression;
2518ef7100fSMilanka Ringwald     avdtp_multiplexing_mode_capabilities_t multiplexing_mode;
2528ef7100fSMilanka Ringwald } avdtp_capabilities_t;
2538ef7100fSMilanka Ringwald 
2548ef7100fSMilanka Ringwald typedef enum{
2558ef7100fSMilanka Ringwald     AVDTP_SBC_48000 = 1,
2568ef7100fSMilanka Ringwald     AVDTP_SBC_44100 = 2,
2578ef7100fSMilanka Ringwald     AVDTP_SBC_32000 = 4,
2588ef7100fSMilanka Ringwald     AVDTP_SBC_16000 = 8
2598ef7100fSMilanka Ringwald } avdtp_sbc_sampling_frequency_t;
2608ef7100fSMilanka Ringwald 
2618ef7100fSMilanka Ringwald typedef enum{
2628ef7100fSMilanka Ringwald     AVDTP_SBC_JOINT_STEREO  = 1,
2638ef7100fSMilanka Ringwald     AVDTP_SBC_STEREO        = 2,
2648ef7100fSMilanka Ringwald     AVDTP_SBC_DUAL_CHANNEL  = 4,
2658ef7100fSMilanka Ringwald     AVDTP_SBC_MONO          = 8
2668ef7100fSMilanka Ringwald } avdtp_sbc_channel_mode_t;
2678ef7100fSMilanka Ringwald 
2688ef7100fSMilanka Ringwald typedef enum{
2698ef7100fSMilanka Ringwald     AVDTP_SBC_BLOCK_LENGTH_16 = 1,
2708ef7100fSMilanka Ringwald     AVDTP_SBC_BLOCK_LENGTH_12 = 2,
2718ef7100fSMilanka Ringwald     AVDTP_SBC_BLOCK_LENGTH_8  = 4,
2728ef7100fSMilanka Ringwald     AVDTP_SBC_BLOCK_LENGTH_4  = 8
2738ef7100fSMilanka Ringwald } avdtp_sbc_block_length_t;
2748ef7100fSMilanka Ringwald 
2758ef7100fSMilanka Ringwald typedef enum{
2768ef7100fSMilanka Ringwald     AVDTP_SBC_SUBBANDS_8 = 1,
2778ef7100fSMilanka Ringwald     AVDTP_SBC_SUBBANDS_4 = 2
2788ef7100fSMilanka Ringwald } avdtp_sbc_subbands_t;
2798ef7100fSMilanka Ringwald 
2808ef7100fSMilanka Ringwald typedef enum{
2818ef7100fSMilanka Ringwald     AVDTP_SBC_ALLOCATION_METHOD_LOUDNESS = 1,
2828ef7100fSMilanka Ringwald     AVDTP_SBC_ALLOCATION_METHOD_SNR      = 2
2838ef7100fSMilanka Ringwald } avdtp_sbc_allocation_method_t;
2848ef7100fSMilanka Ringwald 
2858ef7100fSMilanka Ringwald typedef struct {
2868ef7100fSMilanka Ringwald     uint8_t fragmentation;
2878ef7100fSMilanka Ringwald     uint8_t starting_packet; // of fragmented SBC frame
2888ef7100fSMilanka Ringwald     uint8_t last_packet;     // of fragmented SBC frame
2898ef7100fSMilanka Ringwald     uint8_t num_frames;
2908ef7100fSMilanka Ringwald } avdtp_sbc_codec_header_t;
2918ef7100fSMilanka Ringwald 
292930efd27SMatthias Ringwald typedef enum {
293930efd27SMatthias Ringwald     AVDTP_MPEG_LAYER_1 = 1,
294930efd27SMatthias Ringwald     AVDTP_MPEG_LAYER_2,
295930efd27SMatthias Ringwald     AVDTP_MPEG_LAYER_3,
296930efd27SMatthias Ringwald } avdtp_mpeg_layer_t;
297930efd27SMatthias Ringwald 
298930efd27SMatthias Ringwald 
299930efd27SMatthias Ringwald typedef enum {
300930efd27SMatthias Ringwald     AVDTP_AAC_MPEG2_LC = 1,
301930efd27SMatthias Ringwald     AVDTP_AAC_MPEG4_LC,
302930efd27SMatthias Ringwald     AVDTP_AAC_MPEG4_LTP,
303e787eab0SMilanka Ringwald     AVDTP_AAC_MPEG4_SCALABLE,
304e787eab0SMilanka Ringwald     AVDTP_AAC_MPEG4_HE_AAC,
305e787eab0SMilanka Ringwald     AVDTP_AAC_MPEG4_HE_AACv2,
306e787eab0SMilanka Ringwald     AVDTP_AAC_MPEG4_HE_AAC_ELDv2
307930efd27SMatthias Ringwald } avdtp_aac_object_type_t;
308930efd27SMatthias Ringwald 
309930efd27SMatthias Ringwald typedef enum {
310930efd27SMatthias Ringwald     AVDTP_ATRAC_VERSION_1 = 1,
311930efd27SMatthias Ringwald     AVDTP_ATRAC_VERSION_2,
312930efd27SMatthias Ringwald     AVDTP_ATRAC_VERSION_3
313930efd27SMatthias Ringwald } avdtp_atrac_version_t;
314930efd27SMatthias Ringwald 
315930efd27SMatthias Ringwald // used for MPEG1/2 Audio, ATRAC (no stereo mode)
316930efd27SMatthias Ringwald typedef enum {
317930efd27SMatthias Ringwald     AVDTP_CHANNEL_MODE_MONO = 1,
318930efd27SMatthias Ringwald     AVDTP_CHANNEL_MODE_DUAL_CHANNEL,
319930efd27SMatthias Ringwald     AVDTP_CHANNEL_MODE_STEREO,
320930efd27SMatthias Ringwald     AVDTP_CHANNEL_MODE_JOINT_STEREO,
321930efd27SMatthias Ringwald } avdtp_channel_mode_t;
3228ef7100fSMilanka Ringwald 
3238ef7100fSMilanka Ringwald typedef struct {
3248691a66cSMatthias Ringwald     uint16_t                        sampling_frequency;
3258691a66cSMatthias Ringwald     avdtp_channel_mode_t            channel_mode;
326*48070a6fSMilanka Ringwald     avdtp_sbc_block_length_t        block_length;
327*48070a6fSMilanka Ringwald     avdtp_sbc_subbands_t            subbands;
3288691a66cSMatthias Ringwald     avdtp_sbc_allocation_method_t   allocation_method;
3298691a66cSMatthias Ringwald     uint8_t                         min_bitpool_value;
3308691a66cSMatthias Ringwald     uint8_t                         max_bitpool_value;
3318691a66cSMatthias Ringwald } avdtp_configuration_sbc_t;
3328691a66cSMatthias Ringwald 
3338691a66cSMatthias Ringwald typedef struct {
3348691a66cSMatthias Ringwald     avdtp_mpeg_layer_t      layer;
3358691a66cSMatthias Ringwald     uint8_t                 crc;
3368691a66cSMatthias Ringwald     avdtp_channel_mode_t    channel_mode;
3378691a66cSMatthias Ringwald     uint8_t                 media_payload_format;
3388691a66cSMatthias Ringwald     uint16_t                sampling_frequency;
3398691a66cSMatthias Ringwald     uint8_t                 vbr;
3408691a66cSMatthias Ringwald     uint8_t                 bit_rate_index;
3418691a66cSMatthias Ringwald } avdtp_configuration_mpeg_audio_t;
3428691a66cSMatthias Ringwald 
3438691a66cSMatthias Ringwald typedef struct {
3448691a66cSMatthias Ringwald     avdtp_aac_object_type_t object_type;
3458691a66cSMatthias Ringwald     uint32_t                sampling_frequency;
3468691a66cSMatthias Ringwald     uint8_t                 channels;
3478691a66cSMatthias Ringwald     uint32_t                bit_rate;
3488691a66cSMatthias Ringwald     uint8_t                 vbr;
349e787eab0SMilanka Ringwald     bool                    drc;
3508691a66cSMatthias Ringwald } avdtp_configuration_mpeg_aac_t;
3518691a66cSMatthias Ringwald 
3528691a66cSMatthias Ringwald typedef struct {
35324d5fe84SMilanka Ringwald     avdtp_usac_object_type_t object_type;
35424d5fe84SMilanka Ringwald     uint32_t                sampling_frequency;
35524d5fe84SMilanka Ringwald     uint8_t                 channels;
35624d5fe84SMilanka Ringwald     uint32_t                bit_rate;
35724d5fe84SMilanka Ringwald     uint8_t                 vbr;
35824d5fe84SMilanka Ringwald } avdtp_configuration_mpegd_usac_t;
35924d5fe84SMilanka Ringwald 
36024d5fe84SMilanka Ringwald typedef struct {
3618691a66cSMatthias Ringwald     avdtp_atrac_version_t   version;
3628691a66cSMatthias Ringwald     avdtp_channel_mode_t    channel_mode;
3638691a66cSMatthias Ringwald     uint16_t                sampling_frequency;
3648691a66cSMatthias Ringwald     uint8_t                 vbr;
3658691a66cSMatthias Ringwald     uint8_t                 bit_rate_index;
3668691a66cSMatthias Ringwald     uint16_t                maximum_sul;
3678691a66cSMatthias Ringwald } avdtp_configuration_atrac_t;
3688691a66cSMatthias Ringwald 
3698691a66cSMatthias Ringwald typedef struct {
3708ef7100fSMilanka Ringwald     uint8_t version;
3718ef7100fSMilanka Ringwald     uint8_t padding;
3728ef7100fSMilanka Ringwald     uint8_t extension;
3738ef7100fSMilanka Ringwald     uint8_t csrc_count;
3748ef7100fSMilanka Ringwald     uint8_t marker;
3758ef7100fSMilanka Ringwald     uint8_t payload_type;
3768ef7100fSMilanka Ringwald 
3778ef7100fSMilanka Ringwald     uint16_t sequence_number;
3788ef7100fSMilanka Ringwald     uint32_t timestamp;
3798ef7100fSMilanka Ringwald     uint32_t synchronization_source;
3808ef7100fSMilanka Ringwald 
38167ae582dSMilanka Ringwald     uint32_t csrc_list[AVDTP_MAX_CSRC_NUM];
3828ef7100fSMilanka Ringwald } avdtp_media_packet_header_t;
3838ef7100fSMilanka Ringwald 
3848ef7100fSMilanka Ringwald typedef enum {
38587d9d508SMilanka Ringwald     AVDTP_BASIC_SERVICE_MODE = 0,
3868ef7100fSMilanka Ringwald     AVDTP_MULTIPLEXING_SERVICE_MODE
3878ef7100fSMilanka Ringwald } avdtp_service_mode_t;
3888ef7100fSMilanka Ringwald 
3898ef7100fSMilanka Ringwald typedef enum {
39087d9d508SMilanka Ringwald     AVDTP_STREAM_ENDPOINT_IDLE = 0,
3918ef7100fSMilanka Ringwald     AVDTP_STREAM_ENDPOINT_CONFIGURATION_SUBSTATEMACHINE,
3928ef7100fSMilanka Ringwald     AVDTP_STREAM_ENDPOINT_CONFIGURED,
393747ec646SMilanka Ringwald 
394747ec646SMilanka Ringwald     AVDTP_STREAM_ENDPOINT_W2_REQUEST_OPEN_STREAM,
39541c62a08SMilanka Ringwald     AVDTP_STREAM_ENDPOINT_W4_ACCEPT_OPEN_STREAM,
3968ef7100fSMilanka Ringwald     AVDTP_STREAM_ENDPOINT_W4_L2CAP_FOR_MEDIA_CONNECTED,
397747ec646SMilanka Ringwald 
3988ef7100fSMilanka Ringwald     AVDTP_STREAM_ENDPOINT_OPENED,
3998ef7100fSMilanka Ringwald     AVDTP_STREAM_ENDPOINT_STREAMING,
400747ec646SMilanka Ringwald 
4018ef7100fSMilanka Ringwald     AVDTP_STREAM_ENDPOINT_CLOSING,
4028ef7100fSMilanka Ringwald     AVDTP_STREAM_ENDPOINT_ABORTING,
4038ef7100fSMilanka Ringwald     AVDTP_STREAM_ENDPOINT_W4_L2CAP_FOR_MEDIA_DISCONNECTED
4048ef7100fSMilanka Ringwald } avdtp_stream_endpoint_state_t;
4058ef7100fSMilanka Ringwald 
4068ef7100fSMilanka Ringwald typedef enum {
40787d9d508SMilanka Ringwald     AVDTP_INITIATOR_STREAM_CONFIG_IDLE = 0,
4088ef7100fSMilanka Ringwald     AVDTP_INITIATOR_W2_SET_CONFIGURATION,
4098ef7100fSMilanka Ringwald     AVDTP_INITIATOR_W2_SUSPEND_STREAM_WITH_SEID,
4108ef7100fSMilanka Ringwald     AVDTP_INITIATOR_W2_RECONFIGURE_STREAM_WITH_SEID,
411747ec646SMilanka Ringwald 
412747ec646SMilanka Ringwald     AVDTP_INITIATOR_W2_OPEN_STREAM,
413747ec646SMilanka Ringwald 
4148ef7100fSMilanka Ringwald     AVDTP_INITIATOR_W2_STREAMING_ABORT,
4158ef7100fSMilanka Ringwald     AVDTP_INITIATOR_FRAGMENTATED_COMMAND,
4168ef7100fSMilanka Ringwald     AVDTP_INITIATOR_W4_ANSWER
4178ef7100fSMilanka Ringwald } avdtp_initiator_stream_endpoint_state_t;
4188ef7100fSMilanka Ringwald 
4198ef7100fSMilanka Ringwald typedef enum {
42087d9d508SMilanka Ringwald     AVDTP_ACCEPTOR_STREAM_CONFIG_IDLE = 0,
421cdf930c3SMilanka Ringwald     AVDTP_ACCEPTOR_W2_ACCEPT_GET_CAPABILITIES,
422cdf930c3SMilanka Ringwald     AVDTP_ACCEPTOR_W2_ACCEPT_GET_ALL_CAPABILITIES,
423cdf930c3SMilanka Ringwald     AVDTP_ACCEPTOR_W2_ACCEPT_DELAY_REPORT,
424cdf930c3SMilanka Ringwald     AVDTP_ACCEPTOR_W2_ACCEPT_SET_CONFIGURATION,
425cdf930c3SMilanka Ringwald     AVDTP_ACCEPTOR_W2_ACCEPT_RECONFIGURE,
426cdf930c3SMilanka Ringwald     AVDTP_ACCEPTOR_W2_ACCEPT_GET_CONFIGURATION,
427cdf930c3SMilanka Ringwald     AVDTP_ACCEPTOR_W2_ACCEPT_OPEN_STREAM,
42848ce193cSMilanka Ringwald #ifdef ENABLE_AVDTP_ACCEPTOR_EXPLICIT_START_STREAM_CONFIRMATION
42948ce193cSMilanka Ringwald     AVDTP_ACCEPTOR_W4_USER_CONFIRM_START_STREAM,
43048ce193cSMilanka Ringwald     AVDTP_ACCEPTOR_W2_REJECT_START_STREAM,
43148ce193cSMilanka Ringwald #endif
43248ce193cSMilanka Ringwald     AVDTP_ACCEPTOR_W2_ACCEPT_START_STREAM,
433cdf930c3SMilanka Ringwald     AVDTP_ACCEPTOR_W2_ACCEPT_CLOSE_STREAM,
434cdf930c3SMilanka Ringwald     AVDTP_ACCEPTOR_W2_ACCEPT_ABORT_STREAM,
435cdf930c3SMilanka Ringwald     AVDTP_ACCEPTOR_W2_ACCEPT_SUSPEND_STREAM,
4368ef7100fSMilanka Ringwald     AVDTP_ACCEPTOR_W2_REJECT_WITH_ERROR_CODE,
4378ef7100fSMilanka Ringwald     AVDTP_ACCEPTOR_W2_REJECT_CATEGORY_WITH_ERROR_CODE,
438cdf930c3SMilanka Ringwald     AVDTP_ACCEPTOR_W2_REJECT_UNKNOWN_CMD
4398ef7100fSMilanka Ringwald } avdtp_acceptor_stream_endpoint_state_t;
4408ef7100fSMilanka Ringwald 
4418ef7100fSMilanka Ringwald typedef struct {
4428ef7100fSMilanka Ringwald     uint8_t seid;           // 0x01 – 0x3E, 6bit
4438ef7100fSMilanka Ringwald     uint8_t in_use;         // 1 bit, 0 - not in use, 1 - in use
4448ef7100fSMilanka Ringwald     avdtp_media_type_t media_type;     // 4 bit
4458ef7100fSMilanka Ringwald     avdtp_sep_type_t   type;       // 1 bit, 0 - SRC, 1 - SNK
4468ef7100fSMilanka Ringwald 
4478ef7100fSMilanka Ringwald     uint16_t registered_service_categories;
4488ef7100fSMilanka Ringwald     avdtp_capabilities_t capabilities;
4498ef7100fSMilanka Ringwald 
4508ef7100fSMilanka Ringwald     uint16_t configured_service_categories;
4518ef7100fSMilanka Ringwald     avdtp_capabilities_t configuration;
4528ef7100fSMilanka Ringwald } avdtp_sep_t;
4538ef7100fSMilanka Ringwald 
4548ef7100fSMilanka Ringwald typedef enum {
45587d9d508SMilanka Ringwald     AVDTP_SIGNALING_CONNECTION_IDLE = 0,
4565797104aSMilanka Ringwald     AVDTP_SIGNALING_W2_SEND_SDP_QUERY_FOR_REMOTE_SINK,
457149deddbSMilanka Ringwald     AVDTP_SIGNALING_W4_SDP_QUERY_FOR_REMOTE_SINK_COMPLETE,
4585797104aSMilanka Ringwald     AVDTP_SIGNALING_W2_SEND_SDP_QUERY_FOR_REMOTE_SOURCE,
459149deddbSMilanka Ringwald     AVDTP_SIGNALING_W4_SDP_QUERY_FOR_REMOTE_SOURCE_COMPLETE,
4608ef7100fSMilanka Ringwald     AVDTP_SIGNALING_CONNECTION_W4_L2CAP_CONNECTED,
461ff53b162SMilanka Ringwald     AVDTP_SIGNALING_CONNECTION_W2_L2CAP_RETRY,
4628ef7100fSMilanka Ringwald     AVDTP_SIGNALING_CONNECTION_OPENED,
4638ef7100fSMilanka Ringwald     AVDTP_SIGNALING_CONNECTION_W4_L2CAP_DISCONNECTED
4648ef7100fSMilanka Ringwald } avdtp_connection_state_t;
4658ef7100fSMilanka Ringwald 
4668ef7100fSMilanka Ringwald typedef enum {
46787d9d508SMilanka Ringwald     AVDTP_SIGNALING_CONNECTION_ACCEPTOR_IDLE = 0,
4688ef7100fSMilanka Ringwald     AVDTP_SIGNALING_CONNECTION_ACCEPTOR_W2_ANSWER_DISCOVER_SEPS,
4698ef7100fSMilanka Ringwald     AVDTP_SIGNALING_CONNECTION_ACCEPTOR_W2_REJECT_WITH_ERROR_CODE,
4708ef7100fSMilanka Ringwald     AVDTP_SIGNALING_CONNECTION_ACCEPTOR_W2_REJECT_CATEGORY_WITH_ERROR_CODE,
4718ef7100fSMilanka Ringwald     AVDTP_SIGNALING_CONNECTION_ACCEPTOR_W2_GENERAL_REJECT_WITH_ERROR_CODE
4728ef7100fSMilanka Ringwald } avdtp_acceptor_connection_state_t;
4738ef7100fSMilanka Ringwald 
4748ef7100fSMilanka Ringwald typedef enum {
47587d9d508SMilanka Ringwald     AVDTP_SIGNALING_CONNECTION_INITIATOR_IDLE = 0,
4768ef7100fSMilanka Ringwald     AVDTP_SIGNALING_CONNECTION_INITIATOR_W2_DISCOVER_SEPS,
477e71e31feSMatthias Ringwald     AVDTP_SIGNALING_CONNECTION_INITIATOR_W2_SEND_SDP_QUERY_THEN_GET_ALL_CAPABILITIES_FROM_REMOTE_SINK,
478e71e31feSMatthias Ringwald     AVDTP_SIGNALING_CONNECTION_INITIATOR_W2_SEND_SDP_QUERY_THEN_GET_ALL_CAPABILITIES_FROM_REMOTE_SOURCE,
479cc61e7e9SMilanka Ringwald     AVDTP_SIGNALING_CONNECTION_INITIATOR_W4_SDP_QUERY_COMPLETE_THEN_GET_ALL_CAPABILITIES,
4808ef7100fSMilanka Ringwald     AVDTP_SIGNALING_CONNECTION_INITIATOR_W2_GET_CAPABILITIES,
4818ef7100fSMilanka Ringwald     AVDTP_SIGNALING_CONNECTION_INITIATOR_W2_GET_ALL_CAPABILITIES,
4828ef7100fSMilanka Ringwald     AVDTP_SIGNALING_CONNECTION_INITIATOR_W2_GET_CONFIGURATION,
483619d0564SMilanka Ringwald     AVDTP_SIGNALING_CONNECTION_INITIATOR_W2_SEND_DELAY_REPORT,
4848ef7100fSMilanka Ringwald     AVDTP_SIGNALING_CONNECTION_INITIATOR_W4_ANSWER
4858ef7100fSMilanka Ringwald } avdtp_initiator_connection_state_t;
4868ef7100fSMilanka Ringwald 
4878ef7100fSMilanka Ringwald typedef struct {
4888ef7100fSMilanka Ringwald     uint8_t  command[200];
4898ef7100fSMilanka Ringwald     uint16_t size;
4908ef7100fSMilanka Ringwald     uint16_t offset;
4918ef7100fSMilanka Ringwald     uint8_t  acp_seid;
4928ef7100fSMilanka Ringwald     uint8_t  int_seid;
493ab2445a0SMatthias Ringwald     uint8_t transaction_label;
4948ef7100fSMilanka Ringwald     uint16_t num_packets;
4959413b167SMilanka Ringwald     avdtp_signal_identifier_t   signal_identifier;
4969413b167SMilanka Ringwald     avdtp_message_type_t        message_type;
4979413b167SMilanka Ringwald     avdtp_packet_type_t         packet_type;
4988ef7100fSMilanka Ringwald } avdtp_signaling_packet_t;
4998ef7100fSMilanka Ringwald 
500e57d7404SMatthias Ringwald typedef enum {
50187d9d508SMilanka Ringwald     AVDTP_CONFIGURATION_STATE_IDLE = 0,
502e57d7404SMatthias Ringwald     AVDTP_CONFIGURATION_STATE_LOCAL_INITIATED,
503e57d7404SMatthias Ringwald     AVDTP_CONFIGURATION_STATE_LOCAL_CONFIGURED,
504e57d7404SMatthias Ringwald     AVDTP_CONFIGURATION_STATE_REMOTE_INITIATED,
505e57d7404SMatthias Ringwald     AVDTP_CONFIGURATION_STATE_REMOTE_CONFIGURED,
506e57d7404SMatthias Ringwald } avtdp_configuration_state_t;
50763331bf4SMilanka Ringwald 
50887d9d508SMilanka Ringwald typedef enum {
50987d9d508SMilanka Ringwald     A2DP_IDLE = 0,
51087d9d508SMilanka Ringwald     A2DP_W4_CONNECTED,
51187d9d508SMilanka Ringwald     A2DP_CONNECTED,
512cd94cb8eSMatthias Ringwald     A2DP_DISCOVER_SEPS,
513cd94cb8eSMatthias Ringwald     A2DP_GET_CAPABILITIES,
5143f8d9db2SMilanka Ringwald     A2DP_W2_GET_ALL_CAPABILITIES, //5
5150d4e1353SMatthias Ringwald     A2DP_DISCOVERY_DONE,
5163f8d9db2SMilanka Ringwald     A2DP_SET_CONFIGURATION,
51787d9d508SMilanka Ringwald     A2DP_W4_GET_CONFIGURATION,
51887d9d508SMilanka Ringwald     A2DP_W4_SET_CONFIGURATION,
51987d9d508SMilanka Ringwald     A2DP_CONFIGURED,
5203f8d9db2SMilanka Ringwald     A2DP_W2_SUSPEND_STREAM_WITH_SEID, //10
52187d9d508SMilanka Ringwald     A2DP_W2_RECONFIGURE_WITH_SEID,
5223f8d9db2SMilanka Ringwald     A2DP_W2_OPEN_STREAM_WITH_SEID,
52387d9d508SMilanka Ringwald     A2DP_W4_OPEN_STREAM_WITH_SEID,
52487d9d508SMilanka Ringwald     A2DP_W2_START_STREAM_WITH_SEID,
5253f8d9db2SMilanka Ringwald     A2DP_W2_ABORT_STREAM_WITH_SEID,   //15
52687d9d508SMilanka Ringwald     A2DP_W2_STOP_STREAM_WITH_SEID,
52787d9d508SMilanka Ringwald     A2DP_STREAMING_OPENED
52887d9d508SMilanka Ringwald } a2dp_state_t;
52987d9d508SMilanka Ringwald 
530ffc20ab4SMatthias Ringwald typedef struct {
531ffc20ab4SMatthias Ringwald     bool         discover_seps;
532ffc20ab4SMatthias Ringwald     bool         outgoing_active;
533ffc20ab4SMatthias Ringwald     bool         have_config;
534ffc20ab4SMatthias Ringwald     bool         stream_endpoint_configured;
535ffc20ab4SMatthias Ringwald     a2dp_state_t state;
536ffc20ab4SMatthias Ringwald     struct avdtp_stream_endpoint * local_stream_endpoint;
537ffc20ab4SMatthias Ringwald } a2dp_config_process_t;
53887d9d508SMilanka Ringwald 
5398ef7100fSMilanka Ringwald typedef struct {
5408ef7100fSMilanka Ringwald     btstack_linked_item_t    item;
5418ef7100fSMilanka Ringwald     bd_addr_t remote_addr;
542f9bca1f3SMilanka Ringwald 
5434ccacc40SMilanka Ringwald     uint16_t avdtp_cid;
544146fc0fbSMilanka Ringwald     hci_con_handle_t con_handle;
545b1549ed3SMilanka Ringwald 
546b1549ed3SMilanka Ringwald     // SDP results
547b1549ed3SMilanka Ringwald     uint16_t avdtp_l2cap_psm;
548b1549ed3SMilanka Ringwald     uint16_t avdtp_version;
549b1549ed3SMilanka Ringwald     bool     sink_supported;
550b1549ed3SMilanka Ringwald     bool     source_supported;
5515ace758fSMilanka Ringwald 
5529413b167SMilanka Ringwald     uint16_t l2cap_signaling_cid;
553f0c39502SMilanka Ringwald     uint16_t l2cap_mtu;
5548ef7100fSMilanka Ringwald 
5558ef7100fSMilanka Ringwald     avdtp_connection_state_t state;
5568ef7100fSMilanka Ringwald     avdtp_acceptor_connection_state_t  acceptor_connection_state;
5578ef7100fSMilanka Ringwald     avdtp_initiator_connection_state_t initiator_connection_state;
5588ef7100fSMilanka Ringwald 
55930c0b5e7SMatthias Ringwald     // used to reassemble fragmented commands
56050453b92SMatthias Ringwald     avdtp_signaling_packet_t acceptor_signaling_packet;
56130c0b5e7SMatthias Ringwald 
56230c0b5e7SMatthias Ringwald     // used to prepare outgoing signaling packets
56350453b92SMatthias Ringwald     avdtp_signaling_packet_t initiator_signaling_packet;
5648ef7100fSMilanka Ringwald 
5655bd73fa2SMatthias Ringwald     uint8_t initiator_local_seid;
56696dcd0f4SMatthias Ringwald     uint8_t initiator_remote_seid;
567619d0564SMilanka Ringwald 
5685bd73fa2SMatthias Ringwald     uint8_t acceptor_local_seid;
5695bd73fa2SMatthias Ringwald 
570619d0564SMilanka Ringwald     uint16_t delay_ms;
571619d0564SMilanka Ringwald 
572bdbc3ef6SMilanka Ringwald     // for repeating the set_configuration
573bdbc3ef6SMilanka Ringwald     void * active_stream_endpoint;
5749413b167SMilanka Ringwald 
5758ef7100fSMilanka Ringwald     uint8_t initiator_transaction_label;
5768ef7100fSMilanka Ringwald     uint8_t acceptor_transaction_label;
577d80ccd43SMatthias Ringwald     bool    wait_to_send_acceptor;
578d80ccd43SMatthias Ringwald 	bool    wait_to_send_initiator;
5798ef7100fSMilanka Ringwald 
58067ae582dSMilanka Ringwald     uint8_t suspended_seids[AVDTP_MAX_NUM_SEPS];
5818ef7100fSMilanka Ringwald     uint8_t num_suspended_seids;
5828ef7100fSMilanka Ringwald 
5838ef7100fSMilanka Ringwald     uint8_t reject_service_category;
5848ef7100fSMilanka Ringwald     avdtp_signal_identifier_t reject_signal_identifier;
5858ef7100fSMilanka Ringwald     uint8_t error_code;
58644c53bbcSMilanka Ringwald 
587e57d7404SMatthias Ringwald     // configuration state machine
588e57d7404SMatthias Ringwald     avtdp_configuration_state_t configuration_state;
589e57d7404SMatthias Ringwald 
590f0c39502SMilanka Ringwald     bool incoming_declined;
591ff53b162SMilanka Ringwald     btstack_timer_source_t retry_timer;
59262c4ec82SMilanka Ringwald 
5932e3fcb13SMatthias Ringwald     // A2DP SOURCE
594ffc20ab4SMatthias Ringwald     a2dp_config_process_t a2dp_source_config_process;
59562c4ec82SMilanka Ringwald 
5962e3fcb13SMatthias Ringwald     // A2DP SINK
597ffc20ab4SMatthias Ringwald     a2dp_config_process_t a2dp_sink_config_process;
5982e3fcb13SMatthias Ringwald 
5998ef7100fSMilanka Ringwald } avdtp_connection_t;
6008ef7100fSMilanka Ringwald 
6018ef7100fSMilanka Ringwald typedef struct avdtp_stream_endpoint {
6028ef7100fSMilanka Ringwald     btstack_linked_item_t    item;
6038ef7100fSMilanka Ringwald 
60482767773SMatthias Ringwald     // original capabilities configured via avdtp_register_x_category
6058ef7100fSMilanka Ringwald     avdtp_sep_t sep;
60682767773SMatthias Ringwald 
6070d5e852dSMatthias Ringwald     // media codec configuration - provided by user
60882767773SMatthias Ringwald     uint16_t  media_codec_configuration_len;
60982767773SMatthias Ringwald     uint8_t * media_codec_configuration_info;
61082767773SMatthias Ringwald 
611485c0a4cSMilanka Ringwald     avdtp_sep_t remote_sep;
61257f317a1SMilanka Ringwald     hci_con_handle_t media_con_handle;
6138ef7100fSMilanka Ringwald     uint16_t l2cap_media_cid;
6148ef7100fSMilanka Ringwald     uint16_t l2cap_reporting_cid;
6158ef7100fSMilanka Ringwald     uint16_t l2cap_recovery_cid;
6168ef7100fSMilanka Ringwald 
6178ef7100fSMilanka Ringwald     avdtp_stream_endpoint_state_t  state;
6188ef7100fSMilanka Ringwald     avdtp_acceptor_stream_endpoint_state_t  acceptor_config_state;
6198ef7100fSMilanka Ringwald     avdtp_initiator_stream_endpoint_state_t initiator_config_state;
620ba155c22SMilanka Ringwald     a2dp_state_t a2dp_state;
6218ef7100fSMilanka Ringwald     // active connection
6228ef7100fSMilanka Ringwald     avdtp_connection_t * connection;
623b12cd5a6SMilanka Ringwald 
6248ef7100fSMilanka Ringwald     // currently active remote seid
625a0ed80bdSMilanka Ringwald     avdtp_capabilities_t remote_capabilities;
626a0ed80bdSMilanka Ringwald     uint16_t remote_capabilities_bitmap;
627a0ed80bdSMilanka Ringwald 
628a0ed80bdSMilanka Ringwald     uint16_t remote_configuration_bitmap;
629a0ed80bdSMilanka Ringwald     avdtp_capabilities_t remote_configuration;
630ffa6c160SMilanka Ringwald 
631e14261c4SMatthias Ringwald     // temporary codec config used by A2DP Source
6323663964fSMatthias Ringwald     uint8_t set_config_remote_seid;
633ffa6c160SMilanka Ringwald     avdtp_media_codec_type_t media_codec_type;
634ec9b5b0fSMatthias Ringwald     uint8_t media_codec_info[8];
635ffa6c160SMilanka Ringwald 
63679654d96SMilanka Ringwald     // preferred SBC codec settings
6378e7044f9SMatthias Ringwald     uint32_t preferred_sampling_frequency;
63879654d96SMilanka Ringwald     uint8_t  preferred_channel_mode;
6398e7044f9SMatthias Ringwald 
6408ef7100fSMilanka Ringwald     // register request for media L2cap connection release
6418ef7100fSMilanka Ringwald     uint8_t media_disconnect;
6428ef7100fSMilanka Ringwald     uint8_t media_connect;
64360ec20d0SMilanka Ringwald     uint8_t start_stream;
644fa4419dbSMilanka Ringwald     uint8_t close_stream;
645d0676819SMatthias Ringwald     bool  request_can_send_now;
64660ec20d0SMilanka Ringwald     uint8_t abort_stream;
64760ec20d0SMilanka Ringwald     uint8_t suspend_stream;
648f7103c90SMilanka Ringwald     uint16_t sequence_number;
6498ef7100fSMilanka Ringwald } avdtp_stream_endpoint_t;
6508ef7100fSMilanka Ringwald 
6518322fb3aSMatthias Ringwald void avdtp_init(void);
65257fb24ffSMatthias Ringwald void avdtp_deinit(void);
65357fb24ffSMatthias Ringwald 
6543ec98973SMatthias Ringwald avdtp_connection_t * avdtp_get_connection_for_bd_addr(bd_addr_t addr);
65587d9d508SMilanka Ringwald avdtp_connection_t * avdtp_get_connection_for_avdtp_cid(uint16_t avdtp_cid);
6565ace758fSMilanka Ringwald avdtp_connection_t * avdtp_get_connection_for_l2cap_signaling_cid(uint16_t l2cap_cid);
65762c4ec82SMilanka Ringwald btstack_linked_list_t * avdtp_get_connections(void);
65819a000d1SMilanka Ringwald btstack_linked_list_t * avdtp_get_stream_endpoints(void);
659d8e15394SMilanka Ringwald 
660d8e15394SMilanka Ringwald avdtp_stream_endpoint_t * avdtp_get_stream_endpoint_for_seid(uint16_t seid);
661f24f7543SMatthias Ringwald avdtp_stream_endpoint_t * avdtp_get_source_stream_endpoint_for_media_codec(avdtp_media_codec_type_t codec_type);
66284cef9b8SMatthias Ringwald avdtp_stream_endpoint_t * avdtp_get_source_stream_endpoint_for_media_codec_other(uint32_t vendor_id, uint16_t codec_id);
663e121d2c5SMatthias Ringwald avdtp_stream_endpoint_t * avdtp_get_source_stream_endpoint_for_media_codec_and_type(avdtp_media_codec_type_t codec_type, avdtp_sep_type_t sep_type);
664d8e15394SMilanka Ringwald 
66532d799b8SMatthias Ringwald btstack_packet_handler_t avdtp_packet_handler_for_stream_endpoint(const avdtp_stream_endpoint_t *stream_endpoint);
666c69f4ba5SMatthias Ringwald void avdtp_emit_sink_and_source(uint8_t * packet, uint16_t size);
6674b7d40bbSMatthias Ringwald void avdtp_emit_source(uint8_t * packet, uint16_t size);
66832d799b8SMatthias Ringwald 
669747ec646SMilanka Ringwald void avdtp_register_media_transport_category(avdtp_stream_endpoint_t * stream_endpoint);
670747ec646SMilanka Ringwald void avdtp_register_reporting_category(avdtp_stream_endpoint_t * stream_endpoint);
671747ec646SMilanka Ringwald void avdtp_register_delay_reporting_category(avdtp_stream_endpoint_t * stream_endpoint);
672747ec646SMilanka Ringwald void avdtp_register_recovery_category(avdtp_stream_endpoint_t * stream_endpoint, uint8_t maximum_recovery_window_size, uint8_t maximum_number_media_packets);
673747ec646SMilanka Ringwald void avdtp_register_content_protection_category(avdtp_stream_endpoint_t * stream_endpoint, uint16_t cp_type, const uint8_t * cp_type_value, uint8_t cp_type_value_len);
674747ec646SMilanka Ringwald void avdtp_register_header_compression_category(avdtp_stream_endpoint_t * stream_endpoint, uint8_t back_ch, uint8_t media, uint8_t recovery);
6753e6cf581SMatthias Ringwald void avdtp_register_media_codec_category(avdtp_stream_endpoint_t * stream_endpoint, avdtp_media_type_t media_type, avdtp_media_codec_type_t media_codec_type, const uint8_t *media_codec_info, uint16_t media_codec_info_len);
676747ec646SMilanka Ringwald void avdtp_register_multiplexing_category(avdtp_stream_endpoint_t * stream_endpoint, uint8_t fragmentation);
677747ec646SMilanka Ringwald 
678951d2774SMatthias Ringwald // sink only
679951d2774SMatthias Ringwald void avdtp_register_media_handler(void (*callback)(uint8_t local_seid, uint8_t *packet, uint16_t size));
680951d2774SMatthias Ringwald 
681326e3662SMilanka Ringwald void avdtp_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);
682297feb5fSMilanka Ringwald avdtp_stream_endpoint_t * avdtp_create_stream_endpoint(avdtp_sep_type_t sep_type, avdtp_media_type_t media_type);
68317ddf501SMatthias Ringwald void avdtp_finalize_stream_endpoint(avdtp_stream_endpoint_t * stream_endpoint);
684747ec646SMilanka Ringwald 
685a1fb0563SMilanka Ringwald uint8_t avdtp_connect(bd_addr_t remote, avdtp_role_t role, uint16_t * avdtp_cid);
686b401ff59SMilanka Ringwald uint8_t avdtp_disconnect(uint16_t avdtp_cid);
687a1fb0563SMilanka Ringwald void    avdtp_register_sink_packet_handler(btstack_packet_handler_t callback);
688a1fb0563SMilanka Ringwald void    avdtp_register_source_packet_handler(btstack_packet_handler_t callback);
689a1fb0563SMilanka Ringwald 
690297feb5fSMilanka Ringwald uint8_t avdtp_open_stream(uint16_t avdtp_cid, uint8_t local_seid, uint8_t remote_seid);
691297feb5fSMilanka Ringwald uint8_t avdtp_start_stream(uint16_t avdtp_cid, uint8_t local_seid);
692297feb5fSMilanka Ringwald uint8_t avdtp_stop_stream (uint16_t avdtp_cid, uint8_t local_seid);
693297feb5fSMilanka Ringwald uint8_t avdtp_abort_stream(uint16_t avdtp_cid, uint8_t local_seid);
694297feb5fSMilanka Ringwald uint8_t avdtp_suspend_stream(uint16_t avdtp_cid, uint8_t local_seid);
6959e42cfccSMilanka Ringwald 
6965ace758fSMilanka Ringwald uint8_t avdtp_discover_stream_endpoints(uint16_t avdtp_cid);
6975ace758fSMilanka Ringwald uint8_t avdtp_get_capabilities(uint16_t avdtp_cid, uint8_t remote_seid);
698a145558fSMatthias Ringwald uint8_t avdtp_get_all_capabilities(uint16_t avdtp_cid, uint8_t remote_seid, avdtp_role_t role);
6995ace758fSMilanka Ringwald uint8_t avdtp_get_configuration(uint16_t avdtp_cid, uint8_t remote_seid);
700cec76c5bSMilanka Ringwald uint8_t avdtp_set_configuration(uint16_t avdtp_cid, uint8_t local_seid, uint8_t remote_seid, uint16_t configured_services_bitmap, avdtp_capabilities_t configuration);
701cec76c5bSMilanka Ringwald uint8_t avdtp_reconfigure(uint16_t avdtp_cid, uint8_t local_seid, uint8_t remote_seid, uint16_t configured_services_bitmap, avdtp_capabilities_t configuration);
702c70720c6SMatthias Ringwald uint8_t avdtp_validate_media_configuration(const avdtp_stream_endpoint_t *stream_endpoint, uint16_t avdtp_cid,
703c70720c6SMatthias Ringwald                                            uint8_t reconfigure, const adtvp_media_codec_capabilities_t *media_codec);
704747ec646SMilanka Ringwald 
70579654d96SMilanka Ringwald // frequency will be used by avdtp_choose_sbc_sampling_frequency (if supported by both endpoints)
706093c3dfdSMatthias Ringwald void    avdtp_set_preferred_sampling_frequency(avdtp_stream_endpoint_t * stream_endpoint, uint32_t sampling_frequency);
70779654d96SMilanka Ringwald 
7081da18615SMilanka Ringwald // channels_num will be used by avdtp_choose_sbc_channel_mode (if supported by both endpoints)
70979654d96SMilanka Ringwald void    avdtp_set_preferred_channel_mode(avdtp_stream_endpoint_t * stream_endpoint, uint8_t channel_mode);
71079654d96SMilanka Ringwald 
7118e7044f9SMatthias Ringwald void    avdtp_set_preferred_sbc_channel_mode(avdtp_stream_endpoint_t * stream_endpoint, uint32_t sampling_frequency);
7128e7044f9SMatthias Ringwald 
713d44ccd27SMatthias Ringwald /**
714d44ccd27SMatthias Ringwald  * @brief Get highest sampling frequency
715d44ccd27SMatthias Ringwald  * @param sampling_frequency_bitmap
716d44ccd27SMatthias Ringwald  * @return highest frequency or 0
717d44ccd27SMatthias Ringwald  */
718d44ccd27SMatthias Ringwald uint16_t avdtp_get_highest_sampling_frequency(uint8_t sampling_frequency_bitmap);
719d44ccd27SMatthias Ringwald 
72080dc0088SMatthias Ringwald avdtp_channel_mode_t avdtp_choose_sbc_channel_mode(avdtp_stream_endpoint_t * stream_endpoint, uint8_t remote_channel_mode_bitmap);
72180dc0088SMatthias Ringwald avdtp_sbc_allocation_method_t avdtp_choose_sbc_allocation_method(avdtp_stream_endpoint_t * stream_endpoint, uint8_t remote_allocation_method_bitmap);
72280dc0088SMatthias Ringwald uint16_t avdtp_choose_sbc_sampling_frequency(avdtp_stream_endpoint_t * stream_endpoint, uint8_t remote_sampling_frequency_bitmap);
723*48070a6fSMilanka Ringwald avdtp_sbc_subbands_t avdtp_choose_sbc_subbands(avdtp_stream_endpoint_t * stream_endpoint, uint8_t remote_subbands_bitmap);
724*48070a6fSMilanka Ringwald avdtp_sbc_block_length_t avdtp_choose_sbc_block_length(avdtp_stream_endpoint_t * stream_endpoint, uint8_t remote_block_length_bitmap);
72578d08d09SMilanka Ringwald uint8_t avdtp_choose_sbc_max_bitpool_value(avdtp_stream_endpoint_t * stream_endpoint, uint8_t remote_max_bitpool_value);
72678d08d09SMilanka Ringwald uint8_t avdtp_choose_sbc_min_bitpool_value(avdtp_stream_endpoint_t * stream_endpoint, uint8_t remote_min_bitpool_value);
72778d08d09SMilanka Ringwald 
728bd1ecb8aSMilanka Ringwald uint8_t avdtp_stream_endpoint_seid(avdtp_stream_endpoint_t * stream_endpoint);
729692c0605SMilanka Ringwald 
730485c0a4cSMilanka Ringwald uint8_t is_avdtp_remote_seid_registered(avdtp_stream_endpoint_t * stream_endpoint);
731f751daa3SMatthias Ringwald 
732ab2445a0SMatthias Ringwald uint8_t avdtp_get_next_transaction_label(void);
733b1935866SMilanka Ringwald 
73448ce193cSMilanka Ringwald #ifdef ENABLE_AVDTP_ACCEPTOR_EXPLICIT_START_STREAM_CONFIRMATION
73548ce193cSMilanka Ringwald uint8_t avdtp_start_stream_accept(uint16_t avdtp_cid, uint8_t local_seid);
73648ce193cSMilanka Ringwald uint8_t avdtp_start_stream_reject(uint16_t avdtp_cid, uint8_t local_seid);
73748ce193cSMilanka Ringwald #endif
73848ce193cSMilanka Ringwald 
739fc532b33SMatthias Ringwald #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
740fc532b33SMatthias Ringwald void avdtp_init_fuzz(void);
741fc532b33SMatthias Ringwald void avdtp_packet_handler_fuzz(uint8_t *packet, uint16_t size);
742fc532b33SMatthias Ringwald #endif
743fc532b33SMatthias Ringwald 
7448ef7100fSMilanka Ringwald #if defined __cplusplus
7458ef7100fSMilanka Ringwald }
7468ef7100fSMilanka Ringwald #endif
7478ef7100fSMilanka Ringwald 
74880e33422SMatthias Ringwald #endif // AVDTP_H
749