.. _bluetooth_shell_audio: 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 ******** .. code-block:: console audio --help Subcommands: init select_broadcast : create_broadcast :[codec] [preset] start_broadcast : stop_broadcast : delete_broadcast : broadcast_scan : accept_broadcast :0x sync_broadcast :0x stop_broadcast_sink :Stops broadcast sink term_broadcast_sink : discover :[type: sink, source] preset :[preset] config : [codec] [preset] qos :[preset] [interval] [framing] [latency] [pd] [sdu] [phy] [rtn] enable metadata :[context] start disable stop release list connect : [codec] [preset] select_unicast : send :Send to Audio Stream [data] .. csv-table:: State Machine Transitions :header: "Command", "Depends", "Allowed States", "Next States" :widths: auto "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: .. code-block:: console uart:~$ bt init uart:~$ audio init uart:~$ bt connect
uart:~$ gatt exchange-mtu uart:~$ audio discover sink uart:~$ audio config sink 0 uart:~$ audio qos uart:~$ audio enable Or using connect command: .. code-block:: console uart:~$ bt init uart:~$ audio init uart:~$ bt connect
uart:~$ gatt exchange-mtu uart:~$ audio discover sink uart:~$ audio connect sink 0 Disconnect and release: .. code-block:: console uart:~$ audio disable uart:~$ audio release Example Peripheral ****************** Listen: .. code-block:: console uart:~$ bt init uart:~$ audio init uart:~$ bt advertise on Server initiated disable and release: .. code-block:: console uart:~$ audio disable uart:~$ audio release Example Broadcast Source ************************ Create and establish a broadcast source stream: .. code-block:: console uart:~$ audio init uart:~$ audio create_broadcast uart:~$ audio start_broadcast Stop and release a broadcast source stream: .. code-block:: console uart:~$ audio stop_broadcast uart:~$ audio delete_broadcast Example Broadcast Sink ************************ Scan for and establish a broadcast sink stream: .. code-block:: console 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: .. code-block:: console uart:~$ audio stop_broadcast_sink uart:~$ audio term_broadcast_sink Init **** The :code:`init` command register local PAC records which are necessary to be able to configure stream and properly manage capabilities in use. .. csv-table:: State Machine Transitions :header: "Depends", "Allowed States", "Next States" :widths: auto "none","any","none" .. code-block:: console uart:~$ audio init Discover PAC(s) and ASE(s) ************************** Once connected the :code:`discover` command discover PAC records and ASE characteristics representing remote endpoints. .. csv-table:: State Machine Transitions :header: "Depends", "Allowed States", "Next States" :widths: auto "init","any","any" .. note:: Use command :code:`gatt exchange-mtu` to make sure the MTU is configured properly. .. code-block:: console 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 :code:`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. .. code-block:: console 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 :code:`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. .. csv-table:: State Machine Transitions :header: "Depends", "Allowed States", "Next States" :widths: auto "discover","idle/codec-configured/qos-configured","codec-configured" .. code-block:: console uart:~$ audio config [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 :code:`qos` command attempts to configure the stream QoS using the preset configuration, each individual QoS parameter can be set with use optional parameters. .. csv-table:: State Machine Transitions :header: "Depends", "Allowed States", "Next States" :widths: auto "config","qos-configured/codec-configured","qos-configured" .. code-block:: console uart:~$ audio qos [preset] [interval] [framing] [latency] [pd] [sdu] [phy] [rtn] uart:~$ audio qos ASE config: preset 16_2_1 Enable ****** The :code:`enable` command attempts to enable the stream previously configured, if the remote peer accepts then the ISO connection procedure is also initiated. .. csv-table:: State Machine Transitions :header: "Depends", "Allowed States", "Next States" :widths: auto "qos","qos-configured","enabling" .. code-block:: console uart:~$ audio enable Start [sink only] ***************** The :code:`start` command is only necessary when acting as a sink as it indicates to the source the stack is ready to start receiving data. .. csv-table:: State Machine Transitions :header: "Depends", "Allowed States", "Next States" :widths: auto "enable","enabling","streaming" .. code-block:: console uart:~$ audio start Disable ******* The :code:`disable` command attempts to disable the stream previously enabled, if the remote peer accepts then the ISO disconnection procedure is also initiated. .. csv-table:: State Machine Transitions :header: "Depends", "Allowed States", "Next States" :widths: auto "enable","enabling/streaming","disabling" .. code-block:: console uart:~$ audio disable Stop [sink only] **************** The :code:`stop` command is only necessary when acting as a sink as it indicates to the source the stack is ready to stop receiving data. .. csv-table:: State Machine Transitions :header: "Depends", "Allowed States", "Next States" :widths: auto "disable","disabling","qos-configure/idle" .. code-block:: console uart:~$ audio stop Release ******* The :code:`release` command releases the current stream and its configuration. .. csv-table:: State Machine Transitions :header: "Depends", "Allowed States", "Next States" :widths: auto "config","any","releasing/codec-configure/idle" .. code-block:: console uart:~$ audio release List **** The :code:`list` command list the available streams. .. csv-table:: State Machine Transitions :header: "Depends", "Allowed States", "Next States" :widths: auto "none","any","none" .. code-block:: console uart:~$ audio list *0: ase 0x01 dir 0x01 state 0x01 Select Unicast ************** The :code:`select_unicast` command set a unicast stream as default. .. csv-table:: State Machine Transitions :header: "Depends", "Allowed States", "Next States" :widths: auto "none","any","none" .. code-block:: console uart:~$ audio select uart:~$ audio select 0x01 Default stream: 1 To select a broadcast stream: .. code-block:: console uart:~$ audio select 0x01 broadcast Default stream: 1 (broadcast) Connect ******* The :code:`connect` command combines config, qos and enable commands in one so it can be used to quickly configure and enable a stream. .. csv-table:: State Machine Transitions :header: "Depends", "Allowed States", "Next States" :widths: auto "discover","idle/codec-configured/qos-configured","streaming" .. code-block:: console uart:~$ audio connect [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 :code:`send` command sends data over Audio Stream. .. csv-table:: State Machine Transitions :header: "Depends", "Allowed States", "Next States" :widths: auto "enable","streaming","none" .. code-block:: console uart:~$ audio send [count] uart:~$ audio send Audio sending...