An AirPlay 2 receiver for Android TV / Google TV that gets the two hard parts right:
- Audio that stays locked. Low-latency RAOP audio path with a real jitter buffer, clock-drift compensation, and underrun concealment — modeled on the approach proven in jqssun/android-airplay-server.
- Video that doesn't stutter. Async MediaCodec with presentation-timestamp-driven release, buffer-ahead depth for streamed sessions, and a deliberate late-frame drop policy instead of decode-loop stalls.
Plus a UI that respects your TV: one calm status screen, not a settings maze.
Early development, but it builds and runs. See docs/ARCHITECTURE.md for the design
and the analysis of the two upstream codebases this project draws from, and
CHANGELOG.md for what's landed.
Requires JDK 17+, the Android SDK (compileSdk 36, NDK 28), and CMake 3.22.
./gradlew assembleDebug # -> app/build/outputs/apk/debug/app-debug.apk
./gradlew testDebugUnitTest # JVM unit tests
./gradlew assembleRelease # R8-minified release APK
# install to a Google TV over adb (enable network debugging on the TV first)
adb connect <tv-ip>:5555
adb install -r app/build/outputs/apk/debug/app-debug.apkThen open Screen Mirroring / AirPlay on an iPhone or Mac and pick the TV.
DroidPlay stands on two open-source AirPlay receiver implementations:
- jqssun/android-airplay-server (GPL-3.0)
- mazer666/PhairPlay (Apache-2.0)
Because it incorporates GPL-3.0 code, DroidPlay is licensed GPL-3.0 as a whole.
See LICENSE and per-file headers.