Benjamin Harris 14421b5bea feat(dante): CMC device-announce responder 3 달 전
..
include 14421b5bea feat(dante): CMC device-announce responder 3 달 전
src 14421b5bea feat(dante): CMC device-announce responder 3 달 전
CMakeLists.txt 14421b5bea feat(dante): CMC device-announce responder 3 달 전
Kconfig 14421b5bea feat(dante): CMC device-announce responder 3 달 전
README.md 14421b5bea feat(dante): CMC device-announce responder 3 달 전
idf_component.yml 421d6712e9 feat(dante): clean-room Dante mDNS discovery 3 달 전

README.md

components/dante

Clean-room Dante protocol support for the ESP32-P4, written independently from the behavioural notes in docs/dante-protocol-notes.md.

Licensing: this component is Apache-2.0 and must stay clean-room. It is implemented from understanding of Dante's on-the-wire behaviour, never by copying, translating, or closely paraphrasing reference/inferno (GPL/ AGPL). See the hard rule in CLAUDE.md.

What's here now

Discovery (dante_discovery.h)

Read-only mDNS/DNS-SD browsing for Dante devices. It queries the four Dante service types (_netaudio-arc, _netaudio-cmc, _netaudio-chan, _netaudio-bund) and reports each instance found — hostname, IP, port, and TXT records — via a callback, or logs them if no callback is given.

  • dante_discovery_scan() — one-shot synchronous sweep.
  • dante_discovery_start() / dante_discovery_stop() — background scanner that repeats on an interval.

This does not advertise this device and does not touch audio, so it is safe to run on a live Dante network. It's primarily a bring-up aid: it shows what Dante gear is present and how its channels are formatted (sample rate, bit depth, latency, fpp), which is exactly what you need when getting AES67 interop working.

It shares the process-wide ESP-IDF mDNS instance with the AES67 stack (it only ever queries; it never frees mDNS).

Advertisement (dante_advertise.h, dante_device.h)

Publishes this device over mDNS so Dante Controller / peers can see it: _netaudio-arc (control endpoint) and _netaudio-cmc (announce endpoint) at the device level, plus _netaudio-chan per transmit channel. Driven by a dante_identity_t (hostname, 8-byte device id, ports, manufacturer/model, audio format), which dante_identity_init_default() fills from the board's MAC + IP.

  • dante_advertise_start(id) / dante_advertise_stop()
  • dante_advertise_tx_channel(index, name)

Gated OFF by default (DANTE_ADVERTISE_ON_BOOT). Advertising a device that can't answer ARC/CMC makes it show up broken in Dante Controller, so only turn it on once the responders below exist. TXT version strings mimic real-hardware values and are prototype/untested — verify against a capture.

CMC responder (dante_cmc.h)

Answers the "request device advertisement" message on UDP 8800: a peer that found us via mDNS sends it to resolve our full identity, and we reply with the process id, 8-byte factory device id, IP, and info-request port. Uses the 10-byte big-endian ARC-style request/response header (echo start_code/seqnum/ opcode1, set opcode2 = 1, opcode1 0x1001).

  • dante_cmc_start(id) / dante_cmc_stop() — runs a small UDP listener task.

Gated OFF by default (DANTE_CMC_ON_BOOT). Still incomplete without ARC. PROTOTYPE / untested against hardware — verify against a capture.

Enabling

Controlled by Kconfig (idf.py menuconfig → Dante):

  • DANTE_DISCOVERY_ON_BOOT (default y) — main starts the background scanner once the network is up.
  • DANTE_DISCOVERY_INTERVAL_MS (default 15000) — sweep interval.

Not yet implemented

Everything past discovery + advertisement + CMC, in rough dependency order (see the protocol notes):

  • ARC server — capability + channel enumeration and the name-based subscription (routing) model (port 4440).
  • Flow control (dbcp) — open/update/stop audio flows with keepalives (port 4455).
  • Media framing — the 9-byte-header Dante media packets ↔ our I2S engine.
  • PTPv1 — the legacy Dante clock (see CLAUDE.md "Known hard problems").

Status

Compiles as an ESP-IDF component but is not yet build-verified (no ESP-IDF toolchain in the dev environment where it was written) and untested against real Dante hardware.