diff --git a/CLAUDE.md b/CLAUDE.md index 5dae82a..4a7a980 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -143,7 +143,24 @@ Low-latency desktop/game streaming stack, Linux-first, with a shared Rust protoc player LEDs / adaptive triggers → `GCDeviceLight`/`playerIndex`/ `GCDualSenseAdaptiveTrigger` via the table-driven `DualSenseTriggerEffect` parser). Loopback-tested end to end (`PUNKTFUNK_TEST_FEEDBACK=1` scripted burst); DualSense - motion sign/scale derived, not yet live-verified. Tests: `swift test` in + motion sign/scale derived, not yet live-verified. **Gamepad UI (iOS/iPadOS + macOS, + 2026-07-02 rework):** a connected pad swaps the home for a console-style launcher + (`Home/Gamepad*` + `Settings/GamepadSettingsView`) — host carousel with a trailing Add + Host tile (A connect · Y library · X settings · B back), a controller-navigable + settings screen (vertical `GamepadMenuList`, left/right steps values), an add-host + flow with an on-screen controller keyboard (`GamepadKeyboard` — no touch needed + anywhere), and the coverflow library, all over an animated aurora backdrop + (`GamepadScreenBackground`, TimelineView-driven drifting blobs — pure SwiftUI ON + PURPOSE: a .metal lib only reliably bundles in one of the two build systems (SPM vs + xcodeproj synced folders) these sources compile under). Input is the polled + `GamepadMenuInput` (handlers don't fire outside a stream; on (re)start it SNAPSHOTS + held buttons so a handoff press never double-fires), haptics dual-channel (device + + `MenuHaptics` on the pad). macOS: same screens, settings/add-host as sheets (no + fullScreenCover), NSScreen-based mode lists, scroll indicators `.never` (macOS + "always show scroll bars" overrides `.hidden`); launcher/settings/add-host/keyboard + render-verified live on this Mac via `PUNKTFUNK_FORCE_GAMEPAD_UI=1` (dev hook, forces + the mode without a pad). Controller-in-hand on-glass validation still pending on all + platforms. Tests: `swift test` in `clients/apple` (unit + real-codec round trip), `test-loopback.sh` (Swift client vs synthetic punktfunk1-hosts on loopback — runs on macOS; includes the pairing ceremony + `--require-pairing` gate), @@ -231,7 +248,7 @@ Low-latency desktop/game streaming stack, Linux-first, with a shared Rust protoc **Android stage 1 done** (`clients/android`, Kotlin app + `native/` Rust JNI core linking `punktfunk-core`; phone + Android TV): NDK `AMediaCodec` hardware HEVC decode → `SurfaceView` incl. **HDR10** (Main10/BT.2020 PQ) with low-latency tuning + a live stats HUD (`decode.rs`/`stats.rs`), - Opus/Oboe audio + mic uplink (`audio.rs`/`mic.rs`), gamepad input with rumble/HID feedback + Opus/AAudio audio + mic uplink (`audio.rs`/`mic.rs`), gamepad input with rumble/HID feedback (`feedback.rs`), **native `mdns-sd` mDNS discovery** (`discovery.rs`, polled over JNI — the same browse the Linux/Windows clients use, replacing the flaky per-OEM `NsdManager`; Kotlin keeps only the `MulticastLock` + permission UX), SPAKE2 PIN pairing + TOFU (Keystore identity + diff --git a/README.md b/README.md index 981eb37..e4fc858 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ protocol, FEC, and crypto, linked into the host and every client over a stable C | **Windows host** (x64) | 🟡 Implemented & shipping as a signed installer: DXGI/WGC capture · its own all-Rust IddCx **virtual display** (secure-desktop capable) · GPU encode (NVENC on NVIDIA, AMF/QSV on AMD/Intel, software H.264 without a GPU) · WASAPI audio · bundled virtual-gamepad drivers (no ViGEmBus) · HDR incl. Vulkan-game HDR. NVIDIA live-validated; AMD/Intel CI-green | | **macOS / iOS / tvOS client** (`clients/apple`) | ✅ Streaming live: VideoToolbox decode, controllers incl. DualSense, discovery, pairing, speed test | | **Linux client** (`clients/linux`, GTK4) | ✅ Streaming live: FFmpeg + VAAPI zero-copy decode, PipeWire audio, SDL3 controllers; ships as Flatpak/apt/rpm/Arch | -| **Android client** (`clients/android`, phone + TV) | ✅ Streaming live: AMediaCodec decode + HDR10, Oboe audio, controllers, discovery, pairing | +| **Android client** (`clients/android`, phone + TV) | ✅ Streaming live: AMediaCodec decode + HDR10, AAudio audio, controllers, discovery, pairing | | **Windows client** (`clients/windows`, WinUI 3) | 🟡 Stage 1 complete, ships as signed MSIX (x64 + ARM64); D3D11VA decode + HDR present pending on-glass validation | | **Web console + management API** (`web/`) | ✅ TanStack console over the OpenAPI mgmt API: host status, paired devices, on-demand PIN pairing | @@ -132,7 +132,7 @@ clients/ apple/ macOS / iOS / tvOS app (Swift · VideoToolbox · Metal · GameController) linux/ Linux desktop app (Rust · GTK4/libadwaita · FFmpeg/VAAPI · PipeWire · SDL3) windows/ Windows desktop app (Rust · WinUI 3 · D3D11 · WASAPI · SDL3) - android/ Android phone + TV app (Kotlin · Rust JNI core · AMediaCodec · Oboe) + android/ Android phone + TV app (Kotlin · Rust JNI core · AMediaCodec · AAudio) probe/ headless reference / measurement client for punktfunk/1 decky/ Steam Deck Decky plugin web/ web console (TanStack) over the management API — status · devices · pairing