blob: a7b7741db3b73c88e533a0f345fee4fe203724a9 [file]
/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
*
* BlueZ - Bluetooth protocol stack for Linux
*
* Copyright 2023-2024 NXP
*
*/
struct bt_bass;
struct bt_bcast_src;
#define NUM_BCAST_RECV_STATES 2
#define BT_BASS_BCAST_CODE_SIZE 16
#define BT_BASS_BIG_SYNC_FAILED_BITMASK 0xFFFFFFFF
#define BT_BASS_BCAST_SRC_LEN 15
#define BT_BASS_BCAST_SRC_SUBGROUP_LEN 5
/* Application error codes */
#define BT_BASS_ERROR_OPCODE_NOT_SUPPORTED 0x80
#define BT_BASS_ERROR_INVALID_SOURCE_ID 0x81
/* PA_Sync_State values */
#define BT_BASS_NOT_SYNCHRONIZED_TO_PA 0x00
#define BT_BASS_SYNC_INFO_RE 0x01
#define BT_BASS_SYNCHRONIZED_TO_PA 0x02
#define BT_BASS_FAILED_TO_SYNCHRONIZE_TO_PA 0x03
#define BT_BASS_NO_PAST 0x04
/* BIG_Encryption values */
#define BT_BASS_BIG_ENC_STATE_NO_ENC 0x00
#define BT_BASS_BIG_ENC_STATE_BCODE_REQ 0x01
#define BT_BASS_BIG_ENC_STATE_DEC 0x02
#define BT_BASS_BIG_ENC_STATE_BAD_CODE 0x03
/* Broadcast Audio Scan Control Point
* header structure
*/
struct bt_bass_bcast_audio_scan_cp_hdr {
uint8_t op;
} __packed;
#define BT_BASS_REMOTE_SCAN_STOPPED 0x00
#define BT_BASS_REMOTE_SCAN_STARTED 0x01
#define BT_BASS_ADD_SRC 0x02
#define BT_BASS_ADDR_PUBLIC 0x00
#define BT_BASS_ADDR_RANDOM 0x01
/* PA_Sync values */
#define PA_SYNC_NO_SYNC 0x00
#define PA_SYNC_PAST 0x01
#define PA_SYNC_NO_PAST 0x02
/* BIS_Sync no preference bitmask */
#define BIS_SYNC_NO_PREF 0xFFFFFFFF
#define PA_INTERVAL_UNKNOWN 0xFFFF
struct bt_bass_add_src_params {
uint8_t addr_type;
bdaddr_t addr;
uint8_t sid;
uint8_t bid[3];
uint8_t pa_sync;
uint16_t pa_interval;
uint8_t num_subgroups;
uint8_t subgroup_data[];
} __packed;
#define BT_BASS_MOD_SRC 0x03
struct bt_bass_mod_src_params {
uint8_t id;
uint8_t pa_sync;
uint16_t pa_interval;
uint8_t num_subgroups;
uint8_t subgroup_data[];
} __packed;
#define BT_BASS_SET_BCAST_CODE 0x04
struct bt_bass_set_bcast_code_params {
uint8_t id;
uint8_t bcast_code[BT_BASS_BCAST_CODE_SIZE];
} __packed;
#define BT_BASS_REMOVE_SRC 0x05
struct bt_bass_remove_src_params {
uint8_t id;
} __packed;
typedef void (*bt_bass_func_t)(struct bt_bass *bass, void *user_data);
typedef void (*bt_bass_destroy_func_t)(void *user_data);
typedef void (*bt_bass_debug_func_t)(const char *str, void *user_data);
typedef void (*bt_bass_src_func_t)(uint8_t id, uint32_t bid, uint8_t enc,
uint8_t state, uint32_t bis_sync,
void *user_data);
typedef int (*bt_bass_cp_handler_func_t)(struct bt_bcast_src *bcast_src,
uint8_t op, void *params, void *user_data);
struct bt_att *bt_bass_get_att(struct bt_bass *bass);
struct bt_gatt_client *bt_bass_get_client(struct bt_bass *bass);
unsigned int bt_bass_register(bt_bass_func_t attached, bt_bass_func_t detached,
void *user_data);
bool bt_bass_unregister(unsigned int id);
bool bt_bass_set_debug(struct bt_bass *bass, bt_bass_debug_func_t func,
void *user_data, bt_bass_destroy_func_t destroy);
struct bt_bass *bt_bass_new(struct gatt_db *ldb, struct gatt_db *rdb,
const bdaddr_t *adapter_bdaddr);
bool bt_bass_set_user_data(struct bt_bass *bass, void *user_data);
struct bt_bass *bt_bass_ref(struct bt_bass *bass);
void bt_bass_unref(struct bt_bass *bass);
bool bt_bass_attach(struct bt_bass *bass, struct bt_gatt_client *client);
bool bt_bass_set_att(struct bt_bass *bass, struct bt_att *att);
void bt_bass_detach(struct bt_bass *bass);
void bt_bass_add_db(struct gatt_db *db, const bdaddr_t *adapter_bdaddr);
int bt_bass_send(struct bt_bass *bass,
struct bt_bass_bcast_audio_scan_cp_hdr *hdr,
struct iovec *params);
unsigned int bt_bass_src_register(struct bt_bass *bass, bt_bass_src_func_t cb,
void *user_data, bt_bass_destroy_func_t destroy);
bool bt_bass_src_unregister(struct bt_bass *bass, unsigned int id);
unsigned int bt_bass_cp_handler_register(struct bt_bass *bass,
bt_bass_cp_handler_func_t handler,
bt_bass_destroy_func_t destroy,
void *user_data);
bool bt_bass_cp_handler_unregister(struct bt_bass *bass,
unsigned int id);
int bt_bass_set_pa_sync(struct bt_bcast_src *bcast_src, uint8_t sync_state);
int bt_bass_get_pa_sync(struct bt_bcast_src *bcast_src, uint8_t *sync_state);
int bt_bass_set_bis_sync(struct bt_bcast_src *bcast_src, uint8_t bis);
int bt_bass_clear_bis_sync(struct bt_bcast_src *bcast_src, uint8_t bis);
bool bt_bass_check_bis(struct bt_bcast_src *bcast_src, uint8_t bis);
int bt_bass_set_enc(struct bt_bcast_src *bcast_src, uint8_t enc);