What Was Missing in Parts 1–3
The first three parts covered roles, the LC3 codec, and the streaming procedures. But the spec also defines 14 standardized audio topology configurations — numbered from 1 to 14 — that tell you exactly which CISes, ASEs, and channel allocations are needed for every common real-world use case (mono earbud, stereo earbuds, stereo call headset, bilateral hearing aids, etc.).
This part also covers GAP connection requirements — advertising intervals, scan windows, connection intervals for fast discovery and stream setup — and security requirements, which mandate encryption and bonding before any GATT operation on PACS, ASCS, or BASS.
Key Terms
Part A — Unicast Audio Configurations (1–11)
The spec defines 11 unicast audio configurations. They cover every combination of: how many servers are involved, how many CISes, which directions audio flows, and how many channels each ASE carries. The key variables are:
1 server (one earbud) or 2 servers (left + right earbud independently)
Unidirectional (audio one way only) or Bidirectional (call audio — mic + speaker)
1 channel per ASE (one LC3 codec frame) or 2 channels per ASE (two frames multiplexed)
| Config | Servers | CISes | Audio Direction | Channels | Typical Use Case | Requirement |
|---|---|---|---|---|---|---|
| 1 | 1 | 1 uni | Client → Server (Sink) | 1 | Mono earbud receiving audio | Mandatory |
| 2 | 1 | 1 uni | Server → Client (Source) | 1 | Mono microphone sending audio | Mandatory |
| 3 | 1 | 1 bi | Both directions (Sink + Source) | 1+1 | Mono call headset | Cond. |
| 4 | 1 | 1 uni | Client → Server (Sink) | 2 | Stereo in one earbud (FL+FR multiplexed) | Cond. |
| 5 | 1 | 1 bi | Both (2-ch Sink + 1-ch Source) | 2+1 | Stereo headset with mono mic | Cond. |
| 6(i) | 1 | 2 uni | Client → Server (2 Sink ASEs) | 1+1 | Stereo on 1 server, separate CIS per channel | Cond. |
| 6(ii) | 2 | 2 uni | Client → Server 1 (FL) + Server 2 (FR) | 1 each | True wireless stereo earbuds (most common) | Mandatory* |
| 7(i) | 1 | 2 uni | Both directions (separate CISes) | 1+1 | Headset, call, separate CIS each way | Cond. |
| 7(ii) | 2 | 2 uni | Server 1 Sink, Server 2 Source | 1 each | TWS earbuds, call, right ear mic | Cond. |
| 8(i) | 1 | 1 bi + 1 uni | 2-ch Sink + 1-ch Source | 2+1 | Stereo headset + mono mic (2 CISes) | Cond. |
| 8(ii) | 2 | 1 bi + 1 uni | Srv1 bi-dir + Srv2 Sink | 1+1+1 | TWS + call, one ear has mic | Cond. |
| 9(i) | 1 | 2 uni | Server → Client (2 Source ASEs) | 1+1 | Stereo mic on one device | Cond. |
| 9(ii) | 2 | 2 uni | Server 1 Source + Server 2 Source | 1 each | Two mics (e.g. bilateral HA TX to phone) | Cond. |
| 10 | 1 | 1 uni | Server → Client (Source) | 2 | Stereo mic, multiplexed in one CIS | Cond. |
| 11(i) | 1 | 2 bi | 2-ch Sink + 2-ch Source | 4 total | Full stereo call, both directions | Cond. |
| 11(ii) | 2 | 2 bi | Both servers: Sink + Source each | 1+1 each | TWS stereo call, both ears have mic | Cond. |
* Config 6(ii) is mandatory for the Unicast Client and mandatory for each Unicast Server that supports the Audio Sink role with >1 Audio Location.
The Most Important Configurations Explained
One client, one server, one unidirectional CIS, one channel. Phone sends audio to a mono earbud. This is the baseline configuration every device must support.
| Unicast Client (Audio Source) |
1 CIS (unidirectional)
⟶
1 Sink ASE, 1 channel
|
Unicast Server (Audio Sink) |
This is the standard TWS earbud configuration. One client connects to two servers (left and right earbud independently). Each server gets one CIS carrying one channel. The two servers use different Audio Locations — one is Front Left, the other is Front Right.
| Unicast Client (Phone) |
CIS 1 → FL
⟶
|
Server 1 (Left Earbud) Sink ASE, Audio_Channel_Allocation = FL |
|
CIS 2 → FR
⟶
|
Server 2 (Right Earbud) Sink ASE, Audio_Channel_Allocation = FR |
One bidirectional CIS. The server is both an Audio Sink (receives phone audio) and an Audio Source (microphone). This is a phone call through a mono Bluetooth headset. The single CIS carries audio in both directions simultaneously.
| Unicast Client |
1 bidirectional CIS
⟵⟶
Sink ASE + Source ASE
|
Unicast Server Audio Sink + Audio Source |
Two bidirectional CISes to one server. The server has two Sink ASEs (FL + FR audio in) and two Source ASEs (FL + FR mic out). This is the richest configuration — for example, a gaming headset that receives stereo game audio and sends stereo microphone capture back to the phone.
Part B — Broadcast Audio Configurations (12–14)
Broadcast configurations are simpler — there is no CIS, no ASE. The Broadcast Source configures the BASE structure to define how BISes carry channels.
One BIS, one audio channel. A mono broadcast. Audio_Channel_Allocation is optional — if absent, the channel has no assigned spatial location. Every Broadcast Source and Sink must support this.
Two BISes, each carrying one channel with different Audio_Channel_Allocation (e.g. BIS 1 = FL, BIS 2 = FR). A Broadcast Sink with two Audio Locations must support this. A sink that only supports mono can subscribe to just one BIS and receive one channel.
Two channels multiplexed into a single BIS (two LC3 frames per SDU). The Audio_Channel_Allocation LTV at BIS level has two bits set (FL and FR). The Broadcast Sink must support Audio_Channel_Counts ≥ 2 and two Sink Audio Locations to use this.
Config 13 — Stereo Broadcast (most common for headphones)
| Broadcast Source (TV / Phone) |
BIS 1 — FL channel
⟶⟶⟶
BIS 2 — FR channel
⟶⟶⟶
(one BIG, two BIS)
|
|
Part C — GAP Connection Requirements
BAP defines specific GAP procedures and parameter values that devices must follow. These matter a lot in practice — wrong advertising intervals cause slow pairing; wrong connection intervals slow down GATT discovery and stream setup.
Peripheral (Unicast Server / Broadcast Sink / Scan Delegator)
When a Peripheral is ready for a new connection (non-bonded scenario), it must enter General or Limited Discoverable mode. It must use Extended Advertising PDUs and include the ASCS/PACS/BASS Service UUIDs in the advertising data so that scanning Centrals can identify it as a BAP device.
| Advertising Phase | Advertising Interval | When |
|---|---|---|
| Fast (quicker connection) | 20 ms – 30 ms | First 30 seconds after starting advertising |
| Reduced power | 150 ms | After 30 seconds with no connection |
Central (Unicast Client / Broadcast Assistant)
A Central scans for Peripherals using General or Limited Discovery. It uses the General Connection Establishment procedure (not the Auto procedure) when it wants to filter devices based on the Announcement Type in the Service Data AD type.
| Scan Phase | Scan Interval | Scan Window |
|---|---|---|
| Fast (quicker connection) | 30 ms – 60 ms | 30 ms |
| Reduced power | 1.28 s | 11.25 ms |
Connection Intervals — Short During Setup, Relaxed After
This is a detail often missed but critical for stream setup speed. During service discovery and stream configuration, the connection interval must be short so GATT operations complete fast. After setup, it can be relaxed to save power.
| Min interval | 7.5 ms or 10 ms |
| Max interval | 30 ms |
| Range | 50 ms – 70 ms |
Bonded Device Reconnection
After bonding, a Central must start encryption immediately after each reconnection to verify the bond. If encryption fails (the bond no longer exists on the server side), the Central must re-bond and redo service discovery before using any BAP services. This is important for your implementation — never skip the encryption step even if you think the bond is valid.
Part D — Security Requirements
Security is non-negotiable in BAP. Every GATT characteristic in PACS, ASCS, and BASS requires authentication and encryption before it can be accessed.
| Role | Transport | Required Security Mode | Encryption Key |
|---|---|---|---|
| Unicast Server / Client | LE | Security Mode 1, Level 2 | 128-bit, from LE SC / OOB / CTKD |
| Broadcast Sink / Scan Delegator | LE | Security Mode 1, Level 2 | 128-bit |
| Broadcast Source (unencrypted stream) | LE Broadcast | Security Mode 3, Level 1 | No encryption |
| Broadcast Source (encrypted stream) | LE Broadcast | Security Mode 3, Level 2 | Broadcast_Code (16 bytes) |
| Unicast Server / Client (BR/EDR) | BR/EDR | Security Mode 4, Level 2 | BR/EDR SC or CTKD |
What Security Mode 1 Level 2 Actually Means
Privacy (Resolvable Private Addresses)
The Privacy feature (using Resolvable Private Addresses, RPAs) is recommended for all Peripheral and Central roles. The device rotates its BLE address periodically so it cannot be tracked. Devices using Privacy must distribute their Identity Address (IA) and Identity Resolving Key (IRK) during bonding so bonded peers can resolve the address.
For Broadcast Sources, the recommendation from Section 6.1.3 applies instead: keep the advertising address stable for the lifetime of the BIG, or use a non-resolvable private address (not resolvable, because resolvable RPAs require all sinks to know the IRK).
BlueZ — Checking Encryption and Bond Status
/* Check if a connection is encrypted and bonded * using BlueZ D-Bus interface org.bluez.Device1 */ #include <gio/gio.h> void check_device_security(GDBusConnection *conn, const char *device_path) { GVariant *paired, *trusted, *services_resolved; GError *error = NULL; /* Get device properties from org.bluez.Device1 */ paired = g_dbus_connection_call_sync(conn, "org.bluez", device_path, "org.freedesktop.DBus.Properties", "Get", g_variant_new("(ss)", "org.bluez.Device1", "Paired"), NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error); services_resolved = g_dbus_connection_call_sync(conn, "org.bluez", device_path, "org.freedesktop.DBus.Properties", "Get", g_variant_new("(ss)", "org.bluez.Device1", "ServicesResolved"), NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error); /* BAP requires: Paired=true AND ServicesResolved=true * before accessing PACS/ASCS/BASS characteristics. * BlueZ handles SM1L2 (encryption) automatically after pairing. * Only read/write characteristics after ServicesResolved=true. */ } /* You can also check via bluetoothctl: * [bluetooth]# info AA:BB:CC:DD:EE:FF * Paired: yes * Trusted: yes * Connected: yes * LegacyPairing: no ← must be "no" (LE Secure Connections) * ServicesResolved: yes ← safe to access GATT */
Complete Implementation Checklist
Here is a consolidated checklist based on all four parts of this tutorial series:
| Area | What to implement |
|---|---|
| Roles | At least one of the 6 BAP roles. Broadcast Sink always needs Scan Delegator. |
| Services | PACS Server (Unicast Server + Broadcast Sink), ASCS Server (Unicast Server), BASS Server (Scan Delegator). Client counterparts for each corresponding client role. |
| Codec | LC3 mandatory. Support at least 16_2 (32 kbps) and 24_2 (48 kbps). Expose in PAC records using LTV structures. |
| QoS | Support 16_2_1 and 16_2_2 at minimum. Expose Presentation_Delay range in ASE codec configured state. |
| Audio Config | Config 1 (mandatory). Config 2 (mandatory). Config 6(ii) mandatory for TWS devices. |
| GAP | Extended Advertising with Service UUIDs. Fast adv interval (20-30 ms) first 30s, then 150 ms. Short connection interval (max 30 ms) during setup. Relax to 50-70 ms during streaming. |
| Security | Security Mode 1 Level 2 (LE). LE Secure Connections (128-bit key). Bondable mode mandatory. Encrypt on every reconnection. Privacy (RPA) recommended. |
BAP Tutorial Complete
You’ve now covered the full Basic Audio Profile spec across four parts. The natural next step is the Coordinated Audio Profile (CAP), which builds directly on BAP to coordinate audio across multiple devices — like keeping both earbuds in sync when accepting a call or switching sources.
