A lightweight, audio-only, Bonjour-free UxPlay distribution for Windows.
UxPlayEnhanced turns a Windows PC into an AirPlay audio receiver without installing Apple's Bonjour service. It is built on the official FDH2/UxPlay project and keeps UxPlay's audio engine while making the packaged Windows experience intentionally audio-first: no local video renderer, no always-open terminal, and no external mDNS service.
Upstream: FDH2/UxPlay. The upstream source is tracked directly in this repository as the
lib/uxplayGit submodule. UxPlayEnhanced is an independent Windows packaging and integration project, not an official FDH2 release.
| Area | UxPlayEnhanced behavior |
|---|---|
| Primary use | AirPlay audio playback on Windows |
| Video pipeline | Disabled by default with -vs 0 |
| Device discovery | Embedded mDNS; Apple Bonjour is not required |
| User interface | Background tray application with status, song, quality, and logs |
| Installation | Self-elevating setup creates firewall rules and shortcuts |
| Audio information | Logs codec, lossless/lossy classification, and receiver format |
| Console noise | Suppresses repeated unchanged metadata blocks |
| ALAC startup | Begins dequeuing on the first real audio packet to avoid a startup burst |
| Windows resampling | Uses GStreamer's maximum quality for 44.1 to 48 kHz conversion |
“Lightweight” refers to runtime behavior: the normal launcher does not create a video decode/render pipeline and does not require a separate Bonjour service. The release still includes the GStreamer and FFmpeg libraries required by UxPlay's audio stack.
- Download the latest Windows ZIP from the UxPlayEnhanced releases.
- Extract the complete ZIP.
- Run
UxPlayEnhanced-Setup.cmd. - Approve the Windows administrator prompt.
- Launch UxPlayEnhanced from the desktop or Start menu.
- Open the AirPlay output selector on the iPhone, iPad, or Mac and choose the Windows computer's name.
The setup installs to C:\Program Files\UxPlayEnhanced, unblocks files that
inherited Windows' downloaded-file marker, creates and verifies program-scoped
inbound TCP and UDP firewall rules used by AirPlay, adds desktop and Start-menu
shortcuts, and registers an uninstall entry in Windows Apps and Features.
The desktop shortcut is created in the Windows all-users Desktop so it remains visible when setup is approved with a different administrator account. Setup verifies that the shortcut targets the installed copy before reporting success. The installer does not delete the extracted release folder; its setup files are intentionally not copied into Program Files. After a successful installation, the extracted folder can be deleted manually.
During an upgrade, setup stops every running executable from the installed package and waits until the installation stays process-free. Releases use a versioned application directory so antivirus behavior monitoring cannot strand an upgrade by protecting an older executable. Hash-identical runtime files are retained instead of being overwritten, while copied files receive SHA-256 verification.
Uninstall from Windows Apps and Features. The uninstaller verifies the registered Program Files path before recursive removal. If antivirus behavior monitoring keeps an old runtime file protected, uninstall schedules only the remaining UxPlayEnhanced files for deletion at the next Windows restart and reports that a restart is required.
Installation is optional. Extract the ZIP and run setup-firewall.ps1 once; it
requests administrator access automatically. Then launch UxPlayEnhanced.bat.
The portable launcher also starts in audio-only mode and uses the tray
application when available.
The bundled UxPlayEnhanced.exe runs UxPlay without an open terminal window.
Right-click its blue tray icon to see:
- AirPlay host, connected client device, and connection status
- Current artist, song, and album metadata
- Clean codec, lossless/lossy quality, bit depth, sample rate, and channels
- View logs and open the installation folder
- Restart and quit controls
Logs are stored at
%LOCALAPPDATA%\UxPlayEnhanced\Logs\UxPlayEnhanced.log. View logs opens
that file directly in Notepad, without relying on a Windows .log file
association. The log rotates at 5 MB and keeps two older files
(UxPlayEnhanced.log.1 and .log.2), so a long-running receiver cannot fill
the disk.
Normal logs omit the once-per-second track progress display. Launch
UxPlayEnhanced.exe --verbose when troubleshooting to include those progress
updates; connection, format, metadata, warning, and error events are always
logged.
The executable bundles its Python runtime and tray dependencies. End users do
not need Python, pip, pystray, or Pillow installed.
All included launchers pass -vs 0, which disables UxPlay's local video sink.
This avoids local video decoding, rendering, and video-timing work while keeping
AirPlay audio reception active. The underlying uxplay.exe remains available
for advanced users, but screen mirroring is outside this distribution's normal
supported workflow. Use upstream FDH2/UxPlay
when full video-mirroring behavior is the priority.
When an audio session starts, UxPlayEnhanced logs the codec, lossless/lossy
classification, receiver resolution, channel count, and equivalent decoded PCM
bitrate. ALAC (ct=2) is lossless and AAC-ELD (ct=8) is lossy.
The current receiver profile is 16-bit/44.1 kHz. The log therefore reports the format received and decoded by UxPlay; it does not claim to measure the source service's encoded bitrate or prove that an Apple Music source was Hi-Res Lossless. Repeated identical DMAP metadata updates are omitted from the console.
In Apple Music terms, UxPlayEnhanced's 16-bit/44.1 kHz receiver profile is standard Lossless (CD quality), not Hi-Res Lossless; see Apple's lossless-audio guide. This is also the useful compatibility default for iOS 27 Developer Beta 3: current beta user reports indicate AutoMix works with Lossless selected but is unavailable with Hi-Res Lossless. Apple does not list that restriction in the Beta 3 release notes, so it should be treated as beta behavior that may change.
ALAC playback starts from the first real audio payload instead of accumulating
frames until the first NTP synchronization packet and then burst-draining them.
This is a narrowed backport of
FDH2/UxPlay PR #548; malformed short
packets are excluded explicitly. The PR's separate audioresample quality=10
change was evaluated independently: it added approximately 2.18 ms of filter
latency and increased this isolated stage from about 0.11% to 0.22% of one CPU
core on the build PC. UxPlayEnhanced includes it because the absolute overhead
is small and audio quality is the project's priority.
UxPlayEnhanced replaces UxPlay's Windows Bonjour/DNS-SD dependency with the
embedded responder in src/dnssd_embedded.c. It:
- Listens for mDNS on UDP multicast
224.0.0.251:5353 - Advertises
_airplay._tcpand_raop._tcp - Responds with PTR, SRV, TXT, and A records
- Sends startup announcements and TTL=0 goodbye records
- Runs in-process without
dnssd.dll, iTunes, iCloud, or Bonjour services
Discovery is advertised on every up, non-loopback IPv4 interface rather than only the one that routes toward the internet, so a PC on both Ethernet and Wi-Fi is reachable from either network and a machine with no default route still works. Each interface advertises its own address. The interface list is rechecked every 15 seconds, so joining Wi-Fi, docking, or raising a VPN is picked up without a restart, and services are re-announced on links that appear.
Clone this repository with its official UxPlay submodule:
git clone --recurse-submodules https://github.com/Kylepossible/UxPlayEnhanced.git
cd UxPlayEnhancedInstall MSYS2, then install the MinGW64 build dependencies:
pacman -S --needed \
mingw-w64-x86_64-toolchain \
mingw-w64-x86_64-cmake \
mingw-w64-x86_64-gstreamer \
mingw-w64-x86_64-gst-plugins-base \
mingw-w64-x86_64-gst-plugins-good \
mingw-w64-x86_64-gst-plugins-bad \
mingw-w64-x86_64-gst-libav \
mingw-w64-x86_64-openssl \
mingw-w64-x86_64-libplist \
mingw-w64-x86_64-pkg-configThe standalone tray executable also requires a Windows Python build environment
with PyInstaller, pystray, and Pillow. Run the build from MSYS2:
bash build.shThe self-contained package is written to dist/UxPlayEnhanced/.
lib/uxplay/— official FDH2/UxPlay source submodulesrc/dnssd_embedded.c— embedded Windows mDNS/DNS-SD implementationpatch_cmake.py— applies the integration, audio-quality, and metadata patcheslauncher/uxplay_tray.pyw— UxPlayEnhanced tray application sourcelauncher/UxPlayEnhanced-Setup.*— installer entry point and setup logicassets/— application and tray icon assetsbuild.sh— builds UxPlay, resolves DLL dependencies, and packages the release
UxPlayEnhanced is distributed under the GNU General Public License v3.0. See LICENSE.
UxPlayEnhanced builds on FDH2/UxPlay, which is
licensed under GPL-3.0, and every release ships a patched uxplay.exe. A
modified GPLv3 work must itself be distributed under GPLv3, so that license
covers this repository and all binary releases.
Per-component notes:
| Component | License |
|---|---|
lib/uxplay/ (submodule) |
GPL-3.0 — see lib/uxplay/LICENSE |
lib/uxplay/lib/ (upstream AirPlay library, derived from RPiPlay/shairplay) |
LGPL-2.1-or-later |
src/dnssd_embedded.c |
LGPL-2.1-or-later, matching the upstream lib/dnssd.c it replaces |
patch_cmake.py, build.sh, launcher/ |
GPL-3.0 |
src/dnssd_embedded.c stays under LGPL-2.1-or-later so it remains usable in the
same places upstream's lib/dnssd.c is; the "or later" grant makes it
compatible with the GPL-3.0 work it links into.
The complete corresponding source for a binary release is this repository at the
matching tag, together with the lib/uxplay submodule commit it pins.
Core AirPlay implementation: FDH2/UxPlay.
Windows packaging was also informed by leapbtw/uxplay-windows.