AES67 audio-over-IP: a macOS driver, the platform-free core it is built on, and the Teensy PTP library a grandmaster box uses. Four packages, three of which came from three repositories and are kept together because they are read together, not because they build together.
| Package | What it is | Built with |
|---|---|---|
packages/aes67-profiles |
The tables every implementation here has to agree on: the AoIP compatibility profiles, the Dolby per-model data and the PTP profiles. Freestanding headers -- no platform, no operating system, no other package -- so the macOS core and the Teensy firmware read the same numbers instead of keeping two copies | CMake, C++20 |
packages/aes67-core |
The platform-free core: SDP parsing, the RTP wire header, the jitter buffer and packet pool, the media-clock PLL, channel mapping, configuration. No Apple framework, no socket header, no operating system — checked, not just intended | CMake, C++20 |
packages/aes67-macos-driver |
The macOS AudioServerPlugIn driver, the PTP daemon and the tools | CMake, C++20 and Objective-C++ |
packages/aes67-macos-manager |
The SwiftUI manager app: what a person runs, and what installs the driver and the daemon it carries as resources. Built by its own build.sh against the driver package's build/ |
swiftc, Swift 5 |
packages/aes67-linux-ptpd |
A PTP grandmaster for Linux, written for a Raspberry Pi 5: it announces the NIC's own hardware clock, stamps its Sync messages with it and reads its rates from aes67-profiles. Announce, Sync/Follow_Up and Delay_Resp; no BMCA and no slave side |
CMake, C++20 |
packages/aes67-ravenna |
RAVENNA's session layer and the NMOS APIs a controller routes with: DNS-SD over mDNS and the RTSP DESCRIBE that hands over the SDP, IS-04 so the device is on the list, IS-05 to give one device another's stream, IS-08 for the grid channel by channel. The SDP is the core's and the grid is the core's matrix | CMake, C++20 |
packages/t41-ptp |
IEEE 1588 for the Teensy 4.1, a fork of IMS-AS-LUH/t41-ptp, carrying QNEthernet and TimeLib under libraries/. A submodule: JaumeAP/t41-ptp, the only package here that is a repository of its own |
Arduino / PlatformIO |
The grandmaster firmware that consumes t41-ptp is not here: it is
JaumeAP/AES67-master-box-,
standalone, and takes t41-ptp as a submodule.
Every package verifies itself. Each has a gate of its own that builds it,
runs its tests and applies whatever checks that package needs — the core has a
platform-freedom contract, the driver has a CMake sanity check, t41-ptp
compiles for the board. None of them depends on another package's gate to be
covered.
scripts/gate.sh runs all three in order and stops at the first failure. It
owns no checks of its own; it knows which packages there are and nothing about
what any of them does.
scripts/gate.sh # the cheap half of every package: seconds
AES67_ANALYSE=1 scripts/gate.sh # plus clang-tidy, cppcheck, ASan/UBSan, fuzzing and coverage: many minutesEach package's gate can be run on its own, from anywhere:
packages/aes67-profiles/scripts/gate.sh
packages/aes67-core/scripts/gate.sh
packages/aes67-ravenna/scripts/gate.sh
packages/aes67-macos-driver/scripts/gate.sh
packages/aes67-macos-manager/scripts/gate.sh
packages/aes67-linux-ptpd/scripts/gate.sh
packages/t41-ptp/scripts/gate.shVerification is local. .githooks/pre-push runs scripts/gate.sh before every
push and asks about the static analysis when the push is to the default branch;
a fresh clone has to opt in once, because hook configuration is local and does
not travel with a repository:
git config core.hooksPath .githooksFour workflows exist. Three are for what this machine cannot check, and one
is for a second opinion on what it can.
.github/workflows/linux-ptpd.yml compiles the Linux daemon, whose half that
talks to the kernel does not build on a Mac at all, and packages it for the
Pi. .github/workflows/t41-ptp.yml runs the Teensy package's gate with the
board build, which wants a PlatformIO toolchain. .github/workflows/ravenna.yml
runs aes67-profiles, aes67-core and aes67-ravenna on Linux, because those
three have no Apple in them and a portability nobody ever tests is a claim
rather than a fact. .github/workflows/macos.yml builds the driver and the
Manager app on a macOS runner and checks that the app comes out carrying both
-- a second Mac with a different Xcode, which is what the two packages that
only ever built here were missing. None is a merge gate: what the first three
cover, no local run can, and the fourth repeats a local run on other hardware.
macOS only, and only because of the driver: aes67-macos-driver's project()
declares OBJCXX, so configuring the root fails on Linux before anything builds.
The other CMake packages -- aes67-profiles, aes67-core, aes67-ravenna,
aes67-linux-ptpd -- configure and build on either system from their own
directory, and ravenna-alsa-lkm wants Linux and the running kernel's headers.
git clone --recurse-submodules https://github.com/JaumeAP/AES67.git
cd AES67
cmake -S . -B build && cmake --build build
ctest --test-dir build --output-on-failureThat builds the driver, which pulls the core in with it: 42 test suites, plus
the core's 19. external/doctest is the submodule those two share; the other
is the Linux AES67 daemon, which brings the RAVENNA kernel module it drives
along as a submodule of its own. Neither is read by anything on macOS, and
both want --recurse-submodules to be on disk at all.
t41-ptp is cross-compiled for an ARM Cortex-M7 and is not wired into the
CMake tree. Its host tests run on the Mac; its board build needs PlatformIO.
The root LICENSE is GPL-3.0 and covers the code written for this project.
Everything vendored keeps the licence it arrived with. NOTICE says
which is which, subtree by subtree.