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

ChSource
1-2Program input L/R (Spotify / aux)
3-4Wall plate stereo
5-6Wall 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:

EndpointAccess
http://<pi>:8090Login (admin + password), via nginx
http://<pi>:8089Daemon — 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.