OpenAirCast is a GPL-licensed Windows tray application that captures the default
Windows output once through WASAPI loopback and streams it to one or more AirPlay 2
receivers. Multi-receiver sessions reuse the PTP group transport from
airplay2-rs instead of running independent capture loops.
The current milestone is a testable multi-room MVP, not a production release.
WASAPI loopback (44.1 kHz stereo f32)
|
v
bounded LiveAudioDecoder channel
|
v
shared PCM buffer -> shared ALAC encoder -> shared RTP timestamp
| | |
v v v
per-receiver packet/encryption/UDP state
One receiver uses the established NTP session. Two or more receivers use a PTP
group: the primary connection participates in BMCA, secondary connections share
its clock/timing channel, and every receiver gets packets from one AudioStreamer.
- Windows 10/11 WASAPI loopback capture with one capture thread per group
- mDNS discovery of AirPlay 2 receivers, including HomePods
- Independent tray checkboxes for up to eight or more receivers
- ALAC fan-out with receiver-specific encryption, sequence history, sockets, and retransmission handling
- PTP timing for multi-receiver sessions; NTP retained for a single receiver
- Master receiver volume, remembered volume, and configurable global toggle hotkey
- Membership changes restart and renegotiate the group while preserving the chosen speaker set for hotkey resume
- Release builds use the Windows GUI subsystem, so normal operation has no console
- Run
OpenAirCast.exe; it starts stopped in the notification area. - Check one or more speakers. Adding or removing a check rebuilds the active group.
- Use Settings... for master volume and the global hotkey.
- Choose Stopped or use the hotkey to stop; the hotkey restores the last group.
AirPlay receivers connect back to the sender. If setup stalls, allow the executable through Windows Firewall without running the whole application as administrator:
netsh advfirewall firewall add rule name="OpenAirCast" dir=in action=allow program="C:\path\to\OpenAirCast.exe" enable=yes profile=anyInstall stable Rust. The verified Windows build uses the MSVC Rust target and the Visual Studio C++ Build Tools; a GNU Rust/MinGW toolchain is also supported by the underlying project.
cargo test -p homepod-cast
cargo build -p homepod-cast --release
./build.ps1The binary is target/release/openaircast.exe; build.ps1 copies the portable
artifact to dist/OpenAirCast.exe.
Diagnostics:
target/debug/openaircast.exe--list
$env:RUST_LOG="info,homepod_cast=debug,airplay_audio=debug,airplay_timing=debug"
target/debug/openaircast.exe--selftest-group--selftest-group requires at least two discovered receivers and streams for 50
seconds at the conservative default volume. Packet and timing logs come from the
same production path used by the tray application.
- The three-receiver PTP transport and real Windows audio path have been exercised on HomePod hardware for 50 seconds. Acoustic skew has not yet been instrumented; 30-minute stability, sleep/wake, and repeated restart testing remain outstanding.
- The upstream API cannot insert a newly paired connection into a running shared streamer, so group membership changes currently require a full group restart.
- Discovery is an initial scan rather than a continuous background task.
- A UDP send failure is isolated per target and retransmission state is per target, but receiver reconnect/rejoin and partial group setup recovery are not yet built.
- Output-device selection, mute, latency presets, saved groups, per-speaker volume, and the diagnostics window remain later milestones.
The architecture and exact upstream relationship are documented in
docs/ARCHITECTURE_ANALYSIS.md, with protocol
answers in docs/MULTIROOM_IMPLEMENTATION.md
and the staged work in docs/IMPLEMENTATION_PLAN.md.
The latest hardware run is recorded in
docs/VALIDATION.md.
OpenAirCast is based on
iakacer/windows-airplay-homepod
and lmcgartland/airplay2-rs.
It preserves the existing GPL-2.0 license and upstream notices. See
THIRD_PARTY_NOTICES.md for provenance.