Bluetooth: Basic Audio Profile

This document describes how to run Basic Audio Profile functionality which includes:

  • Capabilities and Endpoint discovery

  • Audio Stream Endpoint procedures

Commands

bap --help
Subcommands:
   init
   select_broadcast     :<stream>
   create_broadcast     :[preset <preset_name>] [enc <broadcast_code>]
   start_broadcast      :
   stop_broadcast       :
   delete_broadcast     :
   broadcast_scan       :<on, off>
   accept_broadcast     :0x<broadcast_id>
   sync_broadcast       :0x<bis_index> [[[0x<bis_index>] 0x<bis_index>] ...]
   stop_broadcast_sink  :Stops broadcast sink
   term_broadcast_sink  :
   discover             :[dir: sink, source]
   config               :<direction: sink, source> <index> [loc <loc_bits>] [preset <preset_name>]
   stream_qos           :interval [framing] [latency] [pd] [sdu] [phy] [rtn]
   qos                  :Send QoS configure for Unicast Group
   enable               :[context]
   stop
   print_ase_info       :Print ASE info for default connection
   metadata             :[context]
   start
   disable
   release
   list
   select_unicast       :<stream>
   preset               :<sink, source, broadcast> [preset]
   send                 :Send to Audio Stream [data]
   start_sine           :Start sending a LC3 encoded sine wave
   stop_sine            :Stop sending a LC3 encoded sine wave
   set_location         :<direction: sink, source> <location bitmask>
   set_context          :<direction: sink, source><context bitmask> <type:
                         supported, available>
Table 22 State Machine Transitions

Command

Depends

Allowed States

Next States

init

none

any

none

discover

init

any

any

config

discover

idle/codec-configured/qos-configured

codec-configured

qos

config

codec-configured/qos-configured

qos-configured

enable

qos

qos-configured

enabling

[start]

enable

enabling

streaming

disable

enable

enabling/streaming

disabling

[stop]

disable

disabling

qos-configure/idle

release

config

any

releasing/codec-configure/idle

list

none

any

none

select_unicast

none

any

none

connect

discover

idle/codec-configured/qos-configured

codec-configured

send

enable

streaming

none

Example Central

Connect and establish a stream:

uart:~$ bt init
uart:~$ bap init
uart:~$ bt connect <address>
uart:~$ gatt exchange-mtu
uart:~$ bap discover sink
uart:~$ bap config sink 0
uart:~$ bap qos
uart:~$ bap enable

Or using connect command:

uart:~$ bt init
uart:~$ bap init
uart:~$ bt connect <address>
uart:~$ gatt exchange-mtu
uart:~$ bap discover sink
uart:~$ bap connect sink 0

Disconnect and release:

uart:~$ bap disable
uart:~$ bap release

Example Peripheral

Listen:

uart:~$ bt init
uart:~$ bap init
uart:~$ bt advertise on

Server initiated disable and release:

uart:~$ bap disable
uart:~$ bap release

Example Broadcast Source

Create and establish a broadcast source stream:

uart:~$ bap init
uart:~$ bap create_broadcast
uart:~$ bap start_broadcast

Stop and release a broadcast source stream:

uart:~$ bap stop_broadcast
uart:~$ bap delete_broadcast

Example Broadcast Sink

Scan for and establish a broadcast sink stream:

uart:~$ bap init
uart:~$ bap broadcast_scan on
Found broadcaster with ID 0xB91CD4
uart:~$ bap accept_broadcast 0xB91CD4
PA syncing to broadcaster
Broadcast scan was terminated: 0
PA synced to broadcaster with ID 0xB91CD4 as sink 0x2000d09c
Sink 0x2000d09c is set as default
Sink 0x2000d09c is ready to sync without encryption
Received BASE from sink 0x2000d09c:
Subgroup[0]:
codec 0x06 cid 0x0000 vid 0x0000 count 4
data #0: type 0x01 len 1
data #1: type 0x02 len 1
data #2: type 0x03 len 4
00000000: 00 00 00                                         |...              |
data #3: type 0x04 len 2
00000000: 28                                               |(                |
meta #0: type 0x02 len 2
BIS[0] index 0x01
[0]: 0x01
Possible indexes: 0x01
uart:~$ bap sync_broadcast 0x01

Stop and release a broadcast sink stream:

uart:~$ bap stop_broadcast_sink
uart:~$ bap term_broadcast_sink

Init

The init command register local PAC records which are necessary to be able to configure stream and properly manage capabilities in use.

Table 23 State Machine Transitions

Depends

Allowed States

Next States

none

any

none

uart:~$ bap init

Discover PAC(s) and ASE(s)

Once connected the discover command discover PAC records and ASE characteristics representing remote endpoints.

Table 24 State Machine Transitions

Depends

Allowed States

Next States

init

any

any

Note

Use command gatt exchange-mtu to make sure the MTU is configured properly.

uart:~$ gatt exchange-mtu
Exchange pending
Exchange successful
uart:~$ bap discover [type: sink, source]
uart:~$ bap discover sink
cap 0x8175940 type 0x01
codec 0x06 cid 0x0000 vid 0x0000 count 4
data #0: type 0x01 len 1
00000000: 3f                                             |?                |
data #1: type 0x02 len 1
00000000: 03                                             |.                |
data #2: type 0x03 len 1
00000000: 03                                             |.                |
data #3: type 0x04 len 4
00000000: 1e 00 f0 00                                    |....             |
meta #0: type 0x01 len 2
00000000: 06 00                                          |..               |
meta #1: type 0x02 len 2
00000000: ff 03                                          |..               |
ep 0x81754e0
ep 0x81755d4
Discover complete: err 0

Select preset

The preset command can be used to either print the default preset configuration or set a different one, it is worth noting that it doesn’t change any stream previously configured.

uart:~$ bap preset <sink, source, broadcast> [preset]
uart:~$ bap preset sink
16_2_1
codec 0x06 cid 0x0000 vid 0x0000 count 4
data #0: type 0x01 len 1
data #1: type 0x02 len 1
data #2: type 0x03 len 4
00000000: 01 00 00                                         |...              |
data #3: type 0x04 len 2
00000000: 28                                               |(                |
meta #0: type 0x02 len 2
00000000: 06                                               |.                |
QoS: interval 10000 framing 0x00 phy 0x02 sdu 40 rtn 2 latency 10 pd 40000

uart:~$ bap preset sink 32_2_1
32_2_1
codec 0x06 cid 0x0000 vid 0x0000 count 4
data #0: type 0x01 len 1
data #1: type 0x02 len 1
data #2: type 0x03 len 4
00000000: 01 00 00                                         |...              |
data #3: type 0x04 len 2
00000000: 50                                               |P                |
meta #0: type 0x02 len 2
00000000: 06                                               |.                |
QoS: interval 10000 framing 0x00 phy 0x02 sdu 80 rtn 2 latency 10 pd 40000

Configure Codec

The config command attempts to configure a stream for the given direction using a preset codec configuration which can either be passed directly or in case it is omitted the default preset is used.

Table 25 State Machine Transitions

Depends

Allowed States

Next States

discover

idle/codec-configured/qos-configured

codec-configured

uart:~$ bap config <direction: sink, source> <index> [loc <loc_bits>] [preset <preset_name>]
uart:~$ bap config sink 0
ASE Codec Config: conn 0x8173800 ep 0x81754e0 cap 0x816a360
codec 0x06 cid 0x0000 vid 0x0000 count 3
data #0: type 0x01 len 1
00000000: 02                                             |.                |
data #1: type 0x02 len 1
00000000: 01                                             |.                |
data #2: type 0x04 len 2
00000000: 28 00                                          |(.               |
meta #0: type 0x02 len 2
00000000: 02 00                                          |..               |
ASE Codec Config stream 0x8179e60
Default ase: 1
ASE config: preset 16_2_1

Configure Stream QoS

The stream_qos Sets a new stream QoS.

uart:~$ bap stream_qos <interval> [framing] [latency] [pd] [sdu] [phy] [rtn]
uart:~$ bap stream_qos 10

Configure QoS

The qos command attempts to configure the stream QoS using the preset configuration, each individual QoS parameter can be set with use optional parameters.

Table 26 State Machine Transitions

Depends

Allowed States

Next States

config

qos-configured/codec-configured

qos-configured

uart:~$ bap qos

Enable

The enable command attempts to enable the stream previously configured, if the remote peer accepts then the ISO connection procedure is also initiated.

Table 27 State Machine Transitions

Depends

Allowed States

Next States

qos

qos-configured

enabling

uart:~$ bap enable [context]
uart:~$ bap enable Media

Start

The start command is only necessary when acting as a sink as it indicates to the source the stack is ready to start receiving data.

Table 28 State Machine Transitions

Depends

Allowed States

Next States

enable

enabling

streaming

uart:~$ bap start

Disable

The disable command attempts to disable the stream previously enabled, if the remote peer accepts then the ISO disconnection procedure is also initiated.

Table 29 State Machine Transitions

Depends

Allowed States

Next States

enable

enabling/streaming

disabling

uart:~$ bap disable

Stop

The stop command is only necessary when acting as a sink as it indicates to the source the stack is ready to stop receiving data.

Table 30 State Machine Transitions

Depends

Allowed States

Next States

disable

disabling

qos-configure/idle

uart:~$ bap stop

Release

The release command releases the current stream and its configuration.

Table 31 State Machine Transitions

Depends

Allowed States

Next States

config

any

releasing/codec-configure/idle

uart:~$ bap release

List

The list command list the available streams.

Table 32 State Machine Transitions

Depends

Allowed States

Next States

none

any

none

uart:~$ bap list
*0: ase 0x01 dir 0x01 state 0x01

Select Unicast

The select_unicast command set a unicast stream as default.

Table 33 State Machine Transitions

Depends

Allowed States

Next States

none

any

none

uart:~$ bap select <ase>
uart:~$ bap select 0x01
Default stream: 1

To select a broadcast stream:

uart:~$ bap select 0x01 broadcast
Default stream: 1 (broadcast)

Send

The send command sends data over BAP Stream.

Table 34 State Machine Transitions

Depends

Allowed States

Next States

enable

streaming

none

uart:~$ bap send [count]
uart:~$ bap send
Audio sending...