Previous Bluetooth audio sent mono or stereo to a single sink and left it to figure out rendering. BLE Audio optimises this by telling each sink which spatial channel it should render, using Audio Location. Because LC3 is a single-channel codec, multiple channels are multiplexed into one packet via Channel Allocation — enabling true surround sound over Bluetooth.
1. Audio Location — Spatial Routing
Each Acceptor declares which spatial channel(s) it renders. This allows the Initiator to send only the relevant audio stream to each sink — the left earbud only receives the left channel, saving battery on both devices.
| Audio Location | Bitmap Value | Bit Position | Typical Device |
|---|---|---|---|
| Front Left | 0x00000001 | Bit 1 | Left earbud / left hearing aid |
| Front Right | 0x00000002 | Bit 2 | Right earbud / right hearing aid |
| Front Centre | 0x00000004 | Bit 3 | Centre soundbar / headphone (stereo folded) |
| LFE / Front Woofer | 0x00000008 | Bit 4 | Subwoofer |
| Back Left | 0x00000010 | Bit 5 | Rear-left surround speaker |
| Back Right | 0x00000010 | Bit 6 | Rear-right surround speaker |
| Prohibited | 0x00000000 | — | All-zero is NOT allowed — every Acceptor must declare at least one location |
|
📱
Phone (Initiator)
Stereo audio source
|
CIS 0 → Front Left only (0x01)
↗↘
CIS 1 → Front Right only (0x02)
|
|
2. Why Channel Allocation Is Needed (LC3 Is Single-Channel)
|
SBC (Bluetooth Classic)
Supports Joint Stereo — encodes difference between L and R channels. Efficient because L and R are often highly correlated.
But: max 2 channels. No surround. Codec locked to stereo or mono concepts. |
LC3 (BLE Audio) — Single-Channel Codec
Encodes each channel independently. Frames concatenated in one PDU.
LC3 is so efficient that joint stereo offers minimal advantage over two separate streams. Benefit: supports any number of channels — 2.0, 5.1, 7.1+ — all multiplexed into one isochronous PDU using Channel Allocation. |
3. Media Packet — Multiplexing Multiple LC3 Frames
LC3 frames for all channels are arranged in ascending order of Audio Location bit value and packed into a single Media Packet, which rides inside one isochronous PDU.
|
→ |
LC3
Encoder (×5) |
→ |
MEDIA PACKET (single Isochronous PDU)
CF_1
Front
Left 0x01
CF_2
Front
Right 0x02
CF_3
Front
Centre 0x04
CF_4
Back
Left 0x10
CF_5
Back
Right 0x20
Frames sorted in ascending Audio Location bit order — no header needed
|
→ Air |
Audio
Stream |
Audio_Channel_Location LTV in PAC records. Block count is set via Codec_Frame_Blocks_Per_SDU LTV. Both are negotiated at stream setup — the receiver knows the layout before the first packet arrives.4. BlueZ: PAC Record — Audio Location & Channel Allocation Config
Audio_Channel_Allocation LTV (type 0x03) into the ASE Codec Configuration during stream setup. The receiver parses this once and knows exactly which LC3 frame in every subsequent PDU corresponds to Front Left, Right, etc. — no per-packet parsing needed.