Broadcast Audio Scan Service (BASS) — From Zero to Working Code

LE Audio Series · Part 1

Broadcast Audio Scan Service (BASS) — From Zero to Working Code

How hearing aids, earbuds and headsets offload their scanning job to your smartphone using a clean GATT service.

Bluetooth 5.2 · LE Audio · GATT Service · BlueZ 5.x

📚 This 3-part series covers:
Part 1 You are here — What BASS is, key roles, service architecture
Part 2 Broadcast Audio Scan Control Point — all 6 operations in depth
Part 3 Broadcast Receive State + BlueZ implementation walkthrough

1. The Problem BASS Solves

Picture this: you are at an airport and the public address system is broadcasting gate announcements over Bluetooth LE Audio. Your hearing aids want to pick up that broadcast automatically. To do that, they need to scan the air continuously for the broadcast source.

Scanning is expensive. The BLE radio draws significant current every time it listens. For a hearing aid with a tiny 13 mA battery, continuous scanning could drain it in a couple of hours. That is unacceptable.

Meanwhile, your smartphone sits in your pocket with a 4000 mAh battery and a fast Cortex-A processor. It can scan all day without breaking a sweat.

❌ Without BASS
  • Hearing aid scans continuously
  • Battery drains in hours
  • Device heats up
  • User experience suffers
✅ With BASS
  • Smartphone does the scanning
  • Hearing aid stays in sleep mode
  • Battery lasts the full day
  • Seamless, transparent to user

BASS (Broadcast Audio Scan Service) is the Bluetooth SIG’s standardised solution. It defines a GATT service that lets a power-constrained device (the server) ask a capable device (the client) to scan on its behalf, then hand over the discovered broadcast source information via GATT characteristics.

2. Key Concepts You Need to Know First

Before diving into BASS itself, let us quickly nail down the vocabulary. These terms come from the broader LE Audio / Bluetooth 5.2 ecosystem.

Term What it actually means
Broadcast Source Any device that streams audio using LE Isochronous Channels. Examples: TV, PA system, concert speaker rack, museum audio guide transmitter.
Broadcast_ID A 3-byte identifier that uniquely labels a specific broadcast. Think of it as the “channel number” for a particular audio stream.
Periodic Advertising (PA) A special type of BLE advertisement that repeats at fixed intervals. The Broadcast Source puts all stream metadata here. Before you can listen to audio, you must first sync to the PA.
BIG (Broadcast Isochronous Group) A container that groups one or more audio streams together. A concert hall might have a BIG with separate streams for left-channel and right-channel audio.
BIS (Broadcast Isochronous Stream) A single audio stream inside a BIG. Each BIS carries one channel of compressed audio (LC3 codec). A stereo broadcast has two BISes.
Broadcast_Code A 16-byte encryption key that unlocks an encrypted broadcast. If the venue only wants paying attendees to hear the audio, they distribute this key (e.g. printed on a ticket).
PA_Interval How often the Periodic Advertising repeats, measured in 1.25 ms units. Knowing this helps a device sync faster without having to scan for a long time.
PAST (Periodic Advertising Synchronisation Transfer) A procedure where one device that is already synced to a PA passes the sync information (SyncInfo) to another device via a BLE connection. BASS heavily relies on this.
SyncInfo Raw timing data that lets a device jump straight into synchronisation with a PA without scanning from scratch. Like giving someone the exact GPS coordinates instead of making them search the whole map.

3. The Three Roles in the BASS Ecosystem

📡
Broadcast Source
TV · Concert PA
Airport announcement
Museum audio guide
Streams PA + BIG + BISes
over BLE radio

One-way LE radio broadcast
PA train + BIG audio streams

BLE Connection (GATT)
← Notify: BRS updated
Write: CP operations →

SyncInfo via PAST (optional)

🎧
BASS Server
Hearing aid · Earbud
Headset · Cochlear implant
Exposes BASS GATT service
Wants to receive audio

📱
BASS Client
Smartphone · Smartwatch
Tablet · Laptop
Scans on behalf of server
Writes to CP characteristic
⚡ Important distinction: The BASS Server is the resource-constrained device that wants audio (e.g. hearing aid). It is the GATT server. The BASS Client is the powerful device (e.g. phone) that helps with scanning. This naming is deliberately flipped from what you might expect.

4. The Full BASS Flow Step by Step

Here is the complete workflow from “nothing connected” to “hearing aid streaming audio from a broadcast source”:

Step Who Acts What Happens
1 BASS Server (Hearing Aid) Advertises its BASS service UUID in connectable extended advertising packets. The phone discovers it and connects.
2 BASS Client (Phone) Discovers the BASS service and subscribes to notifications on the Broadcast Receive State characteristic.
3 BASS Client (Phone) Writes Remote Scan Started (0x01) to the Control Point. This tells the hearing aid “I am scanning for you now, you can stop scanning.”
4 BASS Client (Phone) Finds a broadcast source and writes Add Source (0x02) to the Control Point with all the broadcast details: address, Broadcast_ID, Advertising SID, and which BISes to sync to.
5 BASS Server (Hearing Aid) Uses the info to find and sync to the Periodic Advertising train (PA). Updates the Broadcast Receive State characteristic. Phone gets a notification.
6 BASS Server (Hearing Aid) Once synced to PA, attempts to synchronise to the BIG and join the selected BIS streams. Updates the Broadcast Receive State again.
7* BASS Client (Phone) [if encrypted] If the BIS is encrypted, the Broadcast Receive State will show Broadcast_Code required. The phone writes the key using Set Broadcast_Code (0x04).
8 BASS Server (Hearing Aid) Decrypts the BIS and streams audio. Broadcast Receive State now shows Decrypting. User hears audio. 🎵

5. The BASS GATT Service — Two Characteristics

BASS is declared as a Primary Service. There is exactly one BASS instance per server device. Inside it, there are two types of GATT characteristics:

BASS Primary Service (UUID: 0x184F)
Characteristic 1: Broadcast Audio Scan Control Point (UUID: 0x2BC0)
Properties Write, Write Without Response
Security Encryption required (bonded device)
Count Exactly 1 per server
Purpose Client writes commands here: start/stop scan, add/modify/remove source, provide Broadcast_Code
Characteristic 2: Broadcast Receive State (UUID: 0x2BC1)
Properties Read, Notify
Security Encryption required
Count One or more. The server should have at least as many instances as BIGs it can synchronise to simultaneously.
Purpose Server exposes sync state here. Client reads/subscribes to know: PA sync status, BIS sync status, encryption state, source identity.
💡 Why multiple Broadcast Receive State characteristics?
A high-end hearing aid might support syncing to 2 or 3 different BIGs at the same time (left ear, right ear, plus a speech enhancement stream). Each BIG gets its own Broadcast Receive State characteristic so the client can track them independently.

6. GATT Sub-procedure Requirements

When you implement the BASS server in your firmware, these GATT sub-procedures are the minimum you must support. The ATT bearer used is the standard Unenhanced ATT bearer (plain BLE connection).

GATT Sub-procedure Requirement Why it is needed
Write Characteristic Value Mandatory Client uses this to write CP operations. Server can send back ATT error responses.
Write Without Response Mandatory Faster CP writes, no ATT response. Server just ignores invalid packets silently.
Notifications Mandatory Server uses this to push Broadcast Receive State updates to the client whenever sync state changes.
Read Characteristic Descriptors Mandatory Client reads the Client Characteristic Configuration Descriptor (CCCD) to check notification status.
Write Characteristic Descriptors Mandatory Client writes to CCCD to enable/disable notifications on Broadcast Receive State.
Write Long Characteristic Value Conditional Required only if the Add Source operation is supported. Needed when CP write exceeds the ATT_MTU (23 bytes default).
🔒 Security note: Both characteristics require encryption. This means the phone must be bonded (paired and keys exchanged) with the hearing aid before it can read/write anything. You cannot use BASS over an unencrypted BLE connection.

7. Compatibility and Dependencies

Bluetooth Core Spec version Version 5.2 or later (BASS uses features introduced in 5.2)
Depends on other GATT services? No. BASS has no mandatory service dependencies.
Related profile Basic Audio Profile (BAP) — defines the Broadcast Source and the audio stream structure that BASS references.
Byte order Little-endian (LSO first) for all fields.
Transport No specific transport requirements. Works over both Unenhanced and Enhanced ATT bearers. If you need guaranteed notification delivery, Enhanced ATT (EATT) over L2CAP ECBF is recommended.

8. Quick UUIDs and Error Codes Reference

Item Value Notes
BASS Service UUID 0x184F 16-bit Bluetooth SIG assigned UUID
Control Point UUID 0x2BC0 Broadcast Audio Scan Control Point
Broadcast Receive State UUID 0x2BC1 Can have multiple instances
Error: Opcode Not Supported 0x80 ATT Application Error — unrecognised opcode
Error: Invalid Source_ID 0x81 ATT Application Error — Source_ID does not exist

📖 What’s next in Part 2?

We will take the Broadcast Audio Scan Control Point apart opcode by opcode. You will see the exact byte format of every operation, sequence diagrams showing how the phone and hearing aid exchange messages, and BlueZ GATT code snippets for writing each operation from your Linux machine.

Coming up: Remote Scan Started/Stopped · Add Source · Modify Source · Set Broadcast_Code · Remove Source · Error handling

Leave a Reply

Your email address will not be published. Required fields are marked *