Bluetooth: Audio: Add broadcast audio scan service (BASS)
Add the BASS as a standalone service. The service is used for the scan delegator role, which has not been fully implemented yet. Signed-off-by: Emil Gydesen <emil.gydesen@nordicsemi.no>
This commit is contained in:
parent
d1b8743b37
commit
742eac6214
6 changed files with 1633 additions and 0 deletions
97
include/bluetooth/audio/bass.h
Normal file
97
include/bluetooth/audio/bass.h
Normal file
|
@ -0,0 +1,97 @@
|
|||
/** @file
|
||||
* @brief Header for Bluetooth BASS.
|
||||
*
|
||||
* Copyright (c) 2020 Bose Corporation
|
||||
* Copyright (c) 2021 Nordic Semiconductor ASA
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#ifndef ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_BASS_
|
||||
#define ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_BASS_
|
||||
#include <zephyr/types.h>
|
||||
#include <bluetooth/conn.h>
|
||||
|
||||
#if IS_ENABLED(CONFIG_BT_BASS)
|
||||
#define BT_BASS_MAX_METADATA_LEN CONFIG_BT_BASS_MAX_METADATA_LEN
|
||||
#define BT_BASS_MAX_SUBGROUPS CONFIG_BT_BASS_MAX_SUBGROUPS
|
||||
#else
|
||||
#define BT_BASS_MAX_METADATA_LEN 0
|
||||
#define BT_BASS_MAX_SUBGROUPS 0
|
||||
#endif
|
||||
|
||||
#define BT_BASS_BROADCAST_CODE_SIZE 16
|
||||
|
||||
#define BT_BASS_PA_STATE_NOT_SYNCED 0x00
|
||||
#define BT_BASS_PA_STATE_INFO_REQ 0x01
|
||||
#define BT_BASS_PA_STATE_SYNCED 0x02
|
||||
#define BT_BASS_PA_STATE_FAILED 0x03
|
||||
#define BT_BASS_PA_STATE_NO_PAST 0x04
|
||||
|
||||
#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
|
||||
|
||||
#define BT_BASS_ERR_OPCODE_NOT_SUPPORTED 0x80
|
||||
#define BT_BASS_ERR_INVALID_SRC_ID 0x81
|
||||
|
||||
#define BT_BASS_PA_INTERVAL_UNKNOWN 0xFFFF
|
||||
|
||||
#define BT_BASS_BROADCAST_MAX_ID 0xFFFFFF
|
||||
|
||||
#define BT_BASS_BIS_SYNC_NO_PREF 0xFFFFFFFF
|
||||
|
||||
struct bt_bass_subgroup {
|
||||
uint32_t bis_sync;
|
||||
uint32_t requested_bis_sync;
|
||||
uint8_t metadata_len;
|
||||
uint8_t metadata[BT_BASS_MAX_METADATA_LEN];
|
||||
};
|
||||
|
||||
/* TODO: Only expose this as an opaque type */
|
||||
struct bt_bass_recv_state {
|
||||
uint8_t src_id;
|
||||
bt_addr_le_t addr;
|
||||
uint8_t adv_sid;
|
||||
uint8_t req_pa_sync_value;
|
||||
uint8_t pa_sync_state;
|
||||
uint8_t encrypt_state;
|
||||
uint32_t broadcast_id; /* 24 bits */
|
||||
uint8_t bad_code[BT_BASS_BROADCAST_CODE_SIZE];
|
||||
uint8_t num_subgroups;
|
||||
struct bt_bass_subgroup subgroups[BT_BASS_MAX_SUBGROUPS];
|
||||
};
|
||||
|
||||
struct bt_bass_cb {
|
||||
void (*pa_synced)(struct bt_bass_recv_state *recv_state,
|
||||
const struct bt_le_per_adv_sync_synced_info *info);
|
||||
void (*pa_term)(struct bt_bass_recv_state *recv_state,
|
||||
const struct bt_le_per_adv_sync_term_info *info);
|
||||
void (*pa_recv)(struct bt_bass_recv_state *recv_state,
|
||||
const struct bt_le_per_adv_sync_recv_info *info,
|
||||
struct net_buf_simple *buf);
|
||||
void (*biginfo)(struct bt_bass_recv_state *recv_state,
|
||||
const struct bt_iso_biginfo *biginfo);
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Registers the callbacks used by BASS.
|
||||
*/
|
||||
void bt_bass_register_cb(struct bt_bass_cb *cb);
|
||||
|
||||
/**
|
||||
* @brief Set the sync state of a receive state in the server
|
||||
*
|
||||
* @param src_id The source id used to identify the receive state.
|
||||
* @param pa_sync_state The sync state of the PA.
|
||||
* @param bis_synced Array of bitfields to set the BIS sync state for each
|
||||
* subgroup.
|
||||
* @param encrypted The BIG encryption state.
|
||||
* @return int Error value. 0 on success, ERRNO on fail.
|
||||
*/
|
||||
int bt_bass_set_sync_state(uint8_t src_id, uint8_t pa_sync_state,
|
||||
uint32_t bis_synced[BT_BASS_MAX_SUBGROUPS],
|
||||
uint8_t encrypted);
|
||||
|
||||
#endif /* ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_BASS_ */
|
|
@ -48,3 +48,4 @@ zephyr_library_sources_ifdef(CONFIG_BT_AUDIO_CAPABILITIES capabilities.c)
|
|||
zephyr_library_sources_ifdef(CONFIG_BT_AUDIO_UNICAST_CLIENT unicast_client.c)
|
||||
zephyr_library_sources_ifdef(CONFIG_BT_AUDIO_BROADCAST_SOURCE broadcast_source.c)
|
||||
zephyr_library_sources_ifdef(CONFIG_BT_AUDIO_BROADCAST_SINK broadcast_sink.c)
|
||||
zephyr_library_sources_ifdef(CONFIG_BT_BASS bass.c)
|
||||
|
|
|
@ -32,5 +32,6 @@ rsource "Kconfig.vcs"
|
|||
rsource "Kconfig.mics"
|
||||
rsource "Kconfig.csis"
|
||||
rsource "Kconfig.mcs"
|
||||
rsource "Kconfig.bass"
|
||||
|
||||
endif # BT_AUDIO
|
||||
|
|
58
subsys/bluetooth/audio/Kconfig.bass
Normal file
58
subsys/bluetooth/audio/Kconfig.bass
Normal file
|
@ -0,0 +1,58 @@
|
|||
# Bluetooth Audio - Broadcast Assistant configuration options
|
||||
#
|
||||
# Copyright (c) 2020 Bose Corporation
|
||||
# Copyright (c) 2021 Nordic Semiconductor ASA
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
if BT_AUDIO
|
||||
|
||||
##################### Broadcast Audio Scan Service #####################
|
||||
|
||||
config BT_BASS
|
||||
bool "Broadcast Audio Scan Service"
|
||||
select BT_OBSERVER
|
||||
select BT_EXT_ADV
|
||||
select BT_PER_ADV_SYNC
|
||||
select BT_SMP_SC_PAIR_ONLY
|
||||
select BT_ISO_SYNC_RECEIVER
|
||||
help
|
||||
This option enables support for the Broadcast Audio Scan Service.
|
||||
|
||||
if BT_BASS
|
||||
|
||||
config BT_BASS_RECV_STATE_COUNT
|
||||
int "Broadcast Audio Scan Service Receive State Count"
|
||||
default 1
|
||||
range 1 3
|
||||
help
|
||||
Sets the number of receive state characteristics present on the
|
||||
server. Each characteristic may hold information to sync to a
|
||||
periodic advertise or a broadcast isochronous stream.
|
||||
|
||||
config BT_BASS_MAX_METADATA_LEN
|
||||
int "Broadcast Audio Scan Service Maximum Metadata Length"
|
||||
default 32
|
||||
range 0 255
|
||||
help
|
||||
The maximum metadata length support by the BASS server.
|
||||
|
||||
config BT_BASS_MAX_SUBGROUPS
|
||||
int "Broadcast Audio Scan Service Maximum Number of Subgroups support"
|
||||
default 1
|
||||
range 0 31
|
||||
help
|
||||
The maximum number of BIS subgroups supported.
|
||||
|
||||
############### DEBUG ###############
|
||||
|
||||
config BT_DEBUG_BASS
|
||||
bool "Broadcast Audio Scan Service debug"
|
||||
help
|
||||
Use this option to enable Broadcast Audio Scan Service debug logs for
|
||||
the Bluetooth Audio functionality.
|
||||
|
||||
endif # BT_BASS
|
||||
|
||||
endif # BT_AUDIO
|
1383
subsys/bluetooth/audio/bass.c
Normal file
1383
subsys/bluetooth/audio/bass.c
Normal file
File diff suppressed because it is too large
Load diff
93
subsys/bluetooth/audio/bass_internal.h
Normal file
93
subsys/bluetooth/audio/bass_internal.h
Normal file
|
@ -0,0 +1,93 @@
|
|||
/** @file
|
||||
* @brief Internal header for Bluetooth BASS.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2019 Bose Corporation
|
||||
* Copyright (c) 2021 Nordic Semiconductor ASA
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#include <zephyr/types.h>
|
||||
#include <bluetooth/conn.h>
|
||||
#include <bluetooth/audio/bass.h>
|
||||
|
||||
#define BT_BASS_SCAN_STATE_NOT_SCANNING 0x00
|
||||
#define BT_BASS_SCAN_STATE_SCANNING 0x01
|
||||
|
||||
#define BT_BASS_OP_SCAN_STOP 0x00
|
||||
#define BT_BASS_OP_SCAN_START 0x01
|
||||
#define BT_BASS_OP_ADD_SRC 0x02
|
||||
#define BT_BASS_OP_MOD_SRC 0x03
|
||||
#define BT_BASS_OP_BROADCAST_CODE 0x04
|
||||
#define BT_BASS_OP_REM_SRC 0x05
|
||||
|
||||
#define BT_BASS_SCAN_STATE_IDLE 0x00
|
||||
#define BT_BASS_SCAN_STATE_SCANNING 0x01
|
||||
#define BT_BASS_SCAN_STATE_FAILED 0x02
|
||||
#define BT_BASS_SCAN_STATE_SYNCED 0x03
|
||||
|
||||
#define BT_BASS_PA_REQ_NO_SYNC 0x00
|
||||
#define BT_BASS_PA_REQ_SYNC_PAST 0x01
|
||||
#define BT_BASS_PA_REQ_SYNC 0x02
|
||||
|
||||
#define BT_BASS_BROADCAST_ID_SIZE 3
|
||||
|
||||
#define BT_BASS_VALID_OPCODE(opcode) \
|
||||
((opcode) >= BT_BASS_OP_SCAN_STOP && (opcode) <= BT_BASS_OP_REM_SRC)
|
||||
|
||||
struct bt_bass_cp_scan_stop {
|
||||
uint8_t opcode;
|
||||
} __packed;
|
||||
|
||||
struct bt_bass_cp_scan_start {
|
||||
uint8_t opcode;
|
||||
} __packed;
|
||||
|
||||
struct bt_bass_cp_subgroup {
|
||||
uint32_t bis_sync;
|
||||
uint8_t metadata_len;
|
||||
uint8_t metadata[0];
|
||||
} __packed;
|
||||
|
||||
struct bt_bass_cp_add_src {
|
||||
uint8_t opcode;
|
||||
bt_addr_le_t addr;
|
||||
uint8_t adv_sid;
|
||||
uint8_t broadcast_id[BT_BASS_BROADCAST_ID_SIZE];
|
||||
uint8_t pa_sync;
|
||||
uint16_t pa_interval;
|
||||
uint8_t num_subgroups;
|
||||
struct bt_bass_cp_subgroup subgroups[0];
|
||||
} __packed;
|
||||
|
||||
struct bt_bass_cp_mod_src {
|
||||
uint8_t opcode;
|
||||
uint8_t src_id;
|
||||
uint8_t pa_sync;
|
||||
uint16_t pa_interval;
|
||||
uint8_t num_subgroups;
|
||||
struct bt_bass_cp_subgroup subgroups[0];
|
||||
} __packed;
|
||||
|
||||
struct bt_bass_cp_broadcase_code {
|
||||
uint8_t opcode;
|
||||
uint8_t src_id;
|
||||
uint8_t broadcast_code[16];
|
||||
} __packed;
|
||||
|
||||
struct bt_bass_cp_rem_src {
|
||||
uint8_t opcode;
|
||||
uint8_t src_id;
|
||||
} __packed;
|
||||
|
||||
union bt_bass_cp {
|
||||
uint8_t opcode;
|
||||
struct bt_bass_cp_scan_stop scan_stop;
|
||||
struct bt_bass_cp_scan_start scan_start;
|
||||
struct bt_bass_cp_add_src add_src;
|
||||
struct bt_bass_cp_mod_src mod_src;
|
||||
struct bt_bass_cp_broadcase_code broadcast_code;
|
||||
struct bt_bass_cp_rem_src rem_src;
|
||||
};
|
Loading…
Add table
Add a link
Reference in a new issue