Bluetooth: Broadcast Audio Scan Service

This document describes how to run the BASS functionality, both as a client and as a server. Note that in the examples below, some lines of debug have been removed to make this shorter and provide a better overview.

The client is responsible for offloading scan for a resource restricted device, such that scanning does not drain the battery. The client shall support scanning for periodic advertisements, and the server shall support synchronizing to periodic advertisements. They may both optionally support the periodic advertisements synchronization transfer (PAST) protocol.

Broadcast Audio Scan Client (Scan Offloader)

The BASS client will typically be phones or laptops. The client scans for periodic advertisements and transfer information to the server.

It is necessary to have BT_DEBUG_BASS_CLIENT enabled for using the BASS client interactively.

Using the BASS client

When the Bluetooth stack has been initialized (bt init), and a device has been connected, the BASS client can discover BASS on the connected device calling bass_client discover, which will start a discovery for the BASS UUIDs and store the handles, and optionally subscribe to all notifications (default is to subscribe to all).

Since a server may have multiple included Volume Offset or Audio Input service instances, some of the client commands commands will take an index (starting from 0) as input.

bass_client - Bluetooth BASS client shell commands
Subcommands:
   discover        :Discover BASS on the server
   scan_start      :Start scanning for broadcasters
   scan_stop       :Stop scanning for BISs
   add_src         :Add a source <address: XX:XX:XX:XX:XX:XX> <type:
                    public/random> <adv_sid> <sync_pa> <broadcast_id>
                    [<pa_interval>] [<sync_bis>] [<metadata>]
   mod_src         :Set sync <src_id> <sync_pa> [<pa_interval>] [<sync_bis>]
                    [<metadata>]
   broadcast_code  :Send a space separated broadcast code of up to 16 bytes
                    <src_id> [broadcast code]
   rem_src         :Remove a source <src_id>
   read_state      :Remove a source <index>

Example usage

Setup

uart:~$ bt init
uart:~$ bt connect xx:xx:xx:xx:xx:xx public

When connected

Start scanning for periodic advertisements for a server:

Note

The BASS client will not actually start scanning for periodic advertisements, as that feature is still, at the time of writing, not implemented.

uart:~$ bass_client discover
<dbg> bt_bass_client.char_discover_func: Found 1 BASS receive states
<dbg> bt_bass_client.read_recv_state_cb: src_id 0, PA 0, BIS 0, encrypt 0, addr 00:00:00:00:00:00 (public), sid 0, metadata_len 0
uart:~$ bass_client scan_start
<dbg> bt_bass_client.write_func: err: 0x00, handle 0x001e

Adding a source to the receive state:

uart:~$ bass_client add_src 11:22:33:44:55:66 public 5 1 1
BASS recv state: src_id 0, addr 11:22:33:44:55:66 (public), sid 5, sync_state 1, encrypt_state 000000000000000000000000000000000
     [0]: BIS sync 0, metadata_len 0

BASS Server

The BASS server typically resides on devices that have inputs or outputs.

It is necessary to have BT_DEBUG_BASS enabled for using the BASS server interactively.

Using the BASS server

The BASS server can currently only set the sync state of a receive state, but does not actually support syncing with periodic advertisements yet.

bass --help
bass - Bluetooth BASS shell commands
Subcommands:
   init    :Initialize the service and register callbacks
   synced  :Set server scan state <src_id> <pa_synced> <bis_syncs> <enc_state>

Example Usage

Setup

uart:~$ bt init
uart:~$ bt advertise on
Advertising started

When connected

Set sync state for a source:

uart:~$ bass synced 0 1 3 0