Clickable previews: exact app deep-links everywhere

Every rendered still links to the app frame that produced it (song + seed + frame + venue/viz pins + probe warm-up, new window), via shared src/ui/preview.js. Supporting work, each measured: app honors ?frame/?venueSel/?viz/?warm= with pre-build pins (Show.applyPins) and primes deep-link loads; shared pinViz/pinVenueShell paths for gallery, filmstrip and app; probes prime and carry their warm-up; bank probes analyse the bank PCM and file decode is fixed-rate with bit-exact WAV parsing so app and probes see identical samples; materials built mid-update compile synchronously (needsCompile). Round trip verified bit-identical gallery-versus-app.
This commit is contained in:
Dejvino
2026-09-20 18:42:53 +02:00
parent cc8888077f
commit 4d05250294
18 changed files with 377 additions and 96 deletions
+12 -1
View File
@@ -54,7 +54,9 @@ export const DEFAULT_DURATION = 180;
* the whole strip look more alike than it is. Half of what the variety harness
* uses, because this is 17 songs deep and the cost is linear.
*/
const WARMUP = 24;
/** Frames of warm-up behind every probe. Carried in preview links (?warm=)
* so the app lands on identically converged state. See src/ui/preview.js. */
export const WARMUP = 24;
export const songNames = () => SONGS.map((s) => s.name);
@@ -80,7 +82,16 @@ export function renderSong(show, name, { duration, every, venueEnabled = null, v
// VenueSpec population stays the census one, only the shell is forced.
const sel = venueSel || (typeof location !== 'undefined' && new URLSearchParams(location.search).get('venueSel')) || null;
if (sel) pinVenueShell(look, sel);
// The file name the app shows in its title plate (OSD): without it the
// probe renders a blank plate and no deep-link can match the app's
// default view. See src/ui/preview.js.
show.fileName = name;
show.useTrack(track, look);
// Prime once per song: programs link asynchronously and a draw against an
// unlinked program is wrong output — invisible in a sweep, wrong in an
// export, and fatal to preview deep-links, which replay these frames in
// the app (primed there too). See src/ui/preview.js.
show.prime();
const frames = [];
const descriptors = [];