diff options
Diffstat (limited to 'inc/bluetooth/leaudio')
-rw-r--r-- | inc/bluetooth/leaudio/bap.h | 127 | ||||
-rw-r--r-- | inc/bluetooth/leaudio/base_data_parse.h | 53 | ||||
-rw-r--r-- | inc/bluetooth/leaudio/bass_client.h | 80 | ||||
-rw-r--r-- | inc/bluetooth/leaudio/bass_def.h | 154 | ||||
-rw-r--r-- | inc/bluetooth/leaudio/ble_audio.h | 85 | ||||
-rw-r--r-- | inc/bluetooth/leaudio/ble_audio_def.h | 80 | ||||
-rw-r--r-- | inc/bluetooth/leaudio/ble_audio_flags.h | 56 | ||||
-rw-r--r-- | inc/bluetooth/leaudio/ble_audio_group.h | 89 | ||||
-rw-r--r-- | inc/bluetooth/leaudio/ble_audio_sync.h | 126 | ||||
-rw-r--r-- | inc/bluetooth/leaudio/bt_bond_mgr.h | 51 | ||||
-rw-r--r-- | inc/bluetooth/leaudio/bt_gatt_client.h | 192 | ||||
-rw-r--r-- | inc/bluetooth/leaudio/cap.h | 86 | ||||
-rw-r--r-- | inc/bluetooth/leaudio/codec_def.h | 122 | ||||
-rw-r--r-- | inc/bluetooth/leaudio/codec_qos.h | 101 | ||||
-rw-r--r-- | inc/bluetooth/leaudio/csis_def.h | 49 | ||||
-rw-r--r-- | inc/bluetooth/leaudio/csis_rsi.h | 24 | ||||
-rw-r--r-- | inc/bluetooth/leaudio/metadata_def.h | 54 | ||||
-rw-r--r-- | inc/bluetooth/leaudio/pacs_client.h | 102 | ||||
-rw-r--r-- | inc/bluetooth/leaudio/set_coordinator_client.h | 132 |
19 files changed, 1763 insertions, 0 deletions
diff --git a/inc/bluetooth/leaudio/bap.h b/inc/bluetooth/leaudio/bap.h new file mode 100644 index 0000000..5bfe78b --- /dev/null +++ b/inc/bluetooth/leaudio/bap.h @@ -0,0 +1,127 @@ +#ifndef _BAP_H_ +#define _BAP_H_ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "ble_audio_def.h" +#include "pacs_client.h" +#include "codec_qos.h" +//#include "ascs_def.h" + +#define BAP_BROADCAST_SOURCE_ROLE 0x01 +#define BAP_BROADCAST_SINK_ROLE 0x02 +#define BAP_BROADCAST_ASSISTANT_ROLE 0x04 +#define BAP_SCAN_DELEGATOR_ROLE 0x08 +#define BAP_UNICAST_CLT_SRC_ROLE 0x10 +#define BAP_UNICAST_CLT_SNK_ROLE 0x20 +#define BAP_UNICAST_SRV_SRC_ROLE 0x40 +#define BAP_UNICAST_SRV_SNK_ROLE 0x80 + +typedef struct +{ + uint8_t role_mask; + uint8_t brs_num; //use isoc_big_receiver_num + + uint8_t snk_ase_num; + uint8_t src_ase_num; + + bool init_gap; +//for BAP_UNICAST_CLT_SRC_ROLE, BAP_UNICAST_CLT_SNK_ROLE + uint8_t isoc_cig_max_num; + +//for BAP_UNICAST_CLT_SRC_ROLE, BAP_UNICAST_CLT_SNK_ROLE, BAP_UNICAST_SRV_SRC_ROLE, BAP_UNICAST_SRV_SNK_ROLE + uint8_t isoc_cis_max_num; + +//for BAP_BROADCAST_SOURCE_ROLE + uint8_t pa_adv_num; + uint8_t isoc_big_broadcaster_num; + uint8_t isoc_bis_broadcaster_num; + +//for BAP_BROADCAST_SINK_ROLE and BAP_BROADCAST_ASSISTANT_ROLE + uint8_t pa_sync_num; + uint8_t isoc_big_receiver_num; + uint8_t isoc_bis_receiver_num; +} T_BAP_ROLE_INFO; + +#if LE_AUDIO_PACS_CLIENT_SUPPORT +#define PACS_AUDIO_AVAILABLE_CONTEXTS_EXIST 0x01 +#define PACS_AUDIO_SUPPORTED_CONTEXTS_EXIST 0x02 +#define PACS_SINK_AUDIO_LOC_EXIST 0x04 +#define PACS_SINK_PAC_EXIST 0x08 +#define PACS_SOURCE_AUDIO_LOC_EXIST 0x10 +#define PACS_SOURCE_PAC_EXIST 0x20 + +typedef struct +{ + uint16_t value_exist; + uint8_t sink_pac_num; + uint8_t source_pac_num; + uint32_t snk_audio_loc; + uint32_t src_audio_loc; + uint16_t snk_sup_context; + uint16_t src_sup_context; + uint16_t snk_avail_context; + uint16_t src_avail_context; +} T_BAP_PACS_INFO; + +typedef struct +{ + uint8_t codec_id[CODEC_ID_LEN]; + uint16_t handle; + uint16_t pref_audio_contexts; + T_CODEC_CAP codec_cap; + uint32_t lc3_sup_cfg_bits; +} T_BAP_PAC_RECORD; + +//LE_AUDIO_MSG_BAP_PACS_DIS_DONE +typedef struct +{ + uint16_t conn_handle; + bool is_found; + uint8_t sink_pac_num; + uint8_t source_pac_num; +} T_BAP_PACS_DIS_DONE; + +//LE_AUDIO_MSG_BAP_PAC_NOTIFY +typedef struct +{ + uint16_t conn_handle; + uint16_t handle; +} T_BAP_PAC_NOTIFY; + +bool bap_pacs_get_info(uint16_t conn_handle, T_BAP_PACS_INFO *p_pacs_info); +bool bap_pacs_get_pac_record(uint16_t conn_handle, T_AUDIO_DIRECTION direction, uint8_t *p_pac_num, + T_BAP_PAC_RECORD *p_pac_tbl); +bool bap_pacs_get_pac_record_by_handle(uint16_t conn_handle, uint16_t handle, uint8_t *p_pac_num, + T_BAP_PAC_RECORD *p_pac_tbl); +uint32_t bap_pacs_get_lc3_snk_table_msk(uint16_t conn_handle, uint16_t prefer_context, + uint8_t chl_cnt, + uint8_t block_num); +uint32_t bap_pacs_get_lc3_src_table_msk(uint16_t conn_handle, uint16_t prefer_context, + uint8_t chl_cnt, + uint8_t block_num); +#endif + +#if LE_AUDIO_ASCS_CLIENT_SUPPORT +#define ASE_ID_MAX_NUM 8 +//LE_AUDIO_MSG_BAP_ASCS_DIS_DONE +typedef struct +{ + uint16_t conn_handle; + bool is_found; + uint8_t sink_ase_num; + uint8_t sink_ase_id[ASE_ID_MAX_NUM]; + uint8_t source_ase_num; + uint8_t source_ase_id[ASE_ID_MAX_NUM]; +} T_BAP_ASCS_DIS_DONE; +#endif + +bool bap_role_init(T_BAP_ROLE_INFO *p_role_info); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/inc/bluetooth/leaudio/base_data_parse.h b/inc/bluetooth/leaudio/base_data_parse.h new file mode 100644 index 0000000..2d1842c --- /dev/null +++ b/inc/bluetooth/leaudio/base_data_parse.h @@ -0,0 +1,53 @@ +#ifndef _BASE_DATA_PARSE_H_ +#define _BASE_DATA_PARSE_H_ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include <stdint.h> +#include "codec_def.h" + +#if LE_AUDIO_BASE_DATA_PARSE + +typedef struct +{ + uint8_t subgroup_idx; + uint8_t bis_index; + uint8_t codec_id[CODEC_ID_LEN]; + T_CODEC_CFG bis_codec_cfg; +} T_BASE_DATA_BIS_PARAM; + +typedef struct +{ + uint8_t subgroup_idx; + uint8_t num_bis; + uint8_t metadata_len; + uint32_t bis_array; + uint8_t *p_metadata; + T_BASE_DATA_BIS_PARAM *p_bis_param; +} T_BASE_DATA_SUBGROUP_PARAM; + +typedef struct +{ + uint8_t num_bis; + uint8_t num_subgroups; + uint32_t presentation_delay; + //Level2 param + T_BASE_DATA_SUBGROUP_PARAM *p_subgroup; +} T_BASE_DATA_MAPPING; + +void base_data_print(T_BASE_DATA_MAPPING *p_mapping); +T_BASE_DATA_MAPPING *base_data_parse_data(uint16_t pa_data_len, uint8_t *p_pa_data); +bool base_data_cmp(T_BASE_DATA_MAPPING *p_mapping_a, T_BASE_DATA_MAPPING *p_mapping_b); +bool base_data_get_bis_codec_cfg(T_BASE_DATA_MAPPING *p_mapping, uint8_t bis_idx, + T_CODEC_CFG *p_cfg); +void base_data_free(T_BASE_DATA_MAPPING *p_mapping); + +#endif + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/inc/bluetooth/leaudio/bass_client.h b/inc/bluetooth/leaudio/bass_client.h new file mode 100644 index 0000000..4a7c397 --- /dev/null +++ b/inc/bluetooth/leaudio/bass_client.h @@ -0,0 +1,80 @@ +#ifndef _BASS_CLIENT_H_ +#define _BASS_CLIENT_H_ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "bass_def.h" +#include "ble_audio_sync.h" +//#include "broadcast_source_sm.h" + +#if LE_AUDIO_BASS_CLIENT_SUPPORT +//LE_AUDIO_MSG_BASS_CLIENT_DIS_DONE +typedef struct +{ + uint16_t conn_handle; + bool is_found; + bool load_form_ftl; + uint8_t brs_char_num; +} T_BASS_CLIENT_DIS_DONE; + +//LE_AUDIO_MSG_BASS_CLIENT_BRS_DATA +typedef struct +{ + uint16_t conn_handle; + bool notify; + uint16_t read_cause; + uint8_t instance_id; + T_BASS_BRS_DATA *p_brs_data; +} T_BASS_CLIENT_BRS_DATA; + +//LE_AUDIO_MSG_BASS_CLIENT_SYNC_INFO_REQ +typedef struct +{ + uint16_t conn_handle; + uint8_t instance_id; + T_BASS_BRS_DATA *p_brs_data; +} T_BASS_CLIENT_SYNC_INFO_REQ; + +//LE_AUDIO_MSG_BASS_CLIENT_CP_RESULT +typedef struct +{ + uint16_t conn_handle; + uint16_t cause; +} T_BASS_CLIENT_CP_RESULT; + +//LE_AUDIO_MSG_BASS_CLIENT_CCCD +typedef struct +{ + uint16_t conn_handle; + uint16_t cause; +} T_BASS_CLIENT_CCCD; + +bool bass_enable_cccd(uint16_t conn_handle); +bool bass_read_brs_value(uint16_t conn_handle, uint8_t instance_id); + +bool bass_cp_remote_scan_stop(uint16_t conn_handle, bool is_req); +bool bass_cp_remote_scan_start(uint16_t conn_handle, bool is_req); +bool bass_cp_add_source(uint16_t conn_handle, T_BASS_CP_ADD_SOURCE *p_cp_data, bool is_req); +bool bass_cp_modify_source(uint16_t conn_handle, T_BASS_CP_MODIFY_SOURCE *p_cp_data, bool is_req); +bool bass_cp_set_broadcast_code(uint16_t conn_handle, T_BASS_CP_SET_BROADCAST_CODE *p_cp_data, + bool is_req); +bool bass_cp_remove_source(uint16_t conn_handle, T_BASS_CP_REMOVE_SOURCE *p_cp_data, bool is_req); +T_BASS_BRS_DATA *bass_get_brs_data(uint16_t conn_handle, uint8_t instance_id); + +bool bass_cp_add_source_by_sync_info(T_BLE_AUDIO_SYNC_HANDLE handle, uint16_t conn_handle, + T_BASS_PA_SYNC pa_sync, uint32_t bis_array, bool is_req); +bool bass_cp_modify_source_by_sync_info(T_BLE_AUDIO_SYNC_HANDLE handle, uint16_t conn_handle, + uint8_t source_id, + T_BASS_PA_SYNC pa_sync, uint32_t bis_array, bool is_req); + +bool bass_transfer_syncinfo_of_remote_src(T_BLE_AUDIO_SYNC_HANDLE handle, uint16_t conn_handle, + T_BASS_PAST_SRV_DATA srv_data); + +#endif +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/inc/bluetooth/leaudio/bass_def.h b/inc/bluetooth/leaudio/bass_def.h new file mode 100644 index 0000000..047ba88 --- /dev/null +++ b/inc/bluetooth/leaudio/bass_def.h @@ -0,0 +1,154 @@ +#ifndef _BASS_DEF_H_ +#define _BASS_DEF_H_ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "gap.h" +#include "metadata_def.h" +#include "ble_audio_def.h" + +#define ATT_ERR_BASS_OPCODE_NOT_SUPPORT 0x80 +#define ATT_ERR_BASS_INVALID_SRC_ID 0x81 + +#define BASS_FAILED_TO_SYNC_TO_BIG 0xFFFFFFFF +#define BASS_CP_BIS_SYNC_NO_PREFER 0xFFFFFFFF +#define BASS_PA_INTERVAL_UNKNOWN 0xFFFF + +#define BASS_BRS_DATA_MIN_LEN 15 +// BASS CP minimum possible total length +#define BASS_CP_OP_MIN_LEN 1 +#define BASS_CP_OP_REMOTE_SCAN_STOP_LEN 1 +#define BASS_CP_OP_REMOTE_SCAN_START_LEN 1 +#define BASS_CP_OP_ADD_SOURCE_MIN_LEN 16 +#define BASS_CP_OP_MODIFY_SOURCE_MIN_LEN 6 +#define BASS_CP_OP_SET_BROADCAST_CODE_LEN 18 +#define BASS_CP_OP_REMOVE_SOURCE_LEN 2 + +#define BASS_BRA_INC_BST_CODE_LEN 31 + +#define BASS_BRS_CHAR_MAX_NUM 4 +#define GATT_UUID_BASS 0x184F +#define BASS_UUID_CHAR_BROADCAST_AUDIO_SCAN_CP 0x2BC7 +#define BASS_UUID_CHAR_BROADCAST_RECEIVE_STATE 0x2BC8 + +typedef enum +{ + PA_SYNC_STATE_NOT_SYNC = 0x00, + PA_SYNC_STATE_SYNCINFO_REQ = 0x01, + PA_SYNC_STATE_SYNC = 0x02, + PA_SYNC_STATE_FAILED = 0x03, + PA_SYNC_STATE_NO_PAST = 0x04, +} T_PA_SYNC_STATE; + +typedef enum +{ + BIG_NOT_ENCRYPTED = 0x00, + BIG_BROADCAST_CODE_REQUIRED = 0x01, + BIG_DECRYPTING = 0x02, + BIG_BAD_CODE = 0x03, +} T_BIG_ENCRYPTION_STATE; + +typedef enum +{ + BASS_CP_OP_REMOTE_SCAN_STOP = 0x00, + BASS_CP_OP_REMOTE_SCAN_START = 0x01, + BASS_CP_OP_ADD_SOURCE = 0x02, + BASS_CP_OP_MODIFY_SOURCE = 0x03, + BASS_CP_OP_SET_BROADCAST_CODE = 0x04, + BASS_CP_OP_REMOVE_SOURCE = 0x05, +} T_BASS_CP_OP; + +typedef enum +{ + BASS_PA_NOT_SYNC = 0x00, + BASS_PA_SYNC_PAST = 0x01, + BASS_PA_SYNC_NO_PAST = 0x02, +} T_BASS_PA_SYNC; + +typedef struct +{ + uint8_t adv_a_match_ext_adv; //AdvA in PAST matches AdvA in ADB_EXT_IND, 0b0=Yes, 0b1=No/Do't know + uint8_t adv_a_match_src;//AdvA in PAST matches Source_Address, 0b0=Yes, 0b1=No/Do't know + uint8_t source_id; +} T_BASS_PAST_SRV_DATA; + +typedef struct +{ + uint32_t bis_sync; + uint8_t metadata_len; + uint8_t *p_metadata; +} T_BASS_CP_BIS_INFO; + +typedef struct +{ + bool brs_is_used; + //Broadcast Receive State Field + uint8_t source_id; + uint8_t source_address_type; + uint8_t source_address[GAP_BD_ADDR_LEN]; + uint8_t source_adv_sid; + uint8_t broadcast_id[BROADCAST_ID_LEN]; + T_PA_SYNC_STATE pa_sync_state; + uint32_t bis_sync_state; + T_BIG_ENCRYPTION_STATE big_encryption; + uint8_t bad_code[BROADCAST_CODE_LEN]; + uint8_t num_subgroups; + uint16_t bis_info_size; + T_BASS_CP_BIS_INFO *p_cp_bis_info; +} T_BASS_BRS_DATA; + +typedef struct +{ + uint8_t advertiser_address_type; + uint8_t advertiser_address[GAP_BD_ADDR_LEN]; + uint8_t advertiser_sid; + uint8_t broadcast_id[BROADCAST_ID_LEN]; + T_BASS_PA_SYNC pa_sync; + uint16_t pa_interval; + uint8_t num_subgroups; + uint16_t bis_info_size; + T_BASS_CP_BIS_INFO *p_cp_bis_info; +} T_BASS_CP_ADD_SOURCE; + +typedef struct +{ + uint8_t source_id; + T_BASS_PA_SYNC pa_sync; + uint16_t pa_interval; + uint8_t num_subgroups; + uint16_t bis_info_size; + T_BASS_CP_BIS_INFO *p_cp_bis_info; +} T_BASS_CP_MODIFY_SOURCE; + +typedef struct +{ + uint8_t source_id; + uint8_t broadcast_code[BROADCAST_CODE_LEN]; +} T_BASS_CP_SET_BROADCAST_CODE; + +typedef struct +{ + uint8_t source_id; +} T_BASS_CP_REMOVE_SOURCE; + +typedef union +{ + T_BASS_CP_ADD_SOURCE add_source; + T_BASS_CP_MODIFY_SOURCE modify_source; + T_BASS_CP_SET_BROADCAST_CODE set_broadcast_code; + T_BASS_CP_REMOVE_SOURCE remove_source; +} T_BASS_CP_PARAM; + +typedef struct +{ + T_BASS_CP_OP opcode; + T_BASS_CP_PARAM param; +} T_BASS_CP_DATA; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/inc/bluetooth/leaudio/ble_audio.h b/inc/bluetooth/leaudio/ble_audio.h new file mode 100644 index 0000000..9ac02d3 --- /dev/null +++ b/inc/bluetooth/leaudio/ble_audio.h @@ -0,0 +1,85 @@ +#ifndef _BLE_AUDIO_H_ +#define _BLE_AUDIO_H_ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "gap_msg.h" +#include "gap.h" +#include "app_msg.h" +//#include "profile_server_def.h" + +typedef enum +{ + LE_AUDIO_MSG_GROUP_BASS = 0x0000, + LE_AUDIO_MSG_GROUP_BASS_CLIENT = 0x0100, + LE_AUDIO_MSG_GROUP_PACS = 0x0200, + LE_AUDIO_MSG_GROUP_PACS_CLIENT = 0x0300, + LE_AUDIO_MSG_GROUP_CSIS = 0x0400, + LE_AUDIO_MSG_GROUP_CSIS_CLIENT = 0x0500, + + LE_AUDIO_MSG_GROUP_CAP = 0x2000, + LE_AUDIO_MSG_GROUP_BAP = 0x2100, +} T_LE_AUDIO_MSG_GROUP; + +typedef enum +{ + //bass_client.h + LE_AUDIO_MSG_BASS_CLIENT_DIS_DONE = LE_AUDIO_MSG_GROUP_BASS_CLIENT | 0x00, + LE_AUDIO_MSG_BASS_CLIENT_CCCD = LE_AUDIO_MSG_GROUP_BASS_CLIENT | 0x01, + LE_AUDIO_MSG_BASS_CLIENT_CP_RESULT = LE_AUDIO_MSG_GROUP_BASS_CLIENT | 0x02, + LE_AUDIO_MSG_BASS_CLIENT_BRS_DATA = LE_AUDIO_MSG_GROUP_BASS_CLIENT | 0x03, + LE_AUDIO_MSG_BASS_CLIENT_SYNC_INFO_REQ = LE_AUDIO_MSG_GROUP_BASS_CLIENT | 0x04, + + //pacs_client.h + LE_AUDIO_MSG_PACS_CLIENT_DIS_DONE = LE_AUDIO_MSG_GROUP_PACS_CLIENT | 0x00, + LE_AUDIO_MSG_PACS_CLIENT_CCCD = LE_AUDIO_MSG_GROUP_PACS_CLIENT | 0x01, + LE_AUDIO_MSG_PACS_CLIENT_WRITE_SINK_LOC_RESULT = LE_AUDIO_MSG_GROUP_PACS_CLIENT | 0x02, + LE_AUDIO_MSG_PACS_CLIENT_WRITE_SOURCE_LOC_RESULT = LE_AUDIO_MSG_GROUP_PACS_CLIENT | 0x03, + LE_AUDIO_MSG_PACS_CLIENT_READ_RESULT = LE_AUDIO_MSG_GROUP_PACS_CLIENT | 0x04, + LE_AUDIO_MSG_PACS_CLIENT_NOTIFY = LE_AUDIO_MSG_GROUP_PACS_CLIENT | 0x05, + + //csis_client.h + LE_AUDIO_MSG_CSIS_CLIENT_DIS_DONE = LE_AUDIO_MSG_GROUP_CSIS_CLIENT | 0x00, + LE_AUDIO_MSG_CSIS_CLIENT_SEARCH_TIMEOUT = LE_AUDIO_MSG_GROUP_CSIS_CLIENT | 0x01, + LE_AUDIO_MSG_CSIS_CLIENT_SEARCH_DONE = LE_AUDIO_MSG_GROUP_CSIS_CLIENT | 0x02, + LE_AUDIO_MSG_CSIS_CLIENT_SET_MEM_FOUND = LE_AUDIO_MSG_GROUP_CSIS_CLIENT | 0x04, + LE_AUDIO_MSG_CSIS_CLIENT_COOR_SET_DEL = LE_AUDIO_MSG_GROUP_CSIS_CLIENT | 0x05, + LE_AUDIO_MSG_CSIS_CLIENT_LOCK_REQ_DONE = LE_AUDIO_MSG_GROUP_CSIS_CLIENT | 0x06, + LE_AUDIO_MSG_CSIS_CLIENT_UNLOCK_REQ_DONE = LE_AUDIO_MSG_GROUP_CSIS_CLIENT | 0x07, + LE_AUDIO_MSG_CSIS_CLIENT_LOCK_STATE_CHANGE = LE_AUDIO_MSG_GROUP_CSIS_CLIENT | 0x08, + LE_AUDIO_MSG_CSIS_CLIENT_READ_RESULT = LE_AUDIO_MSG_GROUP_CSIS_CLIENT | 0x09, + LE_AUDIO_MSG_CSIS_CLIENT_SIRK_CHANGE = LE_AUDIO_MSG_GROUP_CSIS_CLIENT | 0x0a, + + //bap.h + LE_AUDIO_MSG_BAP_PACS_DIS_DONE = LE_AUDIO_MSG_GROUP_BAP | 0x00, + LE_AUDIO_MSG_BAP_PAC_NOTIFY = LE_AUDIO_MSG_GROUP_BAP | 0x01, + LE_AUDIO_MSG_BAP_ASCS_DIS_DONE = LE_AUDIO_MSG_GROUP_BAP | 0x02, + + //cap.h + LE_AUDIO_MSG_CAP_DIS_DONE = LE_AUDIO_MSG_GROUP_CAP | 0x00, +} T_LE_AUDIO_MSG; + +typedef T_APP_RESULT(*P_FUN_BLE_AUDIO_CB)(T_LE_AUDIO_MSG msg, void *buf); + +typedef struct +{ + P_FUN_BLE_AUDIO_CB p_fun_cb; + void *evt_queue_handle; + void *io_queue_handle; +} T_BLE_AUDIO_PARAMS; + +bool ble_audio_init(T_BLE_AUDIO_PARAMS *p_param); +bool ble_audio_check_remote_features(uint16_t conn_handle, uint8_t array_index, + uint8_t feature_mask); + +void ble_audio_handle_msg(T_IO_MSG *p_io_msg); +void ble_audio_handle_gap_msg(uint16_t subtype, T_LE_GAP_MSG gap_msg); +void ble_audio_handle_gap_cb(uint8_t cb_type, void *p_cb_data); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/inc/bluetooth/leaudio/ble_audio_def.h b/inc/bluetooth/leaudio/ble_audio_def.h new file mode 100644 index 0000000..609acbf --- /dev/null +++ b/inc/bluetooth/leaudio/ble_audio_def.h @@ -0,0 +1,80 @@ +#ifndef _BLE_AUDIO_DEF_H_ +#define _BLE_AUDIO_DEF_H_ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include <stdint.h> +#include <stdbool.h> + +#define BROADCAST_ID_LEN 3 +#define BROADCAST_CODE_LEN 16 + +#define BROADCAST_AUDIO_ANNOUNCEMENT_SRV_UUID 0x1852 +#define BASIC_AUDIO_ANNOUNCEMENT_SRV_UUID 0x1851 + +#define AUDIO_DEFAULT_PRESENTATION_DELAY 40000 + +#define ADV_TARGETED_ANNOUNCEMENT 0x01 +#define ADV_GENERAL_ANNOUNCEMENT 0x00 + +#define AUDIO_LOCATION_MONO 0x00000000 +#define AUDIO_LOCATION_FL 0x00000001 +#define AUDIO_LOCATION_FR 0x00000002 +#define AUDIO_LOCATION_FC 0x00000004 +#define AUDIO_LOCATION_LFE1 0x00000008 +#define AUDIO_LOCATION_BL 0x00000010 +#define AUDIO_LOCATION_BR 0x00000020 +#define AUDIO_LOCATION_FLC 0x00000040 +#define AUDIO_LOCATION_FRC 0x00000080 +#define AUDIO_LOCATION_BC 0x00000100 +#define AUDIO_LOCATION_LFE2 0x00000200 +#define AUDIO_LOCATION_SIL 0x00000400 +#define AUDIO_LOCATION_SIR 0x00000800 +#define AUDIO_LOCATION_TPFL 0x00001000 +#define AUDIO_LOCATION_TPFR 0x00002000 +#define AUDIO_LOCATION_TPFC 0x00004000 +#define AUDIO_LOCATION_TPC 0x00008000 +#define AUDIO_LOCATION_TPBL 0x00010000 +#define AUDIO_LOCATION_TPBR 0x00020000 +#define AUDIO_LOCATION_TPSIL 0x00040000 +#define AUDIO_LOCATION_TPSIR 0x00080000 +#define AUDIO_LOCATION_TPBC 0x00100000 +#define AUDIO_LOCATION_BTFC 0x00200000 +#define AUDIO_LOCATION_BTFL 0x00400000 +#define AUDIO_LOCATION_BTFR 0x00800000 +#define AUDIO_LOCATION_FLW 0x01000000 +#define AUDIO_LOCATION_FRW 0x02000000 +#define AUDIO_LOCATION_LS 0x04000000 +#define AUDIO_LOCATION_RS 0x08000000 +#define AUDIO_LOCATION_RFU 0xF0000000 +#define AUDIO_LOCATION_MASK 0x0FFFFFFF + +typedef enum +{ + AUDIO_UNFRAMED = 0x00, + AUDIO_FRAMED = 0x01, +} T_AUDIO_FRAMING; + +typedef enum +{ + SERVER_AUDIO_SINK = 0x01, + SERVER_AUDIO_SOURCE = 0x02, +} T_AUDIO_DIRECTION; + +typedef enum +{ + UNSPEC_AUDIO_INPUT = 0x00, + BLUETOOTH_AUDIO_INPUT = 0x01, + MICROPHONE_AUDIO_INPUT = 0x02, + ANLOG_AUDIO_INPUT = 0x03, + DIGITAL_AUDIO_INPUT = 0x04, + RADIO_AUDIO_INPUT = 0x05, + STREAMING_AUDIO_INPUT = 0x06, +} T_AUDIO_INPUT_TYPE; +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/inc/bluetooth/leaudio/ble_audio_flags.h b/inc/bluetooth/leaudio/ble_audio_flags.h new file mode 100644 index 0000000..9e419e2 --- /dev/null +++ b/inc/bluetooth/leaudio/ble_audio_flags.h @@ -0,0 +1,56 @@ +#ifndef _BLE_AUDIO_FLAGS_H_ +#define _BLE_AUDIO_FLAGS_H_ + +#define LE_AUDIO_DEBUG 1 + +#define MAX_BLE_LINK_NUM 2 +#define MAX_BLE_SRV_NUM 16 + +#define LE_AUDIO_PACS_SUPPORT 0 +#define LE_AUDIO_ASCS_SUPPORT 0 +#define LE_AUDIO_BASS_SUPPORT 0 + +#define LE_AUDIO_VCS_SUPPORT 0 +#define LE_AUDIO_VOCS_SUPPORT 0 +#define LE_AUDIO_AICS_SUPPORT 0 +#define LE_AUDIO_AICS_NUM 0 +#define LE_AUDIO_MICS_SUPPORT 0 + +#define LE_AUDIO_CSIS_SUPPORT 0 +#define LE_AUDIO_CAS_SUPPORT 0 + +#define LE_AUDIO_TBS_SUPPORT 0 +#define LE_AUDIO_TMAS_SUPPORT 0 +#define LE_AUDIO_HAS_SUPPORT 0 + +#define LE_AUDIO_MCS_SERV_SUPPORT 0 +#define LE_AUDIO_OTS_SERV_SUPPORT 0 + +#define LE_AUDIO_CAP_SUPPORT 0 +#define LE_AUDIO_BAP_SUPPORT 1 + +#define LE_AUDIO_PACS_CLIENT_SUPPORT 1 +#define LE_AUDIO_ASCS_CLIENT_SUPPORT 0 +#define LE_AUDIO_BASS_CLIENT_SUPPORT 1 +#define LE_AUDIO_MCS_CLIENT_SUPPORT 0 +#define LE_AUDIO_OTS_CLIENT_SUPPORT 0 + +#define LE_AUDIO_VCS_CLIENT_SUPPORT 0 +#define LE_AUDIO_VOCS_CLIENT_SUPPORT 0 +#define LE_AUDIO_AICS_CLIENT_SUPPORT 0 +#define LE_AUDIO_MICS_CLIENT_SUPPORT 0 + +#define LE_AUDIO_CSIS_CLIENT_SUPPORT 0 +#define LE_AUDIO_TBS_CLIENT_SUPPORT 0 +#define LE_AUDIO_TMAP_CLIENT_SUPPORT 0 +#define LE_AUDIO_HAS_CLIENT_SUPPORT 0 + +#define LE_AUDIO_BROADCAST_SOURCE_ROLE 0 +#define LE_AUDIO_BROADCAST_SINK_ROLE 0 +#define LE_AUDIO_SCAN_DELEGATOR_ROLE 0 +#define LE_AUDIO_BROADCAST_ASSISTANT_ROLE 1 + +#define LE_AUDIO_BASE_DATA_GENERATE (LE_AUDIO_BROADCAST_SOURCE_ROLE) +#define LE_AUDIO_BASE_DATA_PARSE (LE_AUDIO_BROADCAST_SINK_ROLE || LE_AUDIO_BROADCAST_ASSISTANT_ROLE) + +#endif diff --git a/inc/bluetooth/leaudio/ble_audio_group.h b/inc/bluetooth/leaudio/ble_audio_group.h new file mode 100644 index 0000000..67c0125 --- /dev/null +++ b/inc/bluetooth/leaudio/ble_audio_group.h @@ -0,0 +1,89 @@ +#ifndef _BLE_AUDIO_GROUP_H_ +#define _BLE_AUDIO_GROUP_H_ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "gap.h" +#include "gap_msg.h" + +typedef void *T_BLE_AUDIO_GROUP_HANDLE; +typedef void *T_BLE_AUDIO_DEV_HANDLE; + +typedef enum +{ + AUDIO_GROUP_MSG_BAP_STATE = 0x01, + AUDIO_GROUP_MSG_BAP_SESSION_REMOVE = 0x02, + AUDIO_GROUP_MSG_BAP_START_QOS_CFG = 0x04, + AUDIO_GROUP_MSG_BAP_CREATE_CIS = 0x05, + AUDIO_GROUP_MSG_BAP_START_METADATA_CFG = 0x06, + AUDIO_GROUP_MSG_BAP_SETUP_DATA_PATH = 0x07, + AUDIO_GROUP_MSG_BAP_REMOVE_DATA_PATH = 0x08, + AUDIO_GROUP_MSG_BAP_METADATA_UPDATE = 0x09, + AUDIO_GROUP_MSG_BAP_CIS_DISCONN = 0x0A, + + AUDIO_GROUP_MSG_DEV_CONN = 0x20, + AUDIO_GROUP_MSG_DEV_DISCONN = 0x21, +} T_AUDIO_GROUP_MSG; + +//AUDIO_GROUP_MSG_DEV_CONN +typedef struct +{ + T_BLE_AUDIO_DEV_HANDLE dev_handle; +} T_AUDIO_GROUP_MSG_DEV_CONN; + +//AUDIO_GROUP_MSG_DEV_DISCONN +typedef struct +{ + T_BLE_AUDIO_DEV_HANDLE dev_handle; + uint16_t cause; +} T_AUDIO_GROUP_MSG_DEV_DISCONN; + +#if 0 +typedef enum +{ + AUDIO_GROUP_RESULT_SUCCESS, + AUDIO_GROUP_RESULT_FAILED, + AUDIO_GROUP_RESULT_TIMEOUT_FAILED, + AUDIO_GROUP_RESULT_TIMEOUT_PARTIAL_SUCCESS, +} T_AUDIO_GROUP_RESULT; +#endif + +typedef struct +{ + bool is_used; + T_BLE_AUDIO_DEV_HANDLE dev_handle; + T_GAP_CONN_STATE conn_state; + T_GAP_REMOTE_ADDR_TYPE addr_type; + uint8_t bd_addr[6]; +} T_AUDIO_DEV_INFO; + +typedef T_APP_RESULT(*P_FUN_AUDIO_GROUP_CB)(T_AUDIO_GROUP_MSG msg, T_BLE_AUDIO_GROUP_HANDLE handle, + void *buf); + +T_BLE_AUDIO_GROUP_HANDLE ble_audio_group_allocate(void); +bool ble_audio_group_reg_cb(T_BLE_AUDIO_GROUP_HANDLE group_handle, P_FUN_AUDIO_GROUP_CB p_fun_cb); +bool ble_audio_group_release(T_BLE_AUDIO_GROUP_HANDLE group_handle); +T_BLE_AUDIO_DEV_HANDLE ble_audio_group_add_dev(T_BLE_AUDIO_GROUP_HANDLE group_handle, + uint8_t *p_bd_addr, uint8_t addr_type); +bool ble_audio_group_remove_dev(T_BLE_AUDIO_GROUP_HANDLE group_handle, + T_BLE_AUDIO_DEV_HANDLE dev_handle); +T_BLE_AUDIO_DEV_HANDLE ble_audio_group_find_dev(T_BLE_AUDIO_GROUP_HANDLE group_handle, + uint8_t *bd_addr, uint8_t addr_type); +T_BLE_AUDIO_DEV_HANDLE ble_audio_group_find_dev_by_conn_handle(T_BLE_AUDIO_GROUP_HANDLE + group_handle, + uint16_t conn_handle); +bool ble_audio_group_get_dev_info(T_BLE_AUDIO_GROUP_HANDLE group_handle, + T_BLE_AUDIO_DEV_HANDLE dev_handle, + T_AUDIO_DEV_INFO *p_info); +uint8_t ble_audio_group_get_used_dev_num(T_BLE_AUDIO_GROUP_HANDLE group_handle); +uint8_t ble_audio_group_get_dev_num(T_BLE_AUDIO_GROUP_HANDLE group_handle); +bool ble_audio_group_get_info(T_BLE_AUDIO_GROUP_HANDLE group_handle, uint8_t *p_dev_num, + T_AUDIO_DEV_INFO *p_dev_tbl); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/inc/bluetooth/leaudio/ble_audio_sync.h b/inc/bluetooth/leaudio/ble_audio_sync.h new file mode 100644 index 0000000..e9b9bd3 --- /dev/null +++ b/inc/bluetooth/leaudio/ble_audio_sync.h @@ -0,0 +1,126 @@ +#ifndef _BLE_AUDIO_SYNC_H_ +#define _BLE_AUDIO_SYNC_H_ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#if (LE_AUDIO_BROADCAST_SINK_ROLE | LE_AUDIO_BROADCAST_ASSISTANT_ROLE) +#include "gap.h" +#include "gap_pa_sync.h" +#include "gap_past_recipient.h" +#include "ble_audio_def.h" +#include "base_data_parse.h" + +typedef void *T_BLE_AUDIO_SYNC_HANDLE; + +#define MSG_BLE_AUDIO_PA_SYNC_STATE 0x01 +#define MSG_BLE_AUDIO_PA_REPORT_INFO 0x02 +#define MSG_BLE_AUDIO_BASE_DATA_MODIFY_INFO 0x03 +#define MSG_BLE_AUDIO_PA_BIGINFO 0x04 + +#define MSG_BLE_AUDIO_SYNC_HANDLE_RELEASED 0x20 +#define MSG_BLE_AUDIO_ADDR_UPDATE 0x21 + +typedef enum +{ + BLE_AUDIO_ACTION_ROLE_IDLE = 0x00, + BLE_AUDIO_ACTION_ROLE_LOCAL_API = 0x01, +#if LE_AUDIO_BASS_SUPPORT + BLE_AUDIO_ACTION_ROLE_BASS = 0x02, +#endif +} T_BLE_AUDIO_ACTION_ROLE; + +typedef struct +{ + T_BASE_DATA_MAPPING *p_base_mapping; +} T_BLE_AUDIO_BASE_DATA_MODIFY_INFO; + +typedef enum +{ + BLE_AUDIO_PA_IDLE = 0x00, + BLE_AUDIO_PA_SYNC = 0x01, + BLE_AUDIO_PA_TERMINATE = 0x02, + BLE_AUDIO_PA_LOST = 0x03, +} T_BLE_AUDIO_PA_ACTION; + +typedef struct +{ + T_GAP_PA_SYNC_STATE sync_state; + T_BLE_AUDIO_PA_ACTION action; + T_BLE_AUDIO_ACTION_ROLE action_role; + uint16_t cause; +} T_BLE_AUDIO_PA_SYNC_STATE; + +typedef struct +{ + T_BLE_AUDIO_ACTION_ROLE action_role; +} T_BLE_AUDIO_SYNC_HANDLE_RELEASED; + +typedef struct +{ + uint8_t *advertiser_address; +} T_BLE_AUDIO_ADDR_UPDATE; + +typedef union +{ + T_BLE_AUDIO_PA_SYNC_STATE *p_pa_sync_state; + T_LE_PERIODIC_ADV_REPORT_INFO *p_le_periodic_adv_report_info; + T_BLE_AUDIO_BASE_DATA_MODIFY_INFO *p_base_data_modify_info; + + T_LE_BIGINFO_ADV_REPORT_INFO *p_le_biginfo_adv_report_info; + + T_BLE_AUDIO_SYNC_HANDLE_RELEASED *p_sync_handle_released; + T_BLE_AUDIO_ADDR_UPDATE *p_addr_update; +} T_BLE_AUDIO_SYNC_CB_DATA; + +typedef struct +{ + uint8_t advertiser_address_type; + uint8_t advertiser_address[GAP_BD_ADDR_LEN]; + uint8_t adv_sid; + uint8_t broadcast_id[BROADCAST_ID_LEN]; + //PA info + uint8_t sync_id; + T_GAP_PA_SYNC_STATE pa_state; + uint16_t pa_interval; + T_BASE_DATA_MAPPING *p_base_mapping; + bool big_info_received; + T_LE_BIGINFO_ADV_REPORT_INFO big_info; +} T_BLE_AUDIO_SYNC_INFO; + +typedef void(*P_FUN_BLE_AUDIO_SYNC_CB)(T_BLE_AUDIO_SYNC_HANDLE handle, uint8_t cb_type, + void *p_cb_data); + +T_BLE_AUDIO_SYNC_HANDLE ble_audio_sync_create(P_FUN_BLE_AUDIO_SYNC_CB cb_pfn, + uint8_t advertiser_address_type, + uint8_t *advertiser_address, uint8_t adv_sid, + uint8_t broadcast_id[BROADCAST_ID_LEN]); +bool ble_audio_sync_update_cb(T_BLE_AUDIO_SYNC_HANDLE handle, + P_FUN_BLE_AUDIO_SYNC_CB cb_pfn); +bool ble_audio_sync_update_addr(T_BLE_AUDIO_SYNC_HANDLE handle, + uint8_t *advertiser_address); + +T_BLE_AUDIO_SYNC_HANDLE ble_audio_sync_find(uint8_t advertiser_address_type, + uint8_t adv_sid, uint8_t broadcast_id[BROADCAST_ID_LEN]); +bool ble_audio_sync_get_info(T_BLE_AUDIO_SYNC_HANDLE handle, T_BLE_AUDIO_SYNC_INFO *p_info); +bool ble_audio_sync_realese(T_BLE_AUDIO_SYNC_HANDLE handle); + +bool ble_audio_pa_sync_establish(T_BLE_AUDIO_SYNC_HANDLE handle, uint8_t options, + uint8_t sync_cte_type, + uint16_t skip, uint16_t sync_timeout); +bool ble_audio_pa_terminate(T_BLE_AUDIO_SYNC_HANDLE handle); + +bool ble_audio_set_default_past_recipient_param( + T_GAP_PAST_RECIPIENT_PERIODIC_ADV_SYNC_TRANSFER_PARAM *p_param); +bool ble_audio_set_past_recipient_param(uint16_t conn_handle, + T_GAP_PAST_RECIPIENT_PERIODIC_ADV_SYNC_TRANSFER_PARAM *p_param); + +#endif + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/inc/bluetooth/leaudio/bt_bond_mgr.h b/inc/bluetooth/leaudio/bt_bond_mgr.h new file mode 100644 index 0000000..d6e7c74 --- /dev/null +++ b/inc/bluetooth/leaudio/bt_bond_mgr.h @@ -0,0 +1,51 @@ +/** +********************************************************************************************************* +* Copyright(c) 2019, Realtek Semiconductor Corporation. All rights reserved. +********************************************************************************************************* +*/ + +#ifndef _BT_BOND_MGR_ +#define _BT_BOND_MGR_ + +#include <stdint.h> +#include <stdbool.h> + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +typedef bool (*P_BT_BOND_CHECK)(uint8_t *bd_addr, uint8_t bd_type, uint16_t conn_handle); + +typedef bool (*P_BT_BOND_GET_KEY)(uint8_t *bd_addr, uint8_t bd_type, uint16_t conn_handle, + bool remote, uint8_t *p_key_len, uint8_t *p_key); + +typedef uint8_t (*P_BT_BOND_GET_MAX_NUM)(bool is_le); + +typedef bool (*P_BT_BOND_GET_ADDR)(bool is_le, uint8_t bond_idx, uint8_t *bd_addr, + uint8_t *p_bd_type, uint8_t *local_bd_addr, + uint8_t *p_local_bd_type); + +typedef bool (*P_BT_BOND_SET_CCCD_FLAG)(uint8_t *bd_addr, uint8_t bd_type, uint8_t *local_bd_addr, + uint8_t local_bd_type, + uint16_t cccd_handle, uint16_t flags); +typedef bool (*P_BT_BOND_CLEAR_CCCD_FLAG)(uint8_t *bd_addr, uint8_t bd_type, uint16_t conn_handle, + uint16_t cccd_handle); + +typedef bool (*P_BT_BOND_LE_RESOLVE_RPA)(uint8_t *unresolved_addr, uint8_t *identity_addr, + uint8_t *p_identity_addr_type); + +typedef struct +{ + P_BT_BOND_CHECK bond_check; + P_BT_BOND_GET_KEY bond_get_key; + P_BT_BOND_GET_MAX_NUM bond_get_max_num; + P_BT_BOND_GET_ADDR bond_get_addr; + P_BT_BOND_SET_CCCD_FLAG bond_set_cccd_flag; + P_BT_BOND_CLEAR_CCCD_FLAG bond_clear_cccd_flag; + P_BT_BOND_LE_RESOLVE_RPA bond_le_resolve_rpa; +} T_BT_BOND_MGR; + +#ifdef __cplusplus +} +#endif +#endif diff --git a/inc/bluetooth/leaudio/bt_gatt_client.h b/inc/bluetooth/leaudio/bt_gatt_client.h new file mode 100644 index 0000000..fee3389 --- /dev/null +++ b/inc/bluetooth/leaudio/bt_gatt_client.h @@ -0,0 +1,192 @@ +#ifndef _BT_GATT_CLIENT_H_ +#define _BT_GATT_CLIENT_H_ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "gap.h" +#include "profile_client.h" +#include "gap_conn_le.h" + + +typedef enum +{ + GATTC_STORAGE_STATE_IDLE = 0x00, + GATTC_STORAGE_STATE_DISCOVERY = 0x01, + GATTC_STORAGE_STATE_DONE = 0x02, + GATTC_STORAGE_STATE_FAILED = 0x03, +} T_GATTC_STORAGE_STATE; + +#define GATT_CLT_CONFIG_DISABLE 0x00 +#define GATT_CLT_CONFIG_NOTIFICATION 0x01 +#define GATT_CLT_CONFIG_INDICATION 0x02 +#define GATT_CLT_CONFIG_ALL 0x03 +#define ATTR_INSTANCE_NUM_MAX 20 + +typedef enum +{ + GATT_STORAGE_EVENT_SRV_TBL_GET_IND = 0x01, + GATT_STORAGE_EVENT_SRV_TBL_SET_IND = 0x02, +} T_GATT_STORAGE_EVENT; + +typedef enum +{ + GATT_DISCOV_MODE_CLOSED = 0x00, + GATT_DISCOV_MODE_REG_SRV = 0x01, + GATT_DISCOV_MODE_ALL = 0x02, +} T_GATT_DISCOV_MODE; + +//GATT_STORAGE_EVENT_SRV_TBL_GET_IND +typedef struct +{ + uint8_t addr[6]; + uint8_t remote_bd_type; + uint16_t data_len; + uint8_t *p_data; +} T_GATT_STORAGE_SRV_TBL_GET_IND; + +//GATT_STORAGE_EVENT_SRV_TBL_SET_IND +typedef struct +{ + uint8_t addr[6]; + uint8_t remote_bd_type; + uint16_t data_len; + uint8_t *p_data; +} T_GATT_STORAGE_SRV_TBL_SET_IND; + +typedef enum +{ + GATT_CLIENT_EVENT_DIS_DONE = 0x01, + GATT_CLIENT_EVENT_READ_RESULT = 0x02, + GATT_CLIENT_EVENT_WRITE_RESULT = 0x03, + GATT_CLIENT_EVENT_NOTIFY_IND = 0x04, + GATT_CLIENT_EVENT_CCCD_CFG = 0x05, + GATT_CLIENT_EVENT_DIS_ALL_STATE = 0x06, + GATT_CLIENT_EVENT_CONN_DEL = 0x07, +} T_GATT_CLIENT_EVENT; + +typedef struct +{ + bool is_uuid16; + uint8_t instance_id; + union + { + uint16_t uuid16; + uint8_t uuid128[16]; + } p; +} T_ATTR_UUID; + +typedef struct +{ + T_GATTC_STORAGE_STATE state; + bool load_form_ftl; +} T_GATT_CLIENT_DIS_ALL_DONE; + +typedef struct +{ + bool is_found; + bool load_form_ftl; + uint8_t srv_instance_num; +} T_GATT_CLIENT_DIS_DONE; + +typedef struct +{ + bool is_cccd_desc; + uint8_t srv_instance_id; + T_ATTR_UUID char_uuid; + uint16_t cause; + uint16_t handle; + uint16_t value_size; + uint8_t *p_value; +} T_GATT_CLIENT_READ_RESULT; + +typedef struct +{ + bool is_cccd_desc; + uint8_t srv_instance_id; + T_ATTR_UUID char_uuid; + uint16_t cause; + T_GATT_WRITE_TYPE type; + uint16_t handle; +} T_GATT_CLIENT_WRITE_RESULT; + +typedef struct +{ + uint8_t srv_instance_id; + T_ATTR_UUID char_uuid; + bool notify; + uint16_t handle; + uint16_t value_size; + uint8_t *p_value; +} T_GATT_CLIENT_NOTIFY_IND; + +typedef struct +{ + bool srv_cfg; + uint8_t srv_instance_id; + uint16_t cccd_data; + uint16_t cause; + T_ATTR_UUID uuid; +} T_GATT_CLIENT_CCCD_CFG; + +typedef union +{ + T_GATT_CLIENT_DIS_DONE dis_done; + T_GATT_CLIENT_READ_RESULT read_result; + T_GATT_CLIENT_WRITE_RESULT write_result; + T_GATT_CLIENT_NOTIFY_IND notify_ind; + T_GATT_CLIENT_CCCD_CFG cccd_cfg; +} T_GATT_CLIENT_DATA; + +typedef union +{ + T_GATT_CLIENT_DATA *p_gatt_data; +} T_GATTC_DATA; + +typedef struct +{ + uint8_t instance_num; + uint8_t instance_id[ATTR_INSTANCE_NUM_MAX]; +} T_ATTR_INSTANCE; + +typedef T_APP_RESULT(*P_FUN_GATT_CLIENT_CB)(uint16_t conn_handle, T_GATT_CLIENT_EVENT type, + void *p_data); +typedef T_APP_RESULT(*P_FUN_GATT_STORAGE_CB)(T_GATT_STORAGE_EVENT type, void *p_data); + +T_GAP_CAUSE gatt_client_start_discovery_all(uint16_t conn_handle, P_FUN_GATT_CLIENT_CB p_dis_cb); +T_GAP_CAUSE gatt_client_enable_srv_cccd(uint16_t conn_handle, T_ATTR_UUID *p_srv_uuid, + uint8_t cccd_cfg); +T_GAP_CAUSE gatt_client_enable_char_cccd(uint16_t conn_handle, T_ATTR_UUID *p_srv_uuid, + uint16_t char_uuid16, uint8_t cccd_cfg); +T_GAP_CAUSE gatt_client_enable_uuid128_char_cccd(uint16_t conn_handle, T_ATTR_UUID *p_srv_uuid, + uint8_t *p_uuid128, uint8_t cccd_cfg); +T_GAP_CAUSE gatt_client_read(uint16_t conn_handle, uint16_t handle, P_FUN_GATT_CLIENT_CB p_req_cb); +T_GAP_CAUSE gatt_client_read_uuid(uint16_t conn_handle, uint16_t start_handle, + uint16_t end_handle, uint16_t uuid16, P_FUN_GATT_CLIENT_CB p_req_cb); +T_GAP_CAUSE gatt_client_write(uint16_t conn_handle, T_GATT_WRITE_TYPE write_type, + uint16_t handle, uint16_t length, uint8_t *p_data, P_FUN_GATT_CLIENT_CB p_req_cb); + +T_GAP_CAUSE gatt_spec_client_register(T_ATTR_UUID *p_srv_uuid, P_FUN_GATT_CLIENT_CB p_fun_cb); + +//find info about service +bool gatt_client_find_char_handle(uint16_t conn_handle, T_ATTR_UUID *p_srv_uuid, + T_ATTR_UUID *p_char_uuid, uint16_t *p_handle); +bool gatt_client_find_primary_srv_by_include(uint16_t conn_handle, T_ATTR_UUID *p_included_srv, + T_ATTR_UUID *p_primary_srv); +bool gatt_client_find_include_srv_by_primary(uint16_t conn_handle, T_ATTR_UUID *p_primary_srv, + T_ATTR_UUID *p_included_srv, + T_ATTR_INSTANCE *p_attr_instance); +uint8_t gatt_client_get_char_num(uint16_t conn_handle, T_ATTR_UUID *p_srv_uuid, + T_ATTR_UUID *p_char_uuid); +bool gatt_client_get_char_prop(uint16_t conn_handle, T_ATTR_UUID *p_srv_uuid, + T_ATTR_UUID *p_char_uuid, uint16_t *p_properties); + +bool gatt_client_init(T_GATT_DISCOV_MODE mode); +bool gatt_storage_register(P_FUN_GATT_STORAGE_CB p_fun_cb); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/inc/bluetooth/leaudio/cap.h b/inc/bluetooth/leaudio/cap.h new file mode 100644 index 0000000..ec21059 --- /dev/null +++ b/inc/bluetooth/leaudio/cap.h @@ -0,0 +1,86 @@ +#ifndef _CAP_H_ +#define _CAP_H_ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "ble_audio_group.h" +#include "csis_def.h" + +#if LE_AUDIO_CAP_SUPPORT +#define CAP_ACCEPTOR_ROLE 0x01 +#define CAP_INITIATOR_ROLE 0x02 +#define CAP_CAMMANDER_ROLE 0x04 + +#define GATT_UUID_CAS 0x1853 + +typedef struct +{ + uint8_t default_volume_settings; + uint8_t default_mute; + uint8_t default_mic_mute; +} T_CAP_DEFAULT_PARAM; + +typedef struct +{ + uint8_t cap_role; + bool cas_client; + bool csip_set_coordinator; + uint8_t csis_num; + struct + { + bool enable; + T_CSIS_SIRK_TYPE csis_sirk_type; + uint8_t csis_size; + uint8_t csis_rank; + uint8_t csis_feature; + uint8_t *csis_sirk; + } cas; + struct + { + bool vcp_volume_controller; + bool micp_mic_controller; + uint8_t default_volume_settings; + uint8_t default_mute; + uint8_t default_mic_mute; + } vcp_micp; + + bool ccp_call_control_client; + struct + { + bool ccp_call_control_server; + uint8_t tbs_num; + } tbs; + bool mcp_media_control_client; + struct + { + bool mcp_media_control_server; + uint8_t mcs_num; + uint8_t ots_num; + } mcs; +} T_CAP_INIT_PARAMS; + +typedef struct +{ + uint16_t conn_handle; + bool is_found; + bool load_form_ftl; + uint8_t srv_num; +} T_CAP_DIS_DONE; + +bool cap_change_volume_by_address(uint8_t *bd_addr, uint8_t addr_type, uint8_t volume_setting); +bool cap_change_volume(T_BLE_AUDIO_GROUP_HANDLE group_handle, uint8_t volume_setting); +bool cap_change_mute_by_address(uint8_t *bd_addr, uint8_t addr_type, uint8_t mute); +bool cap_change_mute(T_BLE_AUDIO_GROUP_HANDLE group_handle, uint8_t mute); +bool cap_change_mic_mute_by_address(uint8_t *bd_addr, uint8_t addr_type, uint8_t mute); +bool cap_change_input_gain_by_address(uint8_t *bd_addr, uint8_t addr_type, int8_t gain); +bool cap_init(T_CAP_INIT_PARAMS *p_param); + +#endif + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/inc/bluetooth/leaudio/codec_def.h b/inc/bluetooth/leaudio/codec_def.h new file mode 100644 index 0000000..73c052d --- /dev/null +++ b/inc/bluetooth/leaudio/codec_def.h @@ -0,0 +1,122 @@ +#ifndef _CODEC_DEF_H_ +#define _CODEC_DEF_H_ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#define TRANSPARENT_CODEC_ID 0x03 +#define LC3_CODEC_ID 0x06 +#define VENDOR_CODEC_ID 0xFF +#define CODEC_ID_LEN 5 + +/* Codec_Specific_Capabilities parameters*/ +//Codec Specific Capability Types +#define CODEC_CAP_TYPE_SUPPORTED_SAMPLING_FREQUENCIES 0x01 +#define CODEC_CAP_TYPE_SUPPORTED_FRAME_DURATIONS 0x02 +#define CODEC_CAP_TYPE_AUDIO_CHANNEL_COUNTS 0x03 +/*4 octets. +Octet 0-1: Minimum number of octets supported per codec frame +Octet 2-3: Maximum number of octets supported per codec frame*/ +#define CODEC_CAP_TYPE_SUPPORTED_OCTETS_PER_CODEC_FRAME 0x04 +#define CODEC_CAP_TYPE_MAX_SUPPORTED_FRAMES_PER_SDU 0x05 + +#define SAMPLING_FREQUENCY_8K 0x0001 +#define SAMPLING_FREQUENCY_11K 0x0002 +#define SAMPLING_FREQUENCY_16K 0x0004 +#define SAMPLING_FREQUENCY_22K 0x0008 +#define SAMPLING_FREQUENCY_24K 0x0010 +#define SAMPLING_FREQUENCY_32K 0x0020 +#define SAMPLING_FREQUENCY_44_1K 0x0040 +#define SAMPLING_FREQUENCY_48K 0x0080 +#define SAMPLING_FREQUENCY_88K 0x0100 +#define SAMPLING_FREQUENCY_96K 0x0200 +#define SAMPLING_FREQUENCY_176K 0x0400 +#define SAMPLING_FREQUENCY_192K 0x0800 +#define SAMPLING_FREQUENCY_384K 0x1000 +#define SAMPLING_FREQUENCY_MASK 0x1FFF + +#define FRAME_DURATION_7_5_MS_BIT 0x01 +#define FRAME_DURATION_10_MS_BIT 0x02 +#define FRAME_DURATION_PREFER_7_5_MS_BIT 0x10 +#define FRAME_DURATION_PREFER_10_MS_BIT 0x20 + +#define AUDIO_CHANNEL_COUNTS_1 0x01 +#define AUDIO_CHANNEL_COUNTS_2 0x02 +#define AUDIO_CHANNEL_COUNTS_3 0x04 +#define AUDIO_CHANNEL_COUNTS_4 0x08 +#define AUDIO_CHANNEL_COUNTS_5 0x10 +#define AUDIO_CHANNEL_COUNTS_6 0x20 +#define AUDIO_CHANNEL_COUNTS_7 0x40 +#define AUDIO_CHANNEL_COUNTS_8 0x80 + +//Config Codec operation +#define CODEC_CFG_TYPE_SAMPLING_FREQUENCY 0x01 +#define CODEC_CFG_TYPE_FRAME_DURATION 0x02 +#define CODEC_CFG_TYPE_AUDIO_CHANNEL_ALLOCATION 0x03 +#define CODEC_CFG_TYPE_OCTET_PER_CODEC_FRAME 0x04 +#define CODEC_CFG_TYPE_BLOCKS_PER_SDU 0x05 + +#define SAMPLING_FREQUENCY_CFG_8K 0x01 +#define SAMPLING_FREQUENCY_CFG_11K 0x02 +#define SAMPLING_FREQUENCY_CFG_16K 0x03 +#define SAMPLING_FREQUENCY_CFG_22K 0x04 +#define SAMPLING_FREQUENCY_CFG_24K 0x05 +#define SAMPLING_FREQUENCY_CFG_32K 0x06 +#define SAMPLING_FREQUENCY_CFG_44_1K 0x07 +#define SAMPLING_FREQUENCY_CFG_48K 0x08 +#define SAMPLING_FREQUENCY_CFG_88K 0x09 +#define SAMPLING_FREQUENCY_CFG_96K 0x0A +#define SAMPLING_FREQUENCY_CFG_176K 0x0B +#define SAMPLING_FREQUENCY_CFG_192K 0x0C +#define SAMPLING_FREQUENCY_CFG_384K 0x0D + +#define FRAME_DURATION_CFG_7_5_MS 0x00 +#define FRAME_DURATION_CFG_10_MS 0x01 + + + +#define CODEC_CAP_SUPPORTED_SAMPLING_FREQUENCIES_EXIST 0x0001 +#define CODEC_CAP_SUPPORTED_FRAME_DURATIONS_EXIST 0x0002 +#define CODEC_CAP_AUDIO_CHANNEL_COUNTS_EXIST 0x0004 +#define CODEC_CAP_SUPPORTED_OCTETS_PER_CODEC_FRAME_EXIST 0x0008 +#define CODEC_CAP_MAX_SUPPORTED_FRAMES_PER_SDU_EXIST 0x0010 + +#define CODEC_CFG_SAMPLING_FREQUENCY_EXIST 0x0001 +#define CODEC_CFG_FRAME_DURATION_EXIST 0x0002 +#define CODEC_CFG_AUDIO_CHANNEL_ALLOCATION_EXIST 0x0004 +#define CODEC_CFG_OCTET_PER_CODEC_FRAME_EXIST 0x0008 +#define CODEC_CFG_TYPE_BLOCKS_PER_SDU_EXIST 0x0010 + +typedef struct +{ + uint16_t type_exist; + uint16_t supported_sampling_frequencies; + uint8_t supported_frame_durations; + uint8_t audio_channel_counts; + uint8_t max_supported_codec_frames_per_sdu; + uint16_t min_octets_per_codec_frame; + uint16_t max_octets_per_codec_frame; +} T_CODEC_CAP; + +typedef struct +{ + uint16_t type_exist; + uint8_t frame_duration; + uint8_t sample_frequency; + uint8_t codec_frame_blocks_per_sdu; + uint16_t octets_per_codec_frame; + uint32_t audio_channel_allocation; + uint32_t presentation_delay; +} T_CODEC_CFG; + +uint8_t count_bits_1(uint32_t value); +bool codec_cap_parse(uint8_t len, uint8_t *p_data, T_CODEC_CAP *p_cap); +bool codec_cfg_parse(uint8_t len, uint8_t *p_data, T_CODEC_CFG *p_cfg); +bool codec_cfg_gen(uint8_t *p_len, uint8_t *p_data, T_CODEC_CFG *p_cfg); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/inc/bluetooth/leaudio/codec_qos.h b/inc/bluetooth/leaudio/codec_qos.h new file mode 100644 index 0000000..82ea6dc --- /dev/null +++ b/inc/bluetooth/leaudio/codec_qos.h @@ -0,0 +1,101 @@ +#ifndef _CODEC_QOS_H_ +#define _CODEC_QOS_H_ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "ble_audio_def.h" +#include "codec_def.h" + +typedef enum +{ + CODEC_CFG_ITEM_8_1 = 0, + CODEC_CFG_ITEM_8_2 = 1, + CODEC_CFG_ITEM_16_1 = 2, + CODEC_CFG_ITEM_16_2 = 3, + CODEC_CFG_ITEM_24_1 = 4, + CODEC_CFG_ITEM_24_2 = 5, + CODEC_CFG_ITEM_32_1 = 6, + CODEC_CFG_ITEM_32_2 = 7, + CODEC_CFG_ITEM_441_1 = 8, + CODEC_CFG_ITEM_441_2 = 9, + CODEC_CFG_ITEM_48_1 = 10, + CODEC_CFG_ITEM_48_2 = 11, + CODEC_CFG_ITEM_48_3 = 12, + CODEC_CFG_ITEM_48_4 = 13, + CODEC_CFG_ITEM_48_5 = 14, + CODEC_CFG_ITEM_48_6 = 15, + CODEC_CFG_ITEM_LC3_MAX, + + CODEC_CFG_ITEM_VENDOR = 0xff, +} T_CODEC_CFG_ITEM; + + +#define CODEC_CFG_ITEM_8_1_BIT (1 << CODEC_CFG_ITEM_8_1) +#define CODEC_CFG_ITEM_8_2_BIT (1 << CODEC_CFG_ITEM_8_2) +#define CODEC_CFG_ITEM_16_1_BIT (1 << CODEC_CFG_ITEM_16_1) +#define CODEC_CFG_ITEM_16_2_BIT (1 << CODEC_CFG_ITEM_16_2) +#define CODEC_CFG_ITEM_24_1_BIT (1 << CODEC_CFG_ITEM_24_1) +#define CODEC_CFG_ITEM_24_2_BIT (1 << CODEC_CFG_ITEM_24_2) +#define CODEC_CFG_ITEM_32_1_BIT (1 << CODEC_CFG_ITEM_32_1) +#define CODEC_CFG_ITEM_32_2_BIT (1 << CODEC_CFG_ITEM_32_2) +#define CODEC_CFG_ITEM_441_1_BIT (1 << CODEC_CFG_ITEM_441_1) +#define CODEC_CFG_ITEM_441_2_BIT (1 << CODEC_CFG_ITEM_441_2) +#define CODEC_CFG_ITEM_48_1_BIT (1 << CODEC_CFG_ITEM_48_1) +#define CODEC_CFG_ITEM_48_2_BIT (1 << CODEC_CFG_ITEM_48_2) +#define CODEC_CFG_ITEM_48_3_BIT (1 << CODEC_CFG_ITEM_48_3) +#define CODEC_CFG_ITEM_48_4_BIT (1 << CODEC_CFG_ITEM_48_4) +#define CODEC_CFG_ITEM_48_5_BIT (1 << CODEC_CFG_ITEM_48_5) +#define CODEC_CFG_ITEM_48_6_BIT (1 << CODEC_CFG_ITEM_48_6) + +#define SAMPLE_FREQ_8K_TABLE_MASK (CODEC_CFG_ITEM_8_1_BIT|CODEC_CFG_ITEM_8_2_BIT) +#define SAMPLE_FREQ_16K_TABLE_MASK (CODEC_CFG_ITEM_16_1_BIT|CODEC_CFG_ITEM_16_2_BIT) +#define SAMPLE_FREQ_24K_TABLE_MASK (CODEC_CFG_ITEM_24_1_BIT|CODEC_CFG_ITEM_24_2_BIT) +#define SAMPLE_FREQ_32K_TABLE_MASK (CODEC_CFG_ITEM_32_1_BIT|CODEC_CFG_ITEM_32_2_BIT) +#define SAMPLE_FREQ_441K_TABLE_MASK (CODEC_CFG_ITEM_441_1_BIT|CODEC_CFG_ITEM_441_2_BIT) +#define SAMPLE_FREQ_48K_TABLE_MASK (CODEC_CFG_ITEM_48_1_BIT|CODEC_CFG_ITEM_48_2_BIT| \ + CODEC_CFG_ITEM_48_3_BIT|CODEC_CFG_ITEM_48_4_BIT| \ + CODEC_CFG_ITEM_48_5_BIT|CODEC_CFG_ITEM_48_6_BIT) + +#define FREAM_DUIATION_7_5M_TALBLE_MASK (CODEC_CFG_ITEM_8_1_BIT|CODEC_CFG_ITEM_16_1_BIT| \ + CODEC_CFG_ITEM_24_1_BIT|CODEC_CFG_ITEM_32_1_BIT| \ + CODEC_CFG_ITEM_441_1_BIT|CODEC_CFG_ITEM_48_1_BIT| \ + CODEC_CFG_ITEM_48_3_BIT|CODEC_CFG_ITEM_48_5_BIT) +#define FREAM_DUIATION_10M_TALBLE_MASK (CODEC_CFG_ITEM_8_2_BIT|CODEC_CFG_ITEM_16_2_BIT| \ + CODEC_CFG_ITEM_24_2_BIT|CODEC_CFG_ITEM_32_2_BIT| \ + CODEC_CFG_ITEM_441_2_BIT|CODEC_CFG_ITEM_48_2_BIT| \ + CODEC_CFG_ITEM_48_4_BIT|CODEC_CFG_ITEM_48_6_BIT) + +typedef enum +{ + QOS_CFG_CIS_LOW_LATENCY, + QOS_CFG_CIS_HIG_RELIABILITY, + QOS_CFG_BIS_LOW_LATENCY, + QOS_CFG_BIS_HIG_RELIABILITY, +} T_QOS_CFG_TYPE; + +typedef struct +{ + uint32_t sdu_interval; + uint8_t framing; + uint16_t max_sdu; + uint8_t retransmission_number; + uint16_t max_transport_latency; + uint32_t presentation_delay; +} T_QOS_CFG_PREFERRED; + +bool codec_preferred_cfg_get(T_CODEC_CFG_ITEM item, T_CODEC_CFG *p_cfg); +bool qos_preferred_cfg_get(T_CODEC_CFG_ITEM item, T_QOS_CFG_TYPE type, T_QOS_CFG_PREFERRED *p_qos); +bool qos_cfg_find_by_codec_cfg(T_CODEC_CFG *p_cfg, uint8_t target_latency, + T_QOS_CFG_PREFERRED *p_qos); +bool get_max_sdu_len_by_codec_cfg(T_CODEC_CFG *p_cfg, uint16_t *p_max_len); +bool get_sdu_interval_by_codec_cfg(T_CODEC_CFG *p_cfg, uint32_t *p_sdu_int); +bool codec_cap_get_cfg_bits(uint32_t *p_cfg_bits, T_CODEC_CAP *p_cap); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/inc/bluetooth/leaudio/csis_def.h b/inc/bluetooth/leaudio/csis_def.h new file mode 100644 index 0000000..7752e7b --- /dev/null +++ b/inc/bluetooth/leaudio/csis_def.h @@ -0,0 +1,49 @@ +#ifndef _CSIS_DEF_H_ +#define _CSIS_DEF_H_ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#define SET_MEMBER_LOCK_EXIST 0x01 +#define SET_MEMBER_SIZE_EXIST 0x02 +#define SET_MEMBER_RANK_EXIST 0x04 +#define SET_MEMBER_SIRK_NOTIFY_SUPPORT 0x10 +#define SET_MEMBER_SIZE_NOTIFY_SUPPORT 0x20 + +#define ATT_ERR_CSIS_LOCK_DENIED 0x80 +#define ATT_ERR_CSIS_LOCK_RELEASE_NOT_ALLOWED 0x81 +#define ATT_ERR_CSIS_INVALID_LOCK_VALUE 0x82 +#define ATT_ERR_CSIS_OOB_SIRK_ONLY 0x83 +#define ATT_ERR_CSIS_LOCK_ALREADY_GRANTED 0x84 + +//coordinated set identification service +#define GATT_UUID_CSIS 0x1846 + +#define CSIS_UUID_CHAR_SET_IRK 0x2B84 +#define CSIS_UUID_CHAR_SIZE 0x2B85 +#define CSIS_UUID_CHAR_LOCK 0x2B86 +#define CSIS_UUID_CHAR_RANK 0x2B87 + +#define CSI_SIRK_LEN 16 + +#define CSI_LOCK_DEFAULT_TIMEOUT 60000 +#define CSIP_DISCOVERY_TIMEOUT 10000 +typedef enum +{ + CSIS_NONE_LOCK = 0, + CSIS_UNLOCKED = 0x01, + CSIS_LOCKED = 0x02, +} T_CSIS_LOCK; + +typedef enum +{ + CSIS_SIRK_ENC = 0x00, + CSIS_SIRK_PLN = 0x01, +} T_CSIS_SIRK_TYPE; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/inc/bluetooth/leaudio/csis_rsi.h b/inc/bluetooth/leaudio/csis_rsi.h new file mode 100644 index 0000000..dd131fb --- /dev/null +++ b/inc/bluetooth/leaudio/csis_rsi.h @@ -0,0 +1,24 @@ +#ifndef _CSIS_RSI_H_ +#define _CSIS_RSI_H_ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include <stdint.h> +#include <stdbool.h> + +#define GAP_ADTYPE_RSI 0x2E + +#define CSI_RSI_LEN 6 + +#if (LE_AUDIO_CSIS_CLIENT_SUPPORT|LE_AUDIO_CSIS_SUPPORT) +bool csis_gen_rsi(const uint8_t *p_sirk, uint8_t *p_rsik); +bool csis_resolve_rsi(const uint8_t *p_sirk, uint8_t *p_rsik); +#endif + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/inc/bluetooth/leaudio/metadata_def.h b/inc/bluetooth/leaudio/metadata_def.h new file mode 100644 index 0000000..673b3aa --- /dev/null +++ b/inc/bluetooth/leaudio/metadata_def.h @@ -0,0 +1,54 @@ +#ifndef _METADATA_DEF_H_ +#define _METADATA_DEF_H_ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/*The Preferred_Audio_Contexts LTV structure is typically included +in the Metadata field of PAC records exposed by Unicast Servers and Broadcast Sinks. */ +#define METADATA_TYPE_PREFERRED_AUDIO_CONTEXTS 0x01 + +/*The Streaming_Audio_Contexts LTV structure is typically included in a Metadata parameter value +when initiating the Enable or Update Metadata ASE Control operations for unicast Audio Streams, +or in the Metadata parameter value included in a BASE structure for broadcast Audio Streams.*/ +#define METADATA_TYPE_STREAMING_AUDIO_CONTEXTS 0x02 +/*Title and/or summary of Audio Stream content: UTF-8 format. */ +#define METADATA_TYPE_PROGRAM_INFO 0x03 +/*3-byte, lower case language code as defined in ISO 639-3. */ +#define METADATA_TYPE_LANGUAGE 0x04 +/*Array of CCID values. */ +#define METADATA_TYPE_CCCD_LIST 0x05 +/*Parental_Rating. */ +#define METADATA_TYPE_PARENTAL_RATING 0x06 +/*A UTF-8 formatted URL link used to present more information about Program_Info. */ +#define METADATA_TYPE_PROGRAM_INFO_URI 0x07 +/*Extended Metadata. */ +#define METADATA_TYPE_EXTENDED 0xFE +/*Vendor_Specific. */ +#define METADATA_TYPE_VENDOR_SPECIFIC 0xFF + + +//BAPS_Assigned_Numbers_v7, different with IOP +#define AUDIO_CONTEXT_UNSPECIFIED 0x0001 +#define AUDIO_CONTEXT_CONVERSATIONAL 0x0002 +#define AUDIO_CONTEXT_MEDIA 0x0004 +#define AUDIO_CONTEXT_GAME 0x0008 +#define AUDIO_CONTEXT_INSTRUCTIONAL 0x0010 +#define AUDIO_CONTEXT_VOICE_ASSISTANTS 0x0020 +#define AUDIO_CONTEXT_LIVE 0x0040 +#define AUDIO_CONTEXT_SOUND_EFFECTS 0x0080 +#define AUDIO_CONTEXT_NOTIFICATIONS 0x0100 +#define AUDIO_CONTEXT_RINGTONE 0x0200 +#define AUDIO_CONTEXT_ALERTS 0x0400 +#define AUDIO_CONTEXT_EMERGENCY_ALERT 0x0800 +#define AUDIO_CONTEXT_MASK 0x0FFF + +#define MCS_CCID_PRE_IDX 0x80 +#define TBS_CCID_PRE_IDX 0x40 + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/inc/bluetooth/leaudio/pacs_client.h b/inc/bluetooth/leaudio/pacs_client.h new file mode 100644 index 0000000..4d829fd --- /dev/null +++ b/inc/bluetooth/leaudio/pacs_client.h @@ -0,0 +1,102 @@ +#ifndef _PACS_CLIENT_H_ +#define _PACS_CLIENT_H_ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +typedef enum +{ + PACS_OP_SINK, + PACS_OP_SOURCE, + PACS_OP_ALL +} T_PACS_CCCD_OP_TYPE; + +typedef enum +{ + PACS_AUDIO_AVAILABLE_CONTEXTS, + PACS_AUDIO_SUPPORTED_CONTEXTS, + PACS_SINK_AUDIO_LOC, + PACS_SINK_PAC, + PACS_SOURCE_AUDIO_LOC, + PACS_SOURCE_PAC, +} T_PACS_TYPE; + +//LE_AUDIO_MSG_PACS_CLIENT_DIS_DONE +typedef struct +{ + uint16_t conn_handle; + bool is_found; + bool load_form_ftl; + uint8_t sink_pac_num; + uint8_t source_pac_num; + bool sink_loc_writable; + bool sink_loc_exist; + bool source_loc_writable; + bool source_loc_exist; +} T_PACS_CLIENT_DIS_DONE; + +//LE_AUDIO_MSG_PACS_CLIENT_CCCD +typedef struct +{ + uint16_t conn_handle; + T_PACS_CCCD_OP_TYPE type; + uint16_t cause; +} T_PACS_CLIENT_CCCD; + +//LE_AUDIO_MSG_PACS_CLIENT_WRITE_SINK_LOC_RESULT +//LE_AUDIO_MSG_PACS_CLIENT_WRITE_SOURCE_LOC_RESULT +typedef struct +{ + uint16_t conn_handle; + uint16_t cause; +} T_PACS_CLIENT_WRITE_RESULT; + +typedef struct +{ + bool is_complete; + uint16_t handle; + uint16_t pac_record_len; + uint8_t *p_record; +} T_PAC_CHAR_DATA; + +typedef struct +{ + uint16_t sink_contexts; + uint16_t source_contexts; +} T_AUDIO_CONTEXTS_DATA; + +typedef union +{ + T_AUDIO_CONTEXTS_DATA contexts_data; + uint32_t audio_locations; + T_PAC_CHAR_DATA pac_data; +} T_PACS_DATA; + +//LE_AUDIO_MSG_PACS_CLIENT_READ_RESULT +typedef struct +{ + uint16_t conn_handle; + T_PACS_TYPE type; + uint16_t cause; + T_PACS_DATA data; +} T_PACS_CLIENT_READ_RESULT; + +//LE_AUDIO_MSG_PACS_CLIENT_NOTIFY +typedef struct +{ + uint16_t conn_handle; + T_PACS_TYPE type; + T_PACS_DATA data; +} T_PACS_CLIENT_NOTIFY; + +bool pacs_read_char_value(uint16_t conn_handle, T_PACS_TYPE type); +bool pacs_enable_cccd(uint16_t conn_handle, T_PACS_CCCD_OP_TYPE type); +bool pacs_write_sink_audio_locations(uint16_t conn_handle, uint32_t sink_audio_location); +bool pacs_write_source_audio_locations(uint16_t conn_handle, uint32_t source_audio_location); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/inc/bluetooth/leaudio/set_coordinator_client.h b/inc/bluetooth/leaudio/set_coordinator_client.h new file mode 100644 index 0000000..a7124bc --- /dev/null +++ b/inc/bluetooth/leaudio/set_coordinator_client.h @@ -0,0 +1,132 @@ +#ifndef _SET_COORDINATOR_TEST_H_ +#define _SET_COORDINATOR_TEST_H_ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#if LE_AUDIO_CSIS_CLIENT_SUPPORT +#include "csis_rsi.h" +#include "csis_def.h" +#include "ble_audio_group.h" +#include "os_queue.h" + +#define CSIS_SIZE_UNKNOWN 0 + +#define CSIS_LOCK_FLAG 0x01 +#define CSIS_SIRK_FLAG 0x02 +#define CSIS_SIZE_FLAG 0x04 +#define CSIS_RANK_FLAG 0x08 + +typedef struct +{ + uint16_t conn_handle; + bool is_found; + bool load_form_ftl; + uint8_t srv_num; +} T_CSIS_CLIENT_DIS_DONE; + +typedef struct +{ + uint16_t conn_handle; + uint16_t cause; + T_BLE_AUDIO_GROUP_HANDLE group_handle; +} T_CSIS_MEMBER_LOCK_REQ_DONE; + +typedef struct +{ + uint16_t conn_handle; + uint16_t cause; + T_BLE_AUDIO_GROUP_HANDLE group_handle; +} T_CSIS_MEMBER_UNLOCK_REQ_DONE; + +typedef struct +{ + uint16_t conn_handle; + uint16_t srv_uuid; + uint8_t srv_instance_id; + T_BLE_AUDIO_GROUP_HANDLE group_handle; + uint8_t lock; +} T_CSIS_MEMBER_LOCK_STATE; + +typedef struct +{ + T_BLE_AUDIO_GROUP_HANDLE group_handle; +} T_CSIS_COOR_SET_DEL; + +typedef struct +{ + uint8_t set_size; + uint8_t size; + bool search_done; +} T_CSIS_SEARCH_RESULT; + +typedef struct +{ + T_BLE_AUDIO_GROUP_HANDLE group_handle; + T_BLE_AUDIO_DEV_HANDLE dev_handle; + uint8_t bd_addr[6]; + uint8_t addr_type; + uint16_t srv_uuid; + uint8_t rank; + uint8_t size; + uint8_t sirk[CSI_SIRK_LEN]; +} T_CSIS_SET_MEM_FOUND; + +typedef struct +{ + uint16_t cause; + uint16_t conn_handle; + T_BLE_AUDIO_GROUP_HANDLE group_handle; + T_BLE_AUDIO_DEV_HANDLE dev_handle; + uint8_t bd_addr[6]; + uint8_t addr_type; + uint16_t srv_uuid; + uint8_t srv_instance_id; + uint8_t char_exit; + uint8_t rank; + uint8_t size; + uint8_t sirk[CSI_SIRK_LEN]; +} T_CSIS_READ_RESULT; + +//LE_AUDIO_MSG_CSIS_CLIENT_SIRK_CHANGE +typedef struct +{ + T_BLE_AUDIO_GROUP_HANDLE group_handle; + uint8_t sirk[CSI_SIRK_LEN]; +} T_CSIS_SIRK_CHANGE; + +typedef struct +{ + uint16_t serv_uuid; + uint8_t srv_instance_id; + uint8_t dev_num; + uint8_t set_mem_size; + uint8_t sirk[CSI_SIRK_LEN]; +} T_CSIS_GROUP_INFO; + +void coordinator_read_csis_chars(uint16_t conn_handle, uint8_t instance_id); +bool csis_client_parse_ext_adv(uint8_t report_data_len, uint8_t *p_report_data, + uint8_t *p_bd_addr, uint8_t addr_type); +bool set_discover_members_state(T_BLE_AUDIO_GROUP_HANDLE group_handle); +bool csis_client_get_info(T_BLE_AUDIO_GROUP_HANDLE group_handle, T_CSIS_GROUP_INFO *p_info); +bool set_lock_of_coor_set(T_BLE_AUDIO_GROUP_HANDLE group_handle); +bool set_unlock_of_coor_set(T_BLE_AUDIO_GROUP_HANDLE group_handle); +T_BLE_AUDIO_GROUP_HANDLE coordinator_set_find_by_rsi(uint8_t *p_rsik); +T_BLE_AUDIO_GROUP_HANDLE coordinator_set_find_by_sirk(uint8_t *p_sirk); +T_BLE_AUDIO_GROUP_HANDLE coordinator_set_find_by_addr(uint8_t *bd_addr, uint8_t addr_type, + uint16_t serv_uuid); +T_BLE_AUDIO_DEV_HANDLE set_member_find_by_conn_handle(T_BLE_AUDIO_GROUP_HANDLE group_handle, + uint16_t conn_handle); +bool coordinator_or_member_find_by_addr(uint8_t *bd_addr, uint8_t addr_type, uint16_t serv_uuid, + T_BLE_AUDIO_GROUP_HANDLE *p_group_handle, T_BLE_AUDIO_DEV_HANDLE *p_dev_handle); +bool set_member_info_find_by_dev_handle(T_BLE_AUDIO_DEV_HANDLE *p_dev_handle, + T_CSIS_SET_MEM_FOUND *set_mem_info); + +#endif + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif |