Files
ytplayer/plans/jamesdsp-integration-report.md
2026-10-09 21:08:58 +08:00

30 lines
3.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# JamesDSP integration report — 2026-10-09
Phases 1–5 are implemented in five focused commits. Standard remains the default and its EQ construction is byte-for-byte checked against the pre-refactor fixture. JamesDSP lives only in the lazy `feature:jamesdsp` group; the service worker shell has no DSP assets. The shared `AudioGraph` owns the sole context and one source per media element. Enabling JamesDSP creates one worklet and one WASM heap; errors restore Standard routing. iOS remains gated by `liveAudioIOS`. Uploaded impulse responses are session-only, and Liveprog/DDC/arbitrary text effects are excluded. The worklet uses a static, pinned relative module import because AudioWorkletGlobalScope rejects dynamic import.
Verification:
| Check | Result |
|---|---|
| Frontend tests | 266 passed, 0 failed |
| Server suite | Passed with the integration test venv on PATH |
| Offline completion | Chromium + WebKit: 109/109 runtime files, zero missing/failures; all four layouts |
| Lazy / hidden timers | Both engines pass; hidden-timers has no page errors |
| UI geometry / icons | 384 geometry cases and 24 icon cases pass |
| Settings persistence | 24 settings keys unchanged through old-client update; Chromium OPFS save/play passes before and after update. Linux WebKit lacks native OPFS. DSP preset persists while disabled. |
| DSP harness | Both engines pass all seven presets, Standard comparison, A/B bypass, track switch, offline reload and corrupt-WASM fallback. One heap, one worklet, two pre-existing media sources. |
| Migration | Both engines pass unthrottled: one banner/reload, 142 cached entries, offline reload and playback guard. Lossy Chromium repeatedly times out waiting for the new stamped page after the legacy user-triggered refresh, despite candidate install and `CACHE_STATUS ready:true`; WebKit lossy was not reached. |
Three-run cold medians versus `plans/integration-report.md`:
| Engine/profile | FCP before → after | Boot before → after | Cold wire before → after | Positive `app.js` bodies |
|---|---:|---:|---:|---:|
| Chromium LTE | 1360 → 1360 ms | 6457 → 6677 ms | 648 KB → 1.82 MB | 1 |
| Chromium lossy | 1992 → 1936 ms | 10407 → 10582 ms | 648 KB → 1.82 MB | 1 |
| WebKit LTE | 895 → 904 ms | 2307 → 2374 ms | 976 KB → 2.14 MB | 1 |
| WebKit lossy | 2744 → 2751 ms | 5642 → 5757 ms | 983 KB → 2.15 MB | 1 |
FCP/boot are within 4% of the integrated build. Cold-session wire grows by the approximately 1.2 MB upstream WASM, fetched after paint by the required completion job so JamesDSP remains available offline. This is a real first-install transfer cost. The cold results are in `perf/results/dsp-cold-check.json`.
No real iPhone, locked-screen playback, thermal/CPU timing, real-ear preset tuning, crossfade, P2P, or active-DSP saved/OPFS playback was verified. Phase 7 beta push/deploy was intentionally not run: this task explicitly forbids push/deploy. Do not merge or enable the engine by default until the lossy migration handoff is resolved and an iPhone beta check validates lock-screen expectations and CPU cost.