Problem
The lyrics screen on an AirPlay receiver is much plainer than the "Monitor display output" view. It has no effects.
Why they differ
- AirPlay:
src-tauri/src/macos/airplay_bridge.mdraws the scene natively. It lays out static text with CoreText into pixel buffers, which are encoded to HLS. The scene is fed byaudience-projector.tsandaudience-presentation.ts. - Monitor output:
openFullscreenPlayerinsrc/lib/fullscreen-player.tsopens a Tauri window atindex.html?mode=fullscreen-player. That window renders the normal React lyrics components with all their effects.
Options
- Reuse the web renderer. Render the fullscreen-player webview offscreen and capture its frames into the HLS encoder, for example with WKWebView snapshots or ScreenCaptureKit.
- Gives full parity with Monitor output.
- Needs a hidden webview kept alive and in sync, plus a continuous capture loop.
- Adds latency and CPU cost.
- Extend the native renderer. Add the effects that matter most (karaoke word fill, active-line emphasis, transitions), driven by
presentationSpec.- Cheaper.
- The two renderers stay separate implementations.
Pick an option before implementing.