festifun/backend/festival4d
m3ultra c24af8029e Audio is the master clock + spatial audio free-roam (fresh-eyes opts 1 & feature 1)
Master clock: the selected soundtrack (new GET /api/audio/{id} —
listening-quality stereo AAC, lazily ffmpeg-extracted and cached in
data/work/audio_hq/) plays through WebAudio, and t_global derives from
AudioContext.currentTime. Every <video> is muted picture-only, so hard
seeks and playbackRate corrections are inaudible (the unmuted video
used to warble on every nudge). Graceful fallback to the old
performance.now() clock + <video> audio when a track can't load, with
an in-place upgrade if the decode lands mid-play. Drift is compensated
in the track's playbackRate; _resync() now recomputes from the live
clock since the soundtrack keeps playing while rAF is throttled.

Spatial audio (🎧 3D audio, shown when poses exist): every enabled
camera's track plays through an HRTF PannerNode at its live
reconstructed pose, gains normalized 1/sqrt(N); the listener follows
the viewer camera each frame (free roam, follow-cam, and M9 paths).
Tracks that finish decoding mid-play join the mix in place; toggling,
seeking, rate and enable changes rebuild the graph at the current
t_global with no timeline jump.

The window.__f4d debug hook is now also available in production builds
via localStorage f4dDebug=1 (headless panes throttle rAF; the pump is
the only way to drive the loop there).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 17:02:48 +10:00
..
static Live capture: USB webcams, laptop cams, and phones -> data/raw 2026-07-17 15:43:51 +10:00
__init__.py Foundation (M0 + M3 + frozen contracts): scaffold, synthetic fixtures, full API 2026-07-16 00:45:55 +10:00
__main__.py Foundation (M0 + M3 + frozen contracts): scaffold, synthetic fixtures, full API 2026-07-16 00:45:55 +10:00
api.py Audio is the master clock + spatial audio free-roam (fresh-eyes opts 1 & feature 1) 2026-07-17 17:02:48 +10:00
audio_sync.py Sync solver: cache per-signal FFTs across the pairwise GCC-PHAT stage 2026-07-17 17:02:27 +10:00
capture.py Live capture: USB webcams, laptop cams, and phones -> data/raw 2026-07-17 15:43:51 +10:00
cli.py Foundation (M0 + M3 + frozen contracts): scaffold, synthetic fixtures, full API 2026-07-16 00:45:55 +10:00
config.py Audio is the master clock + spatial audio free-roam (fresh-eyes opts 1 & feature 1) 2026-07-17 17:02:48 +10:00
db.py Phase 4 polish: anchor supersede + delete, docs/ideas, field-test scaffolding 2026-07-16 12:15:35 +10:00
events_ai.py Coordinator hotfix: Gemini model env-overridable, default gemini-3.1-flash-lite 2026-07-16 10:18:43 +10:00
frames.py Lane B (M2 + M8 geometry): COLMAP reconstruction, geometry math, graceful degradation 2026-07-16 08:40:46 +10:00
geometry.py Lane B (M2 + M8 geometry): COLMAP reconstruction, geometry math, graceful degradation 2026-07-16 08:40:46 +10:00
ingest.py Audio is the master clock + spatial audio free-roam (fresh-eyes opts 1 & feature 1) 2026-07-17 17:02:48 +10:00
resolve.py Integration (M8 + M9): annotation→3D, camera paths, README, v0.1.0 2026-07-16 09:59:51 +10:00
sfm.py Lane B (M2 + M8 geometry): COLMAP reconstruction, geometry math, graceful degradation 2026-07-16 08:40:46 +10:00
synthetic.py Foundation (M0 + M3 + frozen contracts): scaffold, synthetic fixtures, full API 2026-07-16 00:45:55 +10:00