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:
Emil Gydesen 2021-11-24 19:23:07 +01:00 committed by Anas Nashif
commit 742eac6214
6 changed files with 1633 additions and 0 deletions

View 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_ */

View file

@ -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_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_SOURCE broadcast_source.c)
zephyr_library_sources_ifdef(CONFIG_BT_AUDIO_BROADCAST_SINK broadcast_sink.c) zephyr_library_sources_ifdef(CONFIG_BT_AUDIO_BROADCAST_SINK broadcast_sink.c)
zephyr_library_sources_ifdef(CONFIG_BT_BASS bass.c)

View file

@ -32,5 +32,6 @@ rsource "Kconfig.vcs"
rsource "Kconfig.mics" rsource "Kconfig.mics"
rsource "Kconfig.csis" rsource "Kconfig.csis"
rsource "Kconfig.mcs" rsource "Kconfig.mcs"
rsource "Kconfig.bass"
endif # BT_AUDIO endif # BT_AUDIO

View 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

File diff suppressed because it is too large Load diff

View 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;
};