Overview
TouchIT Air turns an Android-powered TouchIT interactive LED display into an AirPlay receiver, so teachers and presenters can wirelessly mirror an iPhone, iPad, or Mac screen straight to the board — no Apple TV, no AirPlay dongle, no extra hardware. The app advertises itself on the local network over Bonjour/mDNS, completes Apple’s AirPlay pairing and FairPlay handshake, then receives the mirrored video and audio stream and renders it full-screen on the LED. It was built as a packaged, license-activated Android product for the TouchIT App Store.
The AirPlay protocol core is the open-source AirplayServer project (originally by dsafa22; the bundled C library handles RAOP, FairPlay, pairing, mDNS, and fdk-aac audio decoding under its respective BSD/MIT/LGPL/GPL licenses). The work documented here is the TouchIT product layer on top of it: integrating that C core into a real Android app via the NDK and JNI, wiring up hardware video/audio playback, and adding everything needed to ship it commercially — license-key activation, an over-the-air update flow, single-connection presentation locking, and a supporting backend.
Technical Implementation
The AirPlay receiver logic lives in a C library compiled into the app with CMake (armeabi-v7a, -std=c++11). It implements mDNS service advertisement (Apple’s mDNSResponder), the AirPlay pairing/handshake (curve25519 + ed25519), the FairPlay/playfair exchange, the RAOP/RTP streaming endpoints, and fdk-aac audio decoding. Java talks to it through a thin JNI bridge (RaopServer loading raopserver_android), which hands decoded NAL video packets and PCM audio packets back up to the app.
On the Android side, VideoPlayer wraps MediaCodec as an H.264 decoder configured against the display Surface with VIDEO_SCALING_MODE_SCALE_TO_FIT, while AudioPlayer wraps AudioTrack in streaming mode and writes buffered PCM packets; a small model layer (NALPacket, PCMPacket) carries frames between the native callbacks and the players. On the product side, KeyActivity captures the license key and email, and SplashActivity uses Volley to hit the licensing backend for version checks, license verification, and TouchITAir.apk downloads, gating activation and driving OTA updates. The backend is a Node.js service on a self-managed Linux VPS exposing those version/license/APK endpoints.
Impact & Results
TouchIT Air eliminated the need for dedicated AirPlay hardware: a software-only receiver running on the LED itself replaces an Apple TV or AirPlay dongle per room, and the display appears in the standard iOS/macOS Screen Mirroring list via Bonjour with no app required on the presenter’s device. Single-connection locking keeps a presenter in control on shared classroom and boardroom networks, and license activation plus in-app OTA updates let TouchIT distribute and keep the receiver current across LED installations through its App Store.
The AirPlay/RAOP core is built on the open-source AirplayServer project (originally by dsafa22), which bundles third-party components — crypto, curve25519, ed25519, fdk-aac, playfair, plist, mDNSResponder, http-parser — under New BSD, MIT, Apache 2.0, LGPLv2.1+, and GPL licenses. The contribution documented here is the TouchIT-specific product layer on top of that foundation: NDK/JNI integration into a shippable Android app, MediaCodec/AudioTrack playback, single-connection locking, license activation, OTA updating, and the companion backend.
Share