fix(core): avoid live volume probe during render

This commit is contained in:
James
2026-07-26 22:39:58 +00:00
parent 2dddb4c463
commit 477defc7e7
11 changed files with 219 additions and 1 deletions
@@ -0,0 +1,13 @@
{
"name": "Distributed: static audio must not materialize future nested GSAP state",
"description": "Regression for #2809. A static-volume audio element must not trigger live-timeline envelope probing in a non-zero-start chunk and prematurely apply a nested composition's future terminal visibility set.",
"tags": ["distributed", "audio", "sub-composition", "regression"],
"minPsnr": 40,
"maxFrameFailures": 0,
"minAudioCorrelation": 0,
"maxAudioLagWindows": 120,
"renderConfig": {
"fps": 24,
"chunkSize": 120
}
}
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:44f07badd4fc8b99f7430ea23d7009263787656ac725d0a70a9c68f5c15c9ab1
size 87166
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:29abd7d2f00d654654348b10cdef4c9c6f91e52451c1a8f007605bef7ab12017
size 61986
@@ -0,0 +1,56 @@
<template id="child-template">
<div
id="child-root"
data-composition-id="child"
data-start="0"
data-duration="10"
data-width="640"
data-height="360"
>
<div class="future-state">
<strong>MUST BE VISIBLE</strong>
<span>static audio cannot seek visual state</span>
</div>
</div>
<style>
[data-composition-id="child"] {
position: absolute;
inset: 0;
display: grid;
place-items: center;
width: 640px;
height: 360px;
}
[data-composition-id="child"] .future-state {
display: grid;
gap: 14px;
min-width: 420px;
padding: 42px;
border: 8px solid #d8ffe5;
border-radius: 28px;
color: #f4fff7;
background: #087443;
box-shadow: 0 24px 70px rgb(0 0 0 / 45%);
font: 22px/1.3 Arial, sans-serif;
text-align: center;
visibility: visible;
}
[data-composition-id="child"] .future-state strong {
font-size: 38px;
letter-spacing: 0.04em;
}
</style>
<script>
(function () {
window.__timelines = window.__timelines || {};
const timeline = gsap.timeline({ paused: true });
timeline.to(".future-state", { opacity: 0.2, duration: 0.25 }, 9.4);
timeline.set(".future-state", { visibility: "hidden" }, 9.65);
window.__timelines.child = timeline;
})();
</script>
</template>
@@ -0,0 +1,59 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Static volume with future nested set</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.2/gsap.min.js"></script>
<style>
html,
body {
width: 640px;
height: 360px;
margin: 0;
overflow: hidden;
background: #07111f;
}
#root,
#child-host {
position: absolute;
inset: 0;
width: 640px;
height: 360px;
}
</style>
</head>
<body>
<div
id="root"
data-composition-id="main"
data-start="0"
data-duration="12"
data-width="640"
data-height="360"
>
<div
id="child-host"
data-composition-id="child"
data-composition-src="compositions/child.html"
data-start="2"
data-duration="10"
data-track-index="0"
></div>
<audio
id="bed"
src="assets/silence.wav"
data-start="0"
data-duration="12"
data-track-index="1"
data-volume="1"
></audio>
</div>
<script>
window.__timelines = window.__timelines || {};
const timeline = gsap.timeline({ paused: true });
timeline.to({}, { duration: 12 }, 0);
window.__timelines.main = timeline;
</script>
</body>
</html>