The pub’s program audio reaches the Pi as a 6-channel AES67 multicast stream
from the Q-SYS Core. The Pi runs aes67-linux-daemon, which exposes the stream
as an ALSA capture device that pi-capture
reads for song identification. This is how the song-ID pipeline gets clean,
per-source audio without a sound card tap.
Signal path
flowchart LR CORE["Q-SYS Core<br/>AES67-TX-1 (6ch multicast)"] -->|"AES67 / RTP"| DAEMON PTP["ptp4l (PTPv2)"] -.->|"clock"| DAEMON subgraph Pi["Raspberry Pi"] DAEMON["aes67-daemon<br/>RAVENNA ALSA module"] --> ALSA["ALSA capture (6ch)"] ALSA --> CAP["pi-capture<br/>per-pair RMS source pick"] end CAP -->|"now-playing ingest"| WK["Worker"]
Boot chain (systemd): ptp4l-eth0.service → aes67-daemon.service →
pi-capture.service. Sink config persists in
/opt/aes67-linux-daemon/daemon/status.json and survives restart.
Channel map
| Ch | Source |
|---|---|
| 1-2 | Program input L/R (Spotify / aux) |
| 3-4 | Wall plate stereo |
| 5-6 | Wall plate XLR (mic) |
pi-capture picks the loudest non-silent pair and tags the play with that source.
Web UI — password-gated
The daemon’s web UI was moved off its default 8080 (collided with another Pi
app) and is now behind nginx basic auth:
| Endpoint | Access |
|---|---|
http://<pi>:8090 | Login (admin + password), via nginx |
http://<pi>:8089 | Daemon — firewalled to localhost; nginx proxies to it |
nginx config lives at /etc/nginx/sites-available/aes67; the iptables rule
restricting 8089 is persisted via netfilter-persistent. Basic auth has no
logout — close the (incognito) browser or rotate the password file.
Known issue: PTP grandmaster flap
The Core’s PTPv2 master can flap against the Dante endpoint for grandmastership
(BMCA), which logs a clock fault on the Core. Fix (future Designer session): set
the Core’s PTP Priority1 below Dante’s, or put the Core’s AES67 PTP on a
separate domain. The Pi’s ptp4l listens PTPv2 only and locks cleanly regardless.
Related
- now-playing-system — consumer of this stream
- qsys-control — the Core that sources it
- pi-capture-ops — Pi runbook