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

audio --help
Subcommands:
   init                 :
   discover             :[type: sink, source]
   preset               :[preset]
   config               :<direction: sink, source> <index> [codec] [preset]
   select_broadcast     :<stream>
   create_broadcast     :[codec] [preset]
   start_broadcast      :
   stop_broadcast       :
   delete_broadcast     :
   broadcast_scan       :<on, off>
   accept_broadcast     :0x<broadcast_id>
   sync_broadcast       :0x<bis_bitfield>
   stop_broadcast_sink  :Stops broadcast sink
   term_broadcast_sink  :
   qos                  :[preset] [interval] [framing] [latency] [pd] [sdu] [phy] [rtn]
   enable               :
   metadata             :[context]
   start                :
   disable              :
   stop                 :
   release              :
   list                 :
   select_unicast       :<stream>
   connect              :<direction: sink, source> <index>  [codec] [preset]
   send                 :Send to Audio Stream [data]
Table 8 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:~$ audio init
uart:~$ bt connect <address>
uart:~$ gatt exchange-mtu
uart:~$ audio discover sink
uart:~$ audio config sink 0
uart:~$ audio qos
uart:~$ audio enable

Or using connect command:

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

Disconnect and release:

uart:~$ audio disable
uart:~$ audio release

Example Peripheral

Listen:

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

Server initiated disable and release:

uart:~$ audio disable
uart:~$ audio release

Example Broadcast Source

Create and establish a broadcast source stream:

uart:~$ audio init
uart:~$ audio create_broadcast
uart:~$ audio start_broadcast

Stop and release a broadcast source stream:

uart:~$ audio stop_broadcast
uart:~$ audio delete_broadcast

Example Broadcast Sink

Scan for and establish a broadcast sink stream:

uart:~$ audio init
uart:~$ audio broadcast_scan on
Found broadcaster with ID 0xB91CD4
uart:~$ audio 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
audio sync_broadcast 0x01

Stop and release a broadcast sink stream:

uart:~$ audio stop_broadcast_sink
uart:~$ audio 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 9 State Machine Transitions

Depends

Allowed States

Next States

none

any

none

uart:~$ audio init

Discover PAC(s) and ASE(s)

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

Table 10 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:~$ audio discover [type: sink, source]
uart:~$ audio 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:~$ audio preset [preset]
uart:~$ audio preset
16_2_1
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                                          |..               |
QoS: dir 0x02 interval 10000 framing 0x00 phy 0x02 sdu 40 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 11 State Machine Transitions

Depends

Allowed States

Next States

discover

idle/codec-configured/qos-configured

codec-configured

uart:~$ audio config <direction: sink, source> <index> [codec] [preset]
uart:~$ audio 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 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 12 State Machine Transitions

Depends

Allowed States

Next States

config

qos-configured/codec-configured

qos-configured

uart:~$ audio qos [preset] [interval] [framing] [latency] [pd] [sdu] [phy] [rtn]
uart:~$ audio qos
ASE config: preset 16_2_1

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 13 State Machine Transitions

Depends

Allowed States

Next States

qos

qos-configured

enabling

uart:~$ audio enable

Start [sink only]

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 14 State Machine Transitions

Depends

Allowed States

Next States

enable

enabling

streaming

uart:~$ audio 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 15 State Machine Transitions

Depends

Allowed States

Next States

enable

enabling/streaming

disabling

uart:~$ audio disable

Stop [sink only]

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 16 State Machine Transitions

Depends

Allowed States

Next States

disable

disabling

qos-configure/idle

uart:~$ audio stop

Release

The release command releases the current stream and its configuration.

Table 17 State Machine Transitions

Depends

Allowed States

Next States

config

any

releasing/codec-configure/idle

uart:~$ audio release

List

The list command list the available streams.

Table 18 State Machine Transitions

Depends

Allowed States

Next States

none

any

none

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

Select Unicast

The select_unicast command set a unicast stream as default.

Table 19 State Machine Transitions

Depends

Allowed States

Next States

none

any

none

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

To select a broadcast stream:

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

Connect

The connect command combines config, qos and enable commands in one so it can be used to quickly configure and enable a stream.

Table 20 State Machine Transitions

Depends

Allowed States

Next States

discover

idle/codec-configured/qos-configured

streaming

uart:~$ audio connect <direction: sink, source> <index> [codec] [preset]
uart:~$ audio connect sink 0
ASE Codec Config: conn 0x17ca40 ep 0x17f860 cap 0x19f6a0
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 0x1851c0
Default ase: 1
ASE config: preset 16_2_1
ASE Codec Reconfig: stream 0x1851c0 cap 0x19f6a0
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                                            |..               |
QoS: stream 0x1851c0
QoS: dir 0x02 interval 10000 framing 0x00 phy 0x02 sdu 40 rtn 2 latency 10 pd 40000
Start: stream 0x1851c0

Send

The send command sends data over Audio Stream.

Table 21 State Machine Transitions

Depends

Allowed States

Next States

enable

streaming

none

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