From b7227326a13b503d37ca36b9d4fc9095b890e1d0 Mon Sep 17 00:00:00 2001 From: LautaroPetaccio Date: Thu, 17 Sep 2026 09:40:33 -0300 Subject: [PATCH 1/5] feat: audio playback position reports test scene (89,-12) Adds scenes/89,-12-audio-playback-position, a standalone scene that exercises the playback-position reports renderers write into the AudioEvent component while an AudioSource plays: the new optional PBAudioEvent fields tickNumber, currentOffset and clipLength, and the audioEventsSystem additions registerAudioPlaybackEntity, removeAudioPlaybackEntity and getAudioPlayback. The scene records its own clock per EngineInfo.tickNumber and, on each report, shows the lag computed against the clock recorded at report.tickNumber next to the naive value computed against the clock at processing time, together with the report cadence and transport delay. getAudioPlayback is polled every frame alongside the push callback, and registerAudioEventsEntity is registered on the same entity with both callback counts displayed to show that position reports do not trigger state-change callbacks. Buttons cover play from 0, seek to 10 s, stop, loop toggle (offset wrap) and unregistering the playback callback; a drift line compares the current lag with the first one after play, and renderers that never send currentOffset get an explicit message instead of NaN. The audio clip is a generated 30 s tone with a beep on every whole second so seeks and the clock-vs-audio alignment are audible. The scene pins the feat/audio-event-playback-position branch build of @dcl/sdk until the protocol and SDK changes are released. --- .../89,-12-audio-playback-position/.dclignore | 20 + .../89,-12-audio-playback-position/.gitignore | 13 + .../audio/tone-30s.mp3 | Bin 0 -> 481114 bytes .../images/scene-thumbnail.png | Bin 0 -> 85598 bytes .../89,-12-audio-playback-position/main.crdt | 0 .../package.json | 24 + .../89,-12-audio-playback-position/scene.json | 42 ++ .../src/index.ts | 545 ++++++++++++++++++ .../tsconfig.json | 11 + 9 files changed, 655 insertions(+) create mode 100644 scenes/89,-12-audio-playback-position/.dclignore create mode 100644 scenes/89,-12-audio-playback-position/.gitignore create mode 100644 scenes/89,-12-audio-playback-position/audio/tone-30s.mp3 create mode 100644 scenes/89,-12-audio-playback-position/images/scene-thumbnail.png create mode 100644 scenes/89,-12-audio-playback-position/main.crdt create mode 100644 scenes/89,-12-audio-playback-position/package.json create mode 100644 scenes/89,-12-audio-playback-position/scene.json create mode 100644 scenes/89,-12-audio-playback-position/src/index.ts create mode 100644 scenes/89,-12-audio-playback-position/tsconfig.json diff --git a/scenes/89,-12-audio-playback-position/.dclignore b/scenes/89,-12-audio-playback-position/.dclignore new file mode 100644 index 00000000..7499ff37 --- /dev/null +++ b/scenes/89,-12-audio-playback-position/.dclignore @@ -0,0 +1,20 @@ +.* +bin/*.map +package-lock.json +yarn-lock.json +build.json +export +tsconfig.json +tslint.json +node_modules +*.ts +*.tsx +.vscode +Dockerfile +dist +README.md +*.blend +*.fbx +*.zip +*.rar +src diff --git a/scenes/89,-12-audio-playback-position/.gitignore b/scenes/89,-12-audio-playback-position/.gitignore new file mode 100644 index 00000000..cccdd100 --- /dev/null +++ b/scenes/89,-12-audio-playback-position/.gitignore @@ -0,0 +1,13 @@ +package-lock.json +*.js +node_modules +bin/ +.DS_Store +**/.DS_Store +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.editor +.idea +.vscode +dclcontext diff --git a/scenes/89,-12-audio-playback-position/audio/tone-30s.mp3 b/scenes/89,-12-audio-playback-position/audio/tone-30s.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..bfd8ba7a4e113ac02fbf33ecdd2130182409c683 GIT binary patch literal 481114 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�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 VD1#s?5d{4e@}XZ{&``hi{{UW>VYdJP literal 0 HcmV?d00001 diff --git a/scenes/89,-12-audio-playback-position/images/scene-thumbnail.png b/scenes/89,-12-audio-playback-position/images/scene-thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..b3dc58066ba7870ca1cab4a9107cef7048ed538b GIT binary patch literal 85598 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 z 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 PdbrK*J$Ihi7MjHW)ybB8UO9Jo+8 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.0.0", + "npm": ">=6.0.0" + }, + "prettier": { + "semi": false, + "singleQuote": true, + "printWidth": 120, + "trailingComma": "none" + }, + "devDependencies": { + "@dcl/sdk": "https://sdk-team-cdn.decentraland.org/@dcl/js-sdk-toolchain/branch/feat/audio-event-playback-position/dcl-sdk-7.29.1-35100852387.commit-08e39ca.tgz", + "@dcl/js-runtime": "https://sdk-team-cdn.decentraland.org/@dcl/js-sdk-toolchain/branch/feat/audio-event-playback-position/@dcl/js-runtime/dcl-js-runtime-7.29.1-35100852387.commit-08e39ca.tgz" + } +} diff --git a/scenes/89,-12-audio-playback-position/scene.json b/scenes/89,-12-audio-playback-position/scene.json new file mode 100644 index 00000000..99e80d08 --- /dev/null +++ b/scenes/89,-12-audio-playback-position/scene.json @@ -0,0 +1,42 @@ +{ + "ecs7": true, + "runtimeVersion": "7", + "display": { + "title": "Audio Playback Position Reports Test", + "description": "Test scene for the AudioEvent playback-position reports (tickNumber, currentOffset, clipLength) written by the renderer while an AudioSource plays. Covers audioEventsSystem.registerAudioPlaybackEntity / removeAudioPlaybackEntity (push), getAudioPlayback (pull), the lag computation against a per-tick scene clock versus the naive processing-time clock, seek landing, loop wrap, and that registerAudioEventsEntity still fires only on media-state changes.", + "navmapThumbnail": "images/scene-thumbnail.png", + "favicon": "favicon_asset" + }, + "owner": "", + "contact": { + "name": "Decentraland", + "email": "developer@decentraland.org" + }, + "main": "bin/index.js", + "tags": ["audio", "test"], + "scene": { + "parcels": ["89,-12"], + "base": "89,-12" + }, + "spawnPoints": [ + { + "name": "spawn1", + "default": true, + "position": { + "x": [0, 3], + "y": [0, 0], + "z": [0, 3] + }, + "cameraTarget": { + "x": 8, + "y": 1, + "z": 8 + } + } + ], + "requiredPermissions": [], + "featureToggles": {}, + "worldConfiguration": { + "name": "sdk7testscenes.dcl.eth" + } +} diff --git a/scenes/89,-12-audio-playback-position/src/index.ts b/scenes/89,-12-audio-playback-position/src/index.ts new file mode 100644 index 00000000..20dc7540 --- /dev/null +++ b/scenes/89,-12-audio-playback-position/src/index.ts @@ -0,0 +1,545 @@ +/** + * Audio Playback Position Reports Test Scene + * + * Exercises the playback-position reports that renderers write into the AudioEvent component while an + * AudioSource clip plays (protocol decentraland/protocol#488, SDK decentraland/js-sdk-toolchain#1624, + * design record ADR-318 / decentraland/adr#324, Unity explorer decentraland/unity-explorer#10123). + * PBAudioEvent gained three OPTIONAL fields: + * - tickNumber scene tick (equals EngineInfo.tickNumber) in which the renderer sampled the position + * - currentOffset clip playback position in seconds at that tick + * - clipLength total clip length in seconds, when known + * `state` (MediaState) and `timestamp` (a per-entity monotonic counter, NOT a time) are unchanged. + * + * Why it matters: a renderer starts a clip 100-250 ms after being asked to (the delay varies per start) and + * AudioSource.currentTime is a write-only seek, so a scene could never learn where the audio actually is. + * With tickNumber the scene records its own clock per EngineInfo.tickNumber and computes + * lag = clockAtTick(report.tickNumber) - report.currentOffset * 1000 + * Comparing against the clock at the moment the report is PROCESSED would be wrong by the report's transport + * delay (several ticks); the "naive" line shows that error in-world. + * + * API under test (audioEventsSystem from '@dcl/sdk/ecs'): + * - registerAudioPlaybackEntity / removeAudioPlaybackEntity: callback on EVERY report, including the + * periodic position updates (push API) + * - getAudioPlayback(entity): latest report carrying currentOffset, or undefined (pull API) + * - registerAudioEventsEntity (pre-existing): still fires ONLY on media-state changes + * + * Buttons (front row, left to right): + * PLAY playSound from 0 with the current loop mode; resets the scene clock to 0 + * SEEK 10s createOrReplace with currentTime = 10 and playing = true (always emits a PUT, even when + * pressed twice); resets the scene clock to 10 s. The next report shows where the renderer + * actually landed. + * STOP stopSound (scene-initiated) + * TOGGLE LOOP flips AudioSource.loop. With loop ON, currentOffset wraps to 0 while state stays MS_PLAYING + * and the scene clock keeps counting, so lag grows by clipLength per wrap. Toggling re-sends + * the whole component: a renderer that restarts on a same-URL PUT restarts from currentTime, + * and the next report shows exactly that. Toggle before PLAY to see a clean wrap. + * PUSH CB unregisters / re-registers the playback callback (removeAudioPlaybackEntity); while off the + * push counter freezes but the pull panel keeps updating + * + * How to read the labels: + * CLOCK line current EngineInfo tick, the scene clock (expected playback position in ms since the last + * PLAY/SEEK), loop mode and AudioSource.playing + * PUSH panel registerAudioPlaybackEntity: callback counts, the last report's state / timestamp / + * tickNumber / currentOffset / clipLength, "audio behind clock by N ms" (correct lag via the + * clock recorded at report.tickNumber), the naive lag computed with the clock at processing + * time and their difference, report cadence (ms since the previous report) and transport + * delay (current tick - report tick) + * PULL panel getAudioPlayback(entity) polled every frame, with getAudioState for contrast + * DRIFT line lag now vs lag at the first position report after PLAY/SEEK + * STATE LOG registerAudioEventsEntity log plus both callback counts: the playback count keeps growing + * while the state count only moves on state changes, so position reports do not trigger it + * BEAT cubes the clip beeps on every whole second (pitch 440 Hz + 40 Hz per second, so a seek is + * audible). The CLOCK cube flashes on each whole second of the scene clock; the AUDIO cube + * flashes on each whole second of (clock - lag). The AUDIO cube should line up with what you + * hear; the CLOCK cube runs early by the lag. + * Renderers that never send currentOffset show "no position reports from this renderer" instead of NaN. + * + * Until the protocol and SDK PRs merge this scene needs the branch build of @dcl/sdk pinned in package.json, + * and only the Unity explorer branch produces position reports. + */ + +import { + engine, + Entity, + Transform, + MeshRenderer, + MeshCollider, + TextShape, + Billboard, + Material, + AudioSource, + EngineInfo, + audioEventsSystem, + MediaState, + PBAudioEvent, + pointerEventsSystem, + InputAction +} from '@dcl/sdk/ecs' +import { Color4, Vector3 } from '@dcl/sdk/math' + +// 30 s generated tone: a 120 ms beep on every whole second whose pitch rises 40 Hz per second, over a quiet hum. +const CLIP = 'audio/tone-30s.mp3' +const SEEK_TARGET_SECONDS = 10 +const TICK_HISTORY = 90 // ticks of scene clock kept for clockAtTick lookups (~3 s at 30 fps) +const NO_REPORTS_AFTER_MS = 3000 // playing this long with AudioEvent state but no position => older renderer +const BEAT_FLASH_MS = 120 + +// --------------------------------------------------------------------------- +// Layout helpers +// --------------------------------------------------------------------------- + +function createButton(position: Vector3, color: Color4): Entity { + const entity = engine.addEntity() + Transform.create(entity, { position, scale: Vector3.create(1.2, 1.2, 1.2) }) + MeshRenderer.setBox(entity) + MeshCollider.setBox(entity) + Material.setPbrMaterial(entity, { albedoColor: color }) + return entity +} + +function createLabel(position: Vector3, fontSize = 2, color: Color4 = Color4.White(), text = ''): Entity { + const entity = engine.addEntity() + Transform.create(entity, { position }) + TextShape.create(entity, { + text, + fontSize, + textColor: color, + outlineWidth: 0.1, + outlineColor: Color4.Black() + }) + Billboard.create(entity, {}) + return entity +} + +// Only touches the mutable component when the text changes, so per-frame refreshes do not emit CRDT traffic. +function setLabel(entity: Entity, text: string): void { + if (TextShape.get(entity).text === text) return + TextShape.getMutable(entity).text = text +} + +function mediaStateName(state: MediaState): string { + switch (state) { + case MediaState.MS_NONE: + return 'MS_NONE' + case MediaState.MS_ERROR: + return 'MS_ERROR' + case MediaState.MS_LOADING: + return 'MS_LOADING' + case MediaState.MS_READY: + return 'MS_READY' + case MediaState.MS_PLAYING: + return 'MS_PLAYING' + case MediaState.MS_BUFFERING: + return 'MS_BUFFERING' + case MediaState.MS_SEEKING: + return 'MS_SEEKING' + case MediaState.MS_PAUSED: + return 'MS_PAUSED' + default: + return `UNKNOWN(${state})` + } +} + +function fmtMs(value: number | undefined): string { + return value === undefined ? 'n/a' : `${Math.round(value)} ms` +} + +function fmtSeconds(value: number | undefined): string { + return value === undefined ? 'n/a' : `${value.toFixed(3)} s` +} + +// --------------------------------------------------------------------------- +// Scene clock: the playback position the scene EXPECTS, in ms, as if the renderer had reacted instantly +// to the last PLAY/SEEK. Recorded once per tick under EngineInfo.tickNumber so a report sampled at tick N +// can be compared with the clock at tick N, not with the clock when the report is processed. +// --------------------------------------------------------------------------- + +let clockOriginWallMs: number | undefined // Date.now() at the last PLAY/SEEK press; undefined until pressed +let clockOffsetMs = 0 // 0 after PLAY, 10000 after SEEK +let currentTick = -1 +const clockByTick = new Map() // tickNumber -> scene clock (ms) recorded in that tick + +function sceneClockMs(): number | undefined { + if (clockOriginWallMs === undefined) return undefined + return Date.now() - clockOriginWallMs + clockOffsetMs +} + +function recordSceneClock(): void { + const tick = EngineInfo.getOrNull(engine.RootEntity)?.tickNumber + if (tick === undefined) return + currentTick = tick + const clock = sceneClockMs() + if (clock === undefined) return + clockByTick.set(tick, clock) + // Map keeps insertion order, so the first key is the oldest tick. + while (clockByTick.size > TICK_HISTORY) { + const oldest = clockByTick.keys().next().value + if (oldest === undefined) break + clockByTick.delete(oldest) + } +} + +// Higher priority runs first: this tick's clock must be recorded before the SDK's audio-events system +// (default priority) delivers a report that may carry the current tickNumber. +engine.addSystem(recordSceneClock, 200000, 'record-scene-clock') + +// --------------------------------------------------------------------------- +// Audio entity +// --------------------------------------------------------------------------- + +const audioEntity = engine.addEntity() +Transform.create(audioEntity, { position: Vector3.create(8, 1, 8) }) +AudioSource.create(audioEntity, { + audioClipUrl: CLIP, + playing: false, + loop: false +}) + +// Bookkeeping for the readout only (not ECS state). +let playbackCallbackCount = 0 // registerAudioPlaybackEntity invocations (every report) +let positionReportCount = 0 // ...of which carried currentOffset +let stateCallbackCount = 0 // registerAudioEventsEntity invocations (state changes only) +let lastReportWallMs: number | undefined +let firstLagMs: number | undefined // lag at the first position report after PLAY/SEEK +let lastLagMs: number | undefined +let pushCallbackRegistered = false +const stateLog: string[] = [] + +// --------------------------------------------------------------------------- +// Readout labels +// --------------------------------------------------------------------------- + +const clockLabel = createLabel(Vector3.create(8, 5.6, 7), 2, Color4.Yellow(), 'tick n/a scene clock not started') +const pushLabel = createLabel( + Vector3.create(3.5, 3.6, 9), + 1.5, + Color4.create(0.5, 0.9, 1, 1), + 'registerAudioPlaybackEntity (push API, every report)\n(no report yet)' +) +const pullLabel = createLabel( + Vector3.create(8.5, 4.2, 9), + 1.5, + Color4.create(0.6, 1, 0.6, 1), + 'getAudioPlayback (pull API, polled every frame)\n(no report yet)' +) +const driftLabel = createLabel(Vector3.create(8.5, 2.6, 9), 1.5, Color4.create(1, 0.5, 0.2, 1), 'drift: n/a') +const stateLogLabel = createLabel( + Vector3.create(13, 3.6, 9), + 1.5, + Color4.create(1, 0.85, 0.5, 1), + 'registerAudioEventsEntity (state changes only)\n(none yet)' +) + +function renderStateLog(): void { + setLabel( + stateLogLabel, + [ + 'registerAudioEventsEntity (state changes only)', + `state callbacks ${stateCallbackCount} playback callbacks ${playbackCallbackCount}`, + ...(stateLog.length > 0 ? stateLog : ['(none yet)']) + ].join('\n') + ) +} + +function renderDrift(): void { + if (firstLagMs === undefined || lastLagMs === undefined) { + setLabel(driftLabel, 'drift: waiting for the first position report after PLAY/SEEK') + return + } + setLabel( + driftLabel, + `drift: lag now ${fmtMs(lastLagMs)} vs first report ${fmtMs(firstLagMs)} -> ${fmtMs(lastLagMs - firstLagMs)}\n` + + '(positive = audio falling further behind the clock)' + ) +} + +// --------------------------------------------------------------------------- +// Push API: registerAudioPlaybackEntity fires on every report, position updates included +// --------------------------------------------------------------------------- + +function onPlaybackReport(report: Readonly): void { + playbackCallbackCount++ + if (report.currentOffset !== undefined) positionReportCount++ + const wallNow = Date.now() + const cadenceMs = lastReportWallMs === undefined ? undefined : wallNow - lastReportWallMs + lastReportWallMs = wallNow + renderStateLog() + + const header = [ + 'registerAudioPlaybackEntity (push API, every report)', + `callbacks ${playbackCallbackCount} (with position ${positionReportCount})`, + `state ${mediaStateName(report.state)} timestamp ${report.timestamp}` + ] + + if (report.currentOffset === undefined) { + setLabel( + pushLabel, + [...header, 'no currentOffset in this report (state-only)', `cadence ${fmtMs(cadenceMs)}`].join('\n') + ) + return + } + + const offsetMs = report.currentOffset * 1000 + const clockAtTick = report.tickNumber === undefined ? undefined : clockByTick.get(report.tickNumber) + const clockNow = sceneClockMs() + const lagMs = clockAtTick === undefined ? undefined : clockAtTick - offsetMs + const naiveLagMs = clockNow === undefined ? undefined : clockNow - offsetMs + const transportTicks = report.tickNumber === undefined ? undefined : currentTick - report.tickNumber + + if (lagMs !== undefined) { + lastLagMs = lagMs + if (firstLagMs === undefined) firstLagMs = lagMs + } + + let lagLine: string + if (lagMs !== undefined) { + lagLine = `audio behind clock by ${fmtMs(lagMs)} (clock at tick ${report.tickNumber}: ${fmtMs(clockAtTick)})` + } else if (report.tickNumber === undefined) { + lagLine = 'audio behind clock by: n/a (report has no tickNumber)' + } else { + lagLine = + `audio behind clock by: n/a (tick ${report.tickNumber} not in clock history:\n` + + `sampled before PLAY/SEEK or older than ${TICK_HISTORY} ticks)` + } + + const naiveLine = + lagMs !== undefined && naiveLagMs !== undefined + ? `naive (clock at processing time) ${fmtMs(naiveLagMs)} difference ${fmtMs(naiveLagMs - lagMs)}` + : `naive (clock at processing time) ${fmtMs(naiveLagMs)}` + + const lines = [ + ...header, + `tickNumber ${report.tickNumber ?? 'n/a'} currentOffset ${fmtSeconds(report.currentOffset)} clipLength ${fmtSeconds( + report.clipLength + )}`, + lagLine, + naiveLine, + `cadence ${fmtMs(cadenceMs)} transport delay ${transportTicks === undefined ? 'n/a' : `${transportTicks} ticks`}` + ] + if (AudioSource.get(audioEntity).loop) { + lines.push('loop ON: offset wraps while the clock keeps counting, so lag grows by clipLength per wrap') + } + setLabel(pushLabel, lines.join('\n')) + renderDrift() +} + +function setPushCallback(enabled: boolean): void { + if (enabled) { + audioEventsSystem.registerAudioPlaybackEntity(audioEntity, onPlaybackReport) + } else { + audioEventsSystem.removeAudioPlaybackEntity(audioEntity) + } + pushCallbackRegistered = enabled +} + +setPushCallback(true) + +// --------------------------------------------------------------------------- +// State-change API: registerAudioEventsEntity must NOT fire for position reports that keep the same state +// --------------------------------------------------------------------------- + +audioEventsSystem.registerAudioEventsEntity(audioEntity, (event) => { + stateCallbackCount++ + const position = event.currentOffset === undefined ? '' : ` offset ${fmtSeconds(event.currentOffset)}` + stateLog.push(`${mediaStateName(event.state)} @ts ${event.timestamp}${position}`) + if (stateLog.length > 6) stateLog.shift() + renderStateLog() +}) + +// --------------------------------------------------------------------------- +// Beat cubes: visual check of clock vs (clock - lag) against the audible beep on every whole second +// --------------------------------------------------------------------------- + +type BeatCube = { entity: Entity; color: Color4; lastSecond: number; flashUntil: number; lit: boolean } + +function createBeatCube(position: Vector3, color: Color4, text: string): BeatCube { + const entity = engine.addEntity() + Transform.create(entity, { position, scale: Vector3.create(0.8, 0.8, 0.8) }) + MeshRenderer.setBox(entity) + Material.setPbrMaterial(entity, { albedoColor: color }) + createLabel(Vector3.create(position.x, position.y + 1.1, position.z), 1.6, Color4.White(), text) + return { entity, color, lastSecond: -1, flashUntil: 0, lit: false } +} + +function updateBeat(cube: BeatCube, positionMs: number | undefined, wallNow: number): void { + if (positionMs !== undefined) { + const second = Math.floor(positionMs / 1000) + if (second !== cube.lastSecond) { + cube.lastSecond = second + cube.flashUntil = wallNow + BEAT_FLASH_MS + } + } + const lit = wallNow < cube.flashUntil + if (lit === cube.lit) return + cube.lit = lit + Material.setPbrMaterial(cube.entity, { albedoColor: lit ? Color4.White() : cube.color }) +} + +const clockBeat = createBeatCube( + Vector3.create(1.5, 1, 4), + Color4.create(0.6, 0.6, 0.1, 1), + 'CLOCK beat\n(scene clock)' +) +const audioBeat = createBeatCube( + Vector3.create(14.5, 1, 4), + Color4.create(0.1, 0.5, 0.6, 1), + 'AUDIO beat\n(clock - lag)' +) + +// --------------------------------------------------------------------------- +// Buttons +// --------------------------------------------------------------------------- + +// Restarts the scene clock at `offsetMs` (0 for PLAY, 10000 for SEEK) and forgets everything measured against +// the previous origin. +function startClock(offsetMs: number): void { + clockOriginWallMs = Date.now() + clockOffsetMs = offsetMs + clockByTick.clear() + firstLagMs = undefined + lastLagMs = undefined + clockBeat.lastSecond = -1 + audioBeat.lastSecond = -1 + recordSceneClock() + renderDrift() +} + +const btnPlay = createButton(Vector3.create(4, 1, 4), Color4.create(0.2, 0.8, 0.2, 1)) +createLabel(Vector3.create(4, 2.3, 4), 2, Color4.White(), 'PLAY') +pointerEventsSystem.onPointerDown( + { entity: btnPlay, opts: { button: InputAction.IA_POINTER, hoverText: 'Play from 0 (resets the scene clock)' } }, + () => { + AudioSource.playSound(audioEntity, CLIP, true) + startClock(0) + } +) + +const btnSeek = createButton(Vector3.create(6, 1, 4), Color4.create(0.2, 0.4, 0.9, 1)) +createLabel(Vector3.create(6, 2.3, 4), 2, Color4.White(), `SEEK ${SEEK_TARGET_SECONDS}s`) +pointerEventsSystem.onPointerDown( + { + entity: btnSeek, + opts: { button: InputAction.IA_POINTER, hoverText: `Seek to ${SEEK_TARGET_SECONDS}s and play (clock = 10 s)` } + }, + () => { + // createOrReplace always emits a PUT, even when playing/currentTime are unchanged (SEEK pressed twice), so + // the renderer re-seeks every time. Hand-mutating via getMutable would be deduped when nothing changed. + AudioSource.createOrReplace(audioEntity, { + ...AudioSource.get(audioEntity), + playing: true, + currentTime: SEEK_TARGET_SECONDS + }) + startClock(SEEK_TARGET_SECONDS * 1000) + } +) + +const btnStop = createButton(Vector3.create(8, 1, 4), Color4.create(0.8, 0.2, 0.2, 1)) +createLabel(Vector3.create(8, 2.3, 4), 2, Color4.White(), 'STOP') +pointerEventsSystem.onPointerDown( + { entity: btnStop, opts: { button: InputAction.IA_POINTER, hoverText: 'Stop (scene-initiated)' } }, + () => { + AudioSource.stopSound(audioEntity, true) + } +) + +const btnLoop = createButton(Vector3.create(10, 1, 4), Color4.create(0.7, 0.4, 0.9, 1)) +createLabel(Vector3.create(10, 2.3, 4), 2, Color4.White(), 'TOGGLE LOOP') +pointerEventsSystem.onPointerDown( + { entity: btnLoop, opts: { button: InputAction.IA_POINTER, hoverText: 'Toggle AudioSource.loop' } }, + () => { + const source = AudioSource.getMutable(audioEntity) + source.loop = !source.loop + } +) + +const btnPushCallback = createButton(Vector3.create(12, 1, 4), Color4.create(0.5, 0.5, 0.5, 1)) +const pushCallbackLabel = createLabel(Vector3.create(12, 2.3, 4), 2, Color4.White(), 'PUSH CB: ON') +pointerEventsSystem.onPointerDown( + { + entity: btnPushCallback, + opts: { button: InputAction.IA_POINTER, hoverText: 'registerAudioPlaybackEntity / removeAudioPlaybackEntity' } + }, + () => { + setPushCallback(!pushCallbackRegistered) + setLabel(pushCallbackLabel, `PUSH CB: ${pushCallbackRegistered ? 'ON' : 'OFF'}`) + } +) + +// --------------------------------------------------------------------------- +// Per-frame readout: clock line, pull API, beat cubes +// --------------------------------------------------------------------------- + +engine.addSystem(() => { + const source = AudioSource.get(audioEntity) + const playing = source.playing ?? false + const clock = sceneClockMs() + const wallNow = Date.now() + + setLabel( + clockLabel, + `tick ${currentTick} scene clock ${clock === undefined ? 'not started (press PLAY)' : fmtMs(clock)} ` + + `loop ${source.loop ? 'ON' : 'OFF'} AudioSource.playing=${playing}` + ) + + const playback = audioEventsSystem.getAudioPlayback(audioEntity) + const state = audioEventsSystem.getAudioState(audioEntity) + const stateLine = + state === undefined + ? 'getAudioState(entity): undefined (no AudioEvent from the renderer yet)' + : `getAudioState(entity): ${mediaStateName(state.state)} @ts ${state.timestamp}` + + const lines = ['getAudioPlayback (pull API, polled every frame)'] + if (playback === undefined) { + const sincePressMs = clock === undefined ? undefined : clock - clockOffsetMs + lines.push('getAudioPlayback(entity): undefined') + if (clock === undefined) { + lines.push('press PLAY') + } else if (sincePressMs !== undefined && sincePressMs > NO_REPORTS_AFTER_MS && stateCallbackCount > 0) { + lines.push('no position reports from this renderer (older renderer)') + } else { + lines.push('waiting for the first position report...') + } + } else { + lines.push( + `getAudioPlayback(entity): tick ${playback.tickNumber ?? 'n/a'} offset ${fmtSeconds(playback.currentOffset)} ` + + `length ${fmtSeconds(playback.clipLength)} ${mediaStateName(playback.state)}` + ) + if (playback.tickNumber !== undefined) { + lines.push(`report age ${currentTick - playback.tickNumber} ticks (current tick ${currentTick})`) + } + } + lines.push(stateLine) + setLabel(pullLabel, lines.join('\n')) + + updateBeat(clockBeat, playing ? clock : undefined, wallNow) + updateBeat( + audioBeat, + playing && clock !== undefined && lastLagMs !== undefined ? clock - lastLagMs : undefined, + wallNow + ) +}) + +// --------------------------------------------------------------------------- +// Scene setup +// --------------------------------------------------------------------------- + +function addGround(): void { + const ground = engine.addEntity() + Transform.create(ground, { position: Vector3.create(8, -0.05, 8), scale: Vector3.create(16, 0.1, 16) }) + MeshRenderer.setBox(ground) + Material.setPbrMaterial(ground, { albedoColor: Color4.create(0.15, 0.15, 0.15, 1) }) +} + +function addTitle(): void { + createLabel( + Vector3.create(8, 7.2, 8), + 2.5, + Color4.White(), + 'Audio Playback Position Reports Test\n' + + 'PLAY, then compare "audio behind clock" (via tickNumber) with the naive value.\n' + + 'SEEK 10s shows where the renderer lands; TOGGLE LOOP before PLAY shows currentOffset wrapping.' + ) +} + +addGround() +addTitle() diff --git a/scenes/89,-12-audio-playback-position/tsconfig.json b/scenes/89,-12-audio-playback-position/tsconfig.json new file mode 100644 index 00000000..d84fa280 --- /dev/null +++ b/scenes/89,-12-audio-playback-position/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "allowJs": true, + "strict": true + }, + "include": [ + "src/**/*.ts", + "src/**/*.tsx" + ], + "extends": "@dcl/sdk/types/tsconfig.ecs7.json" +} \ No newline at end of file From 5e7d2f4ec69f38735227a6cd1e3caca645f3438d Mon Sep 17 00:00:00 2001 From: LautaroPetaccio Date: Thu, 17 Sep 2026 11:06:05 -0300 Subject: [PATCH 2/5] refactor(89,-12): make the audio position scene a showcase Three large beat cubes now sit centre stage: CLOCK flashes on the scene clock, AUDIO on clock minus the lag measured through tickNumber, NAIVE on clock minus the lag measured at processing time. With the beeping clip the AUDIO cube lines up with what is heard, CLOCK runs early by the start delay, and NAIVE is off by the report's transport delay, which is the whole reason the field is a tick and not a timestamp. Three buttons in front (PLAY, SEEK, STOP), one headline that states the result in a sentence, one compact panel with the measured numbers. The rest of the API coverage (getAudioPlayback polling, getAudioState, both callback counts, the state log, loop wrap, callback unregistering) moves to a side panel and two small corner buttons. No coverage removed. --- .../src/index.ts | 575 +++++++----------- 1 file changed, 224 insertions(+), 351 deletions(-) diff --git a/scenes/89,-12-audio-playback-position/src/index.ts b/scenes/89,-12-audio-playback-position/src/index.ts index 20dc7540..7e236e74 100644 --- a/scenes/89,-12-audio-playback-position/src/index.ts +++ b/scenes/89,-12-audio-playback-position/src/index.ts @@ -1,63 +1,43 @@ /** - * Audio Playback Position Reports Test Scene + * Audio Playback Position Reports + * + * One idea, made visible: a renderer starts a clip 100-250 ms after being asked to, so a scene that trusts its own + * clock runs early against the sound. Renderers now report the clip position into the AudioEvent component while + * a clip plays (protocol decentraland/protocol#488, SDK decentraland/js-sdk-toolchain#1624, ADR-318 + * decentraland/adr#324, Unity explorer decentraland/unity-explorer#10123), and a scene can correct itself. * - * Exercises the playback-position reports that renderers write into the AudioEvent component while an - * AudioSource clip plays (protocol decentraland/protocol#488, SDK decentraland/js-sdk-toolchain#1624, - * design record ADR-318 / decentraland/adr#324, Unity explorer decentraland/unity-explorer#10123). * PBAudioEvent gained three OPTIONAL fields: * - tickNumber scene tick (equals EngineInfo.tickNumber) in which the renderer sampled the position * - currentOffset clip playback position in seconds at that tick * - clipLength total clip length in seconds, when known * `state` (MediaState) and `timestamp` (a per-entity monotonic counter, NOT a time) are unchanged. * - * Why it matters: a renderer starts a clip 100-250 ms after being asked to (the delay varies per start) and - * AudioSource.currentTime is a write-only seek, so a scene could never learn where the audio actually is. - * With tickNumber the scene records its own clock per EngineInfo.tickNumber and computes + * THE DEMO: three cubes behind the buttons, and a clip that beeps on every whole second. + * CLOCK flashes on each whole second of the scene clock (what the scene assumes the audio is doing) + * AUDIO flashes on each whole second of (clock - lag), lag measured through tickNumber + * NAIVE flashes on each whole second of (clock - naive lag), naive lag measured at processing time + * Press PLAY and listen. AUDIO lines up with the beeps. CLOCK runs early by the start delay. NAIVE is off by + * the report's transport delay: a report says where the clip was at tick N but reaches the scene a few ticks + * later, so comparing it with the clock at processing time is wrong by exactly that gap. That gap is why the + * field is a tick and not a timestamp: the scene keeps its own clock per EngineInfo.tickNumber and looks the + * report's tick up: * lag = clockAtTick(report.tickNumber) - report.currentOffset * 1000 - * Comparing against the clock at the moment the report is PROCESSED would be wrong by the report's transport - * delay (several ticks); the "naive" line shows that error in-world. - * - * API under test (audioEventsSystem from '@dcl/sdk/ecs'): - * - registerAudioPlaybackEntity / removeAudioPlaybackEntity: callback on EVERY report, including the - * periodic position updates (push API) - * - getAudioPlayback(entity): latest report carrying currentOffset, or undefined (pull API) - * - registerAudioEventsEntity (pre-existing): still fires ONLY on media-state changes * - * Buttons (front row, left to right): - * PLAY playSound from 0 with the current loop mode; resets the scene clock to 0 - * SEEK 10s createOrReplace with currentTime = 10 and playing = true (always emits a PUT, even when - * pressed twice); resets the scene clock to 10 s. The next report shows where the renderer - * actually landed. - * STOP stopSound (scene-initiated) - * TOGGLE LOOP flips AudioSource.loop. With loop ON, currentOffset wraps to 0 while state stays MS_PLAYING - * and the scene clock keeps counting, so lag grows by clipLength per wrap. Toggling re-sends - * the whole component: a renderer that restarts on a same-URL PUT restarts from currentTime, - * and the next report shows exactly that. Toggle before PLAY to see a clean wrap. - * PUSH CB unregisters / re-registers the playback callback (removeAudioPlaybackEntity); while off the - * push counter freezes but the pull panel keeps updating + * Buttons: PLAY (from 0, clock -> 0), SEEK 10s (currentTime = 10, clock -> 10 s; the next report shows where the + * renderer actually landed), STOP. Corner buttons cover the rest of the API: LOOP toggles AudioSource.loop (the + * offset wraps while the clock keeps counting), PUSH CB unregisters and re-registers the playback callback. * - * How to read the labels: - * CLOCK line current EngineInfo tick, the scene clock (expected playback position in ms since the last - * PLAY/SEEK), loop mode and AudioSource.playing - * PUSH panel registerAudioPlaybackEntity: callback counts, the last report's state / timestamp / - * tickNumber / currentOffset / clipLength, "audio behind clock by N ms" (correct lag via the - * clock recorded at report.tickNumber), the naive lag computed with the clock at processing - * time and their difference, report cadence (ms since the previous report) and transport - * delay (current tick - report tick) - * PULL panel getAudioPlayback(entity) polled every frame, with getAudioState for contrast - * DRIFT line lag now vs lag at the first position report after PLAY/SEEK - * STATE LOG registerAudioEventsEntity log plus both callback counts: the playback count keeps growing - * while the state count only moves on state changes, so position reports do not trigger it - * BEAT cubes the clip beeps on every whole second (pitch 440 Hz + 40 Hz per second, so a seek is - * audible). The CLOCK cube flashes on each whole second of the scene clock; the AUDIO cube - * flashes on each whole second of (clock - lag). The AUDIO cube should line up with what you - * hear; the CLOCK cube runs early by the lag. - * Renderers that never send currentOffset show "no position reports from this renderer" instead of NaN. + * API under test (audioEventsSystem from '@dcl/sdk/ecs'): + * - registerAudioPlaybackEntity / removeAudioPlaybackEntity: callback on EVERY report, position updates + * included (drives the readout) + * - getAudioPlayback(entity): latest report carrying currentOffset, or undefined (polled, shown in the side panel) + * - registerAudioEventsEntity (pre-existing): still fires ONLY on media-state changes (side panel counts both + * callbacks so the difference is visible) + * Renderers that never send a position show "no position reports from this renderer" and only CLOCK flashes. * * Until the protocol and SDK PRs merge this scene needs the branch build of @dcl/sdk pinned in package.json, * and only the Unity explorer branch produces position reports. */ - import { engine, Entity, @@ -85,12 +65,11 @@ const NO_REPORTS_AFTER_MS = 3000 // playing this long with AudioEvent state but const BEAT_FLASH_MS = 120 // --------------------------------------------------------------------------- -// Layout helpers +// Helpers // --------------------------------------------------------------------------- - -function createButton(position: Vector3, color: Color4): Entity { +function createButton(position: Vector3, color: Color4, scale = 1.2): Entity { const entity = engine.addEntity() - Transform.create(entity, { position, scale: Vector3.create(1.2, 1.2, 1.2) }) + Transform.create(entity, { position, scale: Vector3.create(scale, scale, scale) }) MeshRenderer.setBox(entity) MeshCollider.setBox(entity) Material.setPbrMaterial(entity, { albedoColor: color }) @@ -100,13 +79,7 @@ function createButton(position: Vector3, color: Color4): Entity { function createLabel(position: Vector3, fontSize = 2, color: Color4 = Color4.White(), text = ''): Entity { const entity = engine.addEntity() Transform.create(entity, { position }) - TextShape.create(entity, { - text, - fontSize, - textColor: color, - outlineWidth: 0.1, - outlineColor: Color4.Black() - }) + TextShape.create(entity, { text, fontSize, textColor: color, outlineWidth: 0.1, outlineColor: Color4.Black() }) Billboard.create(entity, {}) return entity } @@ -140,28 +113,21 @@ function mediaStateName(state: MediaState): string { } } -function fmtMs(value: number | undefined): string { - return value === undefined ? 'n/a' : `${Math.round(value)} ms` -} - -function fmtSeconds(value: number | undefined): string { - return value === undefined ? 'n/a' : `${value.toFixed(3)} s` -} +const fmtMs = (value: number | undefined) => (value === undefined ? 'n/a' : `${Math.round(value)} ms`) +const fmtSeconds = (value: number | undefined) => (value === undefined ? 'n/a' : `${value.toFixed(2)} s`) // --------------------------------------------------------------------------- -// Scene clock: the playback position the scene EXPECTS, in ms, as if the renderer had reacted instantly -// to the last PLAY/SEEK. Recorded once per tick under EngineInfo.tickNumber so a report sampled at tick N -// can be compared with the clock at tick N, not with the clock when the report is processed. +// Scene clock: the position the scene EXPECTS, in ms, as if the renderer had reacted instantly to the last +// PLAY/SEEK. Recorded once per tick under EngineInfo.tickNumber so a report sampled at tick N is compared with +// the clock at tick N, not with the clock when the report is processed. // --------------------------------------------------------------------------- - -let clockOriginWallMs: number | undefined // Date.now() at the last PLAY/SEEK press; undefined until pressed +let clockOriginWallMs: number | undefined // Date.now() at the last PLAY/SEEK; undefined until pressed let clockOffsetMs = 0 // 0 after PLAY, 10000 after SEEK let currentTick = -1 -const clockByTick = new Map() // tickNumber -> scene clock (ms) recorded in that tick +const clockByTick = new Map() function sceneClockMs(): number | undefined { - if (clockOriginWallMs === undefined) return undefined - return Date.now() - clockOriginWallMs + clockOffsetMs + return clockOriginWallMs === undefined ? undefined : Date.now() - clockOriginWallMs + clockOffsetMs } function recordSceneClock(): void { @@ -171,259 +137,211 @@ function recordSceneClock(): void { const clock = sceneClockMs() if (clock === undefined) return clockByTick.set(tick, clock) - // Map keeps insertion order, so the first key is the oldest tick. while (clockByTick.size > TICK_HISTORY) { const oldest = clockByTick.keys().next().value if (oldest === undefined) break clockByTick.delete(oldest) } } - -// Higher priority runs first: this tick's clock must be recorded before the SDK's audio-events system -// (default priority) delivers a report that may carry the current tickNumber. +// Higher priority runs first: this tick's clock must exist before the SDK's audio-events system (default +// priority) delivers a report that may carry the current tickNumber. engine.addSystem(recordSceneClock, 200000, 'record-scene-clock') // --------------------------------------------------------------------------- -// Audio entity +// Audio entity and measurements // --------------------------------------------------------------------------- - const audioEntity = engine.addEntity() Transform.create(audioEntity, { position: Vector3.create(8, 1, 8) }) -AudioSource.create(audioEntity, { - audioClipUrl: CLIP, - playing: false, - loop: false -}) +AudioSource.create(audioEntity, { audioClipUrl: CLIP, playing: false, loop: false }) -// Bookkeeping for the readout only (not ECS state). -let playbackCallbackCount = 0 // registerAudioPlaybackEntity invocations (every report) -let positionReportCount = 0 // ...of which carried currentOffset -let stateCallbackCount = 0 // registerAudioEventsEntity invocations (state changes only) +let lagMs: number | undefined // clockAtTick(report.tickNumber) - offset: the correct figure +let naiveLagMs: number | undefined // clock at processing time - offset: wrong by the transport delay +let firstLagMs: number | undefined let lastReportWallMs: number | undefined -let firstLagMs: number | undefined // lag at the first position report after PLAY/SEEK -let lastLagMs: number | undefined +let playbackCallbackCount = 0 +let positionReportCount = 0 +let stateCallbackCount = 0 let pushCallbackRegistered = false const stateLog: string[] = [] // --------------------------------------------------------------------------- -// Readout labels +// The demo: three beat cubes, centre stage // --------------------------------------------------------------------------- +type BeatCube = { entity: Entity; color: Color4; lastSecond: number; flashUntil: number; lit: boolean } + +function createBeatCube(position: Vector3, color: Color4, caption: string): BeatCube { + const entity = engine.addEntity() + Transform.create(entity, { position, scale: Vector3.create(2.2, 2.2, 2.2) }) + MeshRenderer.setBox(entity) + Material.setPbrMaterial(entity, { albedoColor: color }) + createLabel(Vector3.create(position.x, position.y + 1.9, position.z), 2.2, Color4.White(), caption) + return { entity, color, lastSecond: -1, flashUntil: 0, lit: false } +} -const clockLabel = createLabel(Vector3.create(8, 5.6, 7), 2, Color4.Yellow(), 'tick n/a scene clock not started') -const pushLabel = createLabel( - Vector3.create(3.5, 3.6, 9), - 1.5, - Color4.create(0.5, 0.9, 1, 1), - 'registerAudioPlaybackEntity (push API, every report)\n(no report yet)' +function updateBeat(cube: BeatCube, positionMs: number | undefined, wallNow: number): void { + if (positionMs !== undefined) { + const second = Math.floor(positionMs / 1000) + if (second !== cube.lastSecond) { + cube.lastSecond = second + cube.flashUntil = wallNow + BEAT_FLASH_MS + } + } + const lit = wallNow < cube.flashUntil + if (lit === cube.lit) return + cube.lit = lit + Material.setPbrMaterial(cube.entity, { albedoColor: lit ? Color4.White() : cube.color }) +} + +const clockBeat = createBeatCube( + Vector3.create(4, 2.6, 9), + Color4.create(0.75, 0.6, 0.1, 1), + 'CLOCK\nwhat the scene assumes' ) -const pullLabel = createLabel( - Vector3.create(8.5, 4.2, 9), - 1.5, - Color4.create(0.6, 1, 0.6, 1), - 'getAudioPlayback (pull API, polled every frame)\n(no report yet)' +const audioBeat = createBeatCube( + Vector3.create(8, 2.6, 9), + Color4.create(0.1, 0.6, 0.7, 1), + 'AUDIO\nclock - lag (via tickNumber)' ) -const driftLabel = createLabel(Vector3.create(8.5, 2.6, 9), 1.5, Color4.create(1, 0.5, 0.2, 1), 'drift: n/a') -const stateLogLabel = createLabel( - Vector3.create(13, 3.6, 9), - 1.5, - Color4.create(1, 0.85, 0.5, 1), - 'registerAudioEventsEntity (state changes only)\n(none yet)' +const naiveBeat = createBeatCube( + Vector3.create(12, 2.6, 9), + Color4.create(0.7, 0.25, 0.25, 1), + 'NAIVE\nclock - lag (at processing time)' ) -function renderStateLog(): void { - setLabel( - stateLogLabel, - [ - 'registerAudioEventsEntity (state changes only)', - `state callbacks ${stateCallbackCount} playback callbacks ${playbackCallbackCount}`, - ...(stateLog.length > 0 ? stateLog : ['(none yet)']) - ].join('\n') - ) -} +// --------------------------------------------------------------------------- +// Readouts: one headline under the cubes, one compact panel, one side panel for the rest of the API +// --------------------------------------------------------------------------- +const headline = createLabel( + Vector3.create(8, 6.4, 9), + 2.6, + Color4.Yellow(), + 'Press PLAY, then listen: which cube flashes with the beep?' +) +const panel = createLabel(Vector3.create(8, 5.1, 9), 1.6, Color4.create(0.85, 0.95, 1, 1), '') +const sidePanel = createLabel(Vector3.create(14.6, 4.6, 6), 1.3, Color4.create(1, 0.85, 0.5, 1), '') -function renderDrift(): void { - if (firstLagMs === undefined || lastLagMs === undefined) { - setLabel(driftLabel, 'drift: waiting for the first position report after PLAY/SEEK') +function renderPanel(): void { + const clock = sceneClockMs() + if (clock === undefined) { + setLabel(panel, 'scene clock: not started') return } - setLabel( - driftLabel, - `drift: lag now ${fmtMs(lastLagMs)} vs first report ${fmtMs(firstLagMs)} -> ${fmtMs(lastLagMs - firstLagMs)}\n` + - '(positive = audio falling further behind the clock)' + const lines = [`scene clock ${fmtMs(clock)} tick ${currentTick}`] + if (lagMs === undefined) { + const sincePress = clock - clockOffsetMs + lines.push( + sincePress > NO_REPORTS_AFTER_MS && stateCallbackCount > 0 + ? 'no position reports from this renderer (only CLOCK flashes)' + : 'waiting for the first position report...' + ) + } else { + lines.push(`audio behind clock by ${fmtMs(lagMs)} (correct: clock looked up at the report's tick)`) + lines.push(`naive figure ${fmtMs(naiveLagMs)} (clock at processing time; off by the transport delay)`) + if (firstLagMs !== undefined) lines.push(`drift since first report ${fmtMs(lagMs - firstLagMs)}`) + } + setLabel(panel, lines.join('\n')) +} + +function renderSidePanel(playback: PBAudioEvent | undefined, state: PBAudioEvent | undefined): void { + const lines = ['audioEventsSystem'] + lines.push(`playback callbacks ${playbackCallbackCount} (${positionReportCount} with position)`) + lines.push(`state callbacks ${stateCallbackCount} push callback ${pushCallbackRegistered ? 'ON' : 'OFF'}`) + lines.push( + playback === undefined + ? 'getAudioPlayback: undefined' + : `getAudioPlayback: tick ${playback.tickNumber ?? 'n/a'} offset ${fmtSeconds(playback.currentOffset)} ` + + `length ${fmtSeconds(playback.clipLength)} age ${ + playback.tickNumber === undefined ? 'n/a' : `${currentTick - playback.tickNumber} ticks` + }` ) + lines.push( + state === undefined + ? 'getAudioState: undefined' + : `getAudioState: ${mediaStateName(state.state)} @ts ${state.timestamp}` + ) + lines.push(`loop ${AudioSource.get(audioEntity).loop ? 'ON' : 'OFF'}`) + lines.push('state log (registerAudioEventsEntity):') + lines.push(...(stateLog.length > 0 ? stateLog : ['(none yet)'])) + setLabel(sidePanel, lines.join('\n')) } // --------------------------------------------------------------------------- -// Push API: registerAudioPlaybackEntity fires on every report, position updates included +// Push API: every report, position updates included // --------------------------------------------------------------------------- - function onPlaybackReport(report: Readonly): void { playbackCallbackCount++ - if (report.currentOffset !== undefined) positionReportCount++ - const wallNow = Date.now() - const cadenceMs = lastReportWallMs === undefined ? undefined : wallNow - lastReportWallMs - lastReportWallMs = wallNow - renderStateLog() - - const header = [ - 'registerAudioPlaybackEntity (push API, every report)', - `callbacks ${playbackCallbackCount} (with position ${positionReportCount})`, - `state ${mediaStateName(report.state)} timestamp ${report.timestamp}` - ] - - if (report.currentOffset === undefined) { - setLabel( - pushLabel, - [...header, 'no currentOffset in this report (state-only)', `cadence ${fmtMs(cadenceMs)}`].join('\n') - ) - return - } - + lastReportWallMs = Date.now() + if (report.currentOffset === undefined) return + positionReportCount++ const offsetMs = report.currentOffset * 1000 const clockAtTick = report.tickNumber === undefined ? undefined : clockByTick.get(report.tickNumber) const clockNow = sceneClockMs() - const lagMs = clockAtTick === undefined ? undefined : clockAtTick - offsetMs - const naiveLagMs = clockNow === undefined ? undefined : clockNow - offsetMs - const transportTicks = report.tickNumber === undefined ? undefined : currentTick - report.tickNumber - - if (lagMs !== undefined) { - lastLagMs = lagMs + if (clockAtTick !== undefined) { + lagMs = clockAtTick - offsetMs if (firstLagMs === undefined) firstLagMs = lagMs } - - let lagLine: string - if (lagMs !== undefined) { - lagLine = `audio behind clock by ${fmtMs(lagMs)} (clock at tick ${report.tickNumber}: ${fmtMs(clockAtTick)})` - } else if (report.tickNumber === undefined) { - lagLine = 'audio behind clock by: n/a (report has no tickNumber)' - } else { - lagLine = - `audio behind clock by: n/a (tick ${report.tickNumber} not in clock history:\n` + - `sampled before PLAY/SEEK or older than ${TICK_HISTORY} ticks)` - } - - const naiveLine = - lagMs !== undefined && naiveLagMs !== undefined - ? `naive (clock at processing time) ${fmtMs(naiveLagMs)} difference ${fmtMs(naiveLagMs - lagMs)}` - : `naive (clock at processing time) ${fmtMs(naiveLagMs)}` - - const lines = [ - ...header, - `tickNumber ${report.tickNumber ?? 'n/a'} currentOffset ${fmtSeconds(report.currentOffset)} clipLength ${fmtSeconds( - report.clipLength - )}`, - lagLine, - naiveLine, - `cadence ${fmtMs(cadenceMs)} transport delay ${transportTicks === undefined ? 'n/a' : `${transportTicks} ticks`}` - ] - if (AudioSource.get(audioEntity).loop) { - lines.push('loop ON: offset wraps while the clock keeps counting, so lag grows by clipLength per wrap') - } - setLabel(pushLabel, lines.join('\n')) - renderDrift() + if (clockNow !== undefined) naiveLagMs = clockNow - offsetMs } function setPushCallback(enabled: boolean): void { - if (enabled) { - audioEventsSystem.registerAudioPlaybackEntity(audioEntity, onPlaybackReport) - } else { - audioEventsSystem.removeAudioPlaybackEntity(audioEntity) - } + if (enabled) audioEventsSystem.registerAudioPlaybackEntity(audioEntity, onPlaybackReport) + else audioEventsSystem.removeAudioPlaybackEntity(audioEntity) pushCallbackRegistered = enabled } - setPushCallback(true) -// --------------------------------------------------------------------------- -// State-change API: registerAudioEventsEntity must NOT fire for position reports that keep the same state -// --------------------------------------------------------------------------- - +// State-change API: must NOT fire for position reports that keep the same state audioEventsSystem.registerAudioEventsEntity(audioEntity, (event) => { stateCallbackCount++ - const position = event.currentOffset === undefined ? '' : ` offset ${fmtSeconds(event.currentOffset)}` - stateLog.push(`${mediaStateName(event.state)} @ts ${event.timestamp}${position}`) - if (stateLog.length > 6) stateLog.shift() - renderStateLog() + stateLog.push(`${mediaStateName(event.state)} @ts ${event.timestamp}`) + if (stateLog.length > 5) stateLog.shift() }) // --------------------------------------------------------------------------- -// Beat cubes: visual check of clock vs (clock - lag) against the audible beep on every whole second +// Buttons: three in front, two in the corner // --------------------------------------------------------------------------- - -type BeatCube = { entity: Entity; color: Color4; lastSecond: number; flashUntil: number; lit: boolean } - -function createBeatCube(position: Vector3, color: Color4, text: string): BeatCube { - const entity = engine.addEntity() - Transform.create(entity, { position, scale: Vector3.create(0.8, 0.8, 0.8) }) - MeshRenderer.setBox(entity) - Material.setPbrMaterial(entity, { albedoColor: color }) - createLabel(Vector3.create(position.x, position.y + 1.1, position.z), 1.6, Color4.White(), text) - return { entity, color, lastSecond: -1, flashUntil: 0, lit: false } -} - -function updateBeat(cube: BeatCube, positionMs: number | undefined, wallNow: number): void { - if (positionMs !== undefined) { - const second = Math.floor(positionMs / 1000) - if (second !== cube.lastSecond) { - cube.lastSecond = second - cube.flashUntil = wallNow + BEAT_FLASH_MS - } - } - const lit = wallNow < cube.flashUntil - if (lit === cube.lit) return - cube.lit = lit - Material.setPbrMaterial(cube.entity, { albedoColor: lit ? Color4.White() : cube.color }) -} - -const clockBeat = createBeatCube( - Vector3.create(1.5, 1, 4), - Color4.create(0.6, 0.6, 0.1, 1), - 'CLOCK beat\n(scene clock)' -) -const audioBeat = createBeatCube( - Vector3.create(14.5, 1, 4), - Color4.create(0.1, 0.5, 0.6, 1), - 'AUDIO beat\n(clock - lag)' -) - -// --------------------------------------------------------------------------- -// Buttons -// --------------------------------------------------------------------------- - -// Restarts the scene clock at `offsetMs` (0 for PLAY, 10000 for SEEK) and forgets everything measured against -// the previous origin. function startClock(offsetMs: number): void { clockOriginWallMs = Date.now() clockOffsetMs = offsetMs clockByTick.clear() + lagMs = undefined + naiveLagMs = undefined firstLagMs = undefined - lastLagMs = undefined - clockBeat.lastSecond = -1 - audioBeat.lastSecond = -1 + for (const cube of [clockBeat, audioBeat, naiveBeat]) cube.lastSecond = -1 recordSceneClock() - renderDrift() } -const btnPlay = createButton(Vector3.create(4, 1, 4), Color4.create(0.2, 0.8, 0.2, 1)) -createLabel(Vector3.create(4, 2.3, 4), 2, Color4.White(), 'PLAY') -pointerEventsSystem.onPointerDown( - { entity: btnPlay, opts: { button: InputAction.IA_POINTER, hoverText: 'Play from 0 (resets the scene clock)' } }, - () => { - AudioSource.playSound(audioEntity, CLIP, true) - startClock(0) - } -) +function addButton( + position: Vector3, + color: Color4, + caption: string, + hoverText: string, + onClick: () => void, + scale = 1.2 +): Entity { + const button = createButton(position, color, scale) + createLabel( + Vector3.create(position.x, position.y + scale + 0.4, position.z), + scale > 1 ? 2 : 1.5, + Color4.White(), + caption + ) + pointerEventsSystem.onPointerDown({ entity: button, opts: { button: InputAction.IA_POINTER, hoverText } }, onClick) + return button +} -const btnSeek = createButton(Vector3.create(6, 1, 4), Color4.create(0.2, 0.4, 0.9, 1)) -createLabel(Vector3.create(6, 2.3, 4), 2, Color4.White(), `SEEK ${SEEK_TARGET_SECONDS}s`) -pointerEventsSystem.onPointerDown( - { - entity: btnSeek, - opts: { button: InputAction.IA_POINTER, hoverText: `Seek to ${SEEK_TARGET_SECONDS}s and play (clock = 10 s)` } - }, +addButton(Vector3.create(5.5, 1, 4), Color4.create(0.2, 0.8, 0.2, 1), 'PLAY', 'Play from 0 (scene clock -> 0)', () => { + AudioSource.playSound(audioEntity, CLIP, true) + startClock(0) +}) +addButton( + Vector3.create(8, 1, 4), + Color4.create(0.2, 0.4, 0.9, 1), + `SEEK ${SEEK_TARGET_SECONDS}s`, + `Seek to ${SEEK_TARGET_SECONDS}s and play (scene clock -> 10 s)`, () => { - // createOrReplace always emits a PUT, even when playing/currentTime are unchanged (SEEK pressed twice), so - // the renderer re-seeks every time. Hand-mutating via getMutable would be deduped when nothing changed. + // createOrReplace always emits a PUT, even when playing/currentTime are unchanged (SEEK pressed twice), so the + // renderer re-seeks every time. Hand-mutating via getMutable would be deduped when nothing changed. AudioSource.createOrReplace(audioEntity, { ...AudioSource.get(audioEntity), playing: true, @@ -432,114 +350,69 @@ pointerEventsSystem.onPointerDown( startClock(SEEK_TARGET_SECONDS * 1000) } ) +addButton(Vector3.create(10.5, 1, 4), Color4.create(0.8, 0.2, 0.2, 1), 'STOP', 'Stop (scene-initiated)', () => { + AudioSource.stopSound(audioEntity, true) +}) -const btnStop = createButton(Vector3.create(8, 1, 4), Color4.create(0.8, 0.2, 0.2, 1)) -createLabel(Vector3.create(8, 2.3, 4), 2, Color4.White(), 'STOP') -pointerEventsSystem.onPointerDown( - { entity: btnStop, opts: { button: InputAction.IA_POINTER, hoverText: 'Stop (scene-initiated)' } }, - () => { - AudioSource.stopSound(audioEntity, true) - } -) - -const btnLoop = createButton(Vector3.create(10, 1, 4), Color4.create(0.7, 0.4, 0.9, 1)) -createLabel(Vector3.create(10, 2.3, 4), 2, Color4.White(), 'TOGGLE LOOP') -pointerEventsSystem.onPointerDown( - { entity: btnLoop, opts: { button: InputAction.IA_POINTER, hoverText: 'Toggle AudioSource.loop' } }, +// Coverage controls, out of the way +addButton( + Vector3.create(14.6, 0.8, 2.2), + Color4.create(0.6, 0.4, 0.8, 1), + 'LOOP', + 'Toggle AudioSource.loop', () => { const source = AudioSource.getMutable(audioEntity) source.loop = !source.loop - } -) - -const btnPushCallback = createButton(Vector3.create(12, 1, 4), Color4.create(0.5, 0.5, 0.5, 1)) -const pushCallbackLabel = createLabel(Vector3.create(12, 2.3, 4), 2, Color4.White(), 'PUSH CB: ON') -pointerEventsSystem.onPointerDown( - { - entity: btnPushCallback, - opts: { button: InputAction.IA_POINTER, hoverText: 'registerAudioPlaybackEntity / removeAudioPlaybackEntity' } }, + 0.8 +) +addButton( + Vector3.create(14.6, 0.8, 4), + Color4.create(0.5, 0.5, 0.5, 1), + 'PUSH CB', + 'registerAudioPlaybackEntity / removeAudioPlaybackEntity', () => { setPushCallback(!pushCallbackRegistered) - setLabel(pushCallbackLabel, `PUSH CB: ${pushCallbackRegistered ? 'ON' : 'OFF'}`) - } + }, + 0.8 ) // --------------------------------------------------------------------------- -// Per-frame readout: clock line, pull API, beat cubes +// Per-frame: cubes and readouts // --------------------------------------------------------------------------- - engine.addSystem(() => { - const source = AudioSource.get(audioEntity) - const playing = source.playing ?? false + const playing = AudioSource.get(audioEntity).playing ?? false const clock = sceneClockMs() const wallNow = Date.now() - - setLabel( - clockLabel, - `tick ${currentTick} scene clock ${clock === undefined ? 'not started (press PLAY)' : fmtMs(clock)} ` + - `loop ${source.loop ? 'ON' : 'OFF'} AudioSource.playing=${playing}` - ) - - const playback = audioEventsSystem.getAudioPlayback(audioEntity) - const state = audioEventsSystem.getAudioState(audioEntity) - const stateLine = - state === undefined - ? 'getAudioState(entity): undefined (no AudioEvent from the renderer yet)' - : `getAudioState(entity): ${mediaStateName(state.state)} @ts ${state.timestamp}` - - const lines = ['getAudioPlayback (pull API, polled every frame)'] - if (playback === undefined) { - const sincePressMs = clock === undefined ? undefined : clock - clockOffsetMs - lines.push('getAudioPlayback(entity): undefined') - if (clock === undefined) { - lines.push('press PLAY') - } else if (sincePressMs !== undefined && sincePressMs > NO_REPORTS_AFTER_MS && stateCallbackCount > 0) { - lines.push('no position reports from this renderer (older renderer)') - } else { - lines.push('waiting for the first position report...') - } - } else { - lines.push( - `getAudioPlayback(entity): tick ${playback.tickNumber ?? 'n/a'} offset ${fmtSeconds(playback.currentOffset)} ` + - `length ${fmtSeconds(playback.clipLength)} ${mediaStateName(playback.state)}` - ) - if (playback.tickNumber !== undefined) { - lines.push(`report age ${currentTick - playback.tickNumber} ticks (current tick ${currentTick})`) - } - } - lines.push(stateLine) - setLabel(pullLabel, lines.join('\n')) - updateBeat(clockBeat, playing ? clock : undefined, wallNow) + updateBeat(audioBeat, playing && clock !== undefined && lagMs !== undefined ? clock - lagMs : undefined, wallNow) updateBeat( - audioBeat, - playing && clock !== undefined && lastLagMs !== undefined ? clock - lastLagMs : undefined, + naiveBeat, + playing && clock !== undefined && naiveLagMs !== undefined ? clock - naiveLagMs : undefined, wallNow ) + setLabel( + headline, + lagMs === undefined + ? 'Press PLAY, then listen: which cube flashes with the beep?' + : `AUDIO flashes with the beep. CLOCK runs ${fmtMs(lagMs)} early. NAIVE is off by ${fmtMs((naiveLagMs ?? lagMs) - lagMs)}.` + ) + renderPanel() + renderSidePanel(audioEventsSystem.getAudioPlayback(audioEntity), audioEventsSystem.getAudioState(audioEntity)) }) // --------------------------------------------------------------------------- -// Scene setup +// Scene dressing // --------------------------------------------------------------------------- - -function addGround(): void { - const ground = engine.addEntity() - Transform.create(ground, { position: Vector3.create(8, -0.05, 8), scale: Vector3.create(16, 0.1, 16) }) - MeshRenderer.setBox(ground) - Material.setPbrMaterial(ground, { albedoColor: Color4.create(0.15, 0.15, 0.15, 1) }) -} - -function addTitle(): void { - createLabel( - Vector3.create(8, 7.2, 8), - 2.5, - Color4.White(), - 'Audio Playback Position Reports Test\n' + - 'PLAY, then compare "audio behind clock" (via tickNumber) with the naive value.\n' + - 'SEEK 10s shows where the renderer lands; TOGGLE LOOP before PLAY shows currentOffset wrapping.' - ) -} - -addGround() -addTitle() +const ground = engine.addEntity() +Transform.create(ground, { position: Vector3.create(8, -0.05, 8), scale: Vector3.create(16, 0.1, 16) }) +MeshRenderer.setBox(ground) +Material.setPbrMaterial(ground, { albedoColor: Color4.create(0.15, 0.15, 0.15, 1) }) + +createLabel( + Vector3.create(8, 7.8, 9), + 2.2, + Color4.White(), + 'Audio Playback Position Reports\nThe renderer starts a clip late. Reports with a tickNumber let the scene measure by how much.' +) +void lastReportWallMs From 39d616c3ee66c93184a61f35fffce069496171ab Mon Sep 17 00:00:00 2001 From: LautaroPetaccio Date: Thu, 17 Sep 2026 14:25:22 -0300 Subject: [PATCH 3/5] feat(audio-playback): showcase the SDK's tick resolution instead of rebuilding it The scene kept its own map of scene clock per EngineInfo.tickNumber, which is exactly the piece audioEventsSystem now provides. A showcase that hand-rolls it teaches the opposite of the feature. The correct reading now comes from registerAudioPlaybackSampleEntity, which hands over each report already resolved against the scene clock at the tick it was sampled in, and the scene clock itself comes from getSceneTimeAtTick. The naive reading still uses the raw callback timed on arrival, so the contrast the three cubes demonstrate is unchanged. Also note the accuracy floor in the header: the reported playhead is the decoder's, and output latency sits on top of it uncarried, so the AUDIO cube lands close to the beep rather than exactly on it. Repin @dcl/sdk to the current branch build, which carries the sample API. --- .../package.json | 4 +- .../src/index.ts | 81 ++++++++++--------- 2 files changed, 44 insertions(+), 41 deletions(-) diff --git a/scenes/89,-12-audio-playback-position/package.json b/scenes/89,-12-audio-playback-position/package.json index b3dde955..5f029d7a 100644 --- a/scenes/89,-12-audio-playback-position/package.json +++ b/scenes/89,-12-audio-playback-position/package.json @@ -18,7 +18,7 @@ "trailingComma": "none" }, "devDependencies": { - "@dcl/sdk": "https://sdk-team-cdn.decentraland.org/@dcl/js-sdk-toolchain/branch/feat/audio-event-playback-position/dcl-sdk-7.29.1-35100852387.commit-08e39ca.tgz", - "@dcl/js-runtime": "https://sdk-team-cdn.decentraland.org/@dcl/js-sdk-toolchain/branch/feat/audio-event-playback-position/@dcl/js-runtime/dcl-js-runtime-7.29.1-35100852387.commit-08e39ca.tgz" + "@dcl/sdk": "https://sdk-team-cdn.decentraland.org/@dcl/js-sdk-toolchain/branch/feat/audio-event-playback-position/dcl-sdk-7.29.1-35251291973.commit-5406571.tgz", + "@dcl/js-runtime": "https://sdk-team-cdn.decentraland.org/@dcl/js-sdk-toolchain/branch/feat/audio-event-playback-position/@dcl/js-runtime/dcl-js-runtime-7.29.1-35251291973.commit-5406571.tgz" } } diff --git a/scenes/89,-12-audio-playback-position/src/index.ts b/scenes/89,-12-audio-playback-position/src/index.ts index 7e236e74..a797f346 100644 --- a/scenes/89,-12-audio-playback-position/src/index.ts +++ b/scenes/89,-12-audio-playback-position/src/index.ts @@ -19,21 +19,26 @@ * Press PLAY and listen. AUDIO lines up with the beeps. CLOCK runs early by the start delay. NAIVE is off by * the report's transport delay: a report says where the clip was at tick N but reaches the scene a few ticks * later, so comparing it with the clock at processing time is wrong by exactly that gap. That gap is why the - * field is a tick and not a timestamp: the scene keeps its own clock per EngineInfo.tickNumber and looks the - * report's tick up: - * lag = clockAtTick(report.tickNumber) - report.currentOffset * 1000 + * field is a tick and not a timestamp: the scene clock has to be read at the tick the position was sampled in. + * The SDK keeps that history, so a scene never rebuilds it: + * registerAudioPlaybackSampleEntity -> { report, sceneTime, offset }, sceneTime already at report.tickNumber + * lag = (sceneTime - sceneTimeAtPlay) * 1000 - offset * 1000 * * Buttons: PLAY (from 0, clock -> 0), SEEK 10s (currentTime = 10, clock -> 10 s; the next report shows where the * renderer actually landed), STOP. Corner buttons cover the rest of the API: LOOP toggles AudioSource.loop (the * offset wraps while the clock keeps counting), PUSH CB unregisters and re-registers the playback callback. * * API under test (audioEventsSystem from '@dcl/sdk/ecs'): - * - registerAudioPlaybackEntity / removeAudioPlaybackEntity: callback on EVERY report, position updates - * included (drives the readout) + * - registerAudioPlaybackSampleEntity: report resolved against the scene clock at its own tick (drives AUDIO) + * - registerAudioPlaybackEntity / removeAudioPlaybackEntity: newest report of the frame, unresolved, so the + * scene can only time it on arrival (drives NAIVE, and the PUSH CB toggle) + * - getSceneTimeAtTick(tick): the same per-tick lookup on its own, for raw reports and for video * - getAudioPlayback(entity): latest report carrying currentOffset, or undefined (polled, shown in the side panel) * - registerAudioEventsEntity (pre-existing): still fires ONLY on media-state changes (side panel counts both * callbacks so the difference is visible) * Renderers that never send a position show "no position reports from this renderer" and only CLOCK flashes. + * Note the floor on accuracy: currentOffset is the decoder's playhead, and the output path adds tens of + * milliseconds more that no field carries, so AUDIO lands close to the beep rather than exactly on it. * * Until the protocol and SDK PRs merge this scene needs the branch build of @dcl/sdk pinned in package.json, * and only the Unity explorer branch produces position reports. @@ -60,7 +65,6 @@ import { Color4, Vector3 } from '@dcl/sdk/math' // 30 s generated tone: a 120 ms beep on every whole second whose pitch rises 40 Hz per second, over a quiet hum. const CLIP = 'audio/tone-30s.mp3' const SEEK_TARGET_SECONDS = 10 -const TICK_HISTORY = 90 // ticks of scene clock kept for clockAtTick lookups (~3 s at 30 fps) const NO_REPORTS_AFTER_MS = 3000 // playing this long with AudioEvent state but no position => older renderer const BEAT_FLASH_MS = 120 @@ -121,31 +125,26 @@ const fmtSeconds = (value: number | undefined) => (value === undefined ? 'n/a' : // PLAY/SEEK. Recorded once per tick under EngineInfo.tickNumber so a report sampled at tick N is compared with // the clock at tick N, not with the clock when the report is processed. // --------------------------------------------------------------------------- -let clockOriginWallMs: number | undefined // Date.now() at the last PLAY/SEEK; undefined until pressed +let playSceneTimeS: number | undefined // SDK scene clock (s) at the last PLAY/SEEK; undefined until pressed let clockOffsetMs = 0 // 0 after PLAY, 10000 after SEEK let currentTick = -1 -const clockByTick = new Map() -function sceneClockMs(): number | undefined { - return clockOriginWallMs === undefined ? undefined : Date.now() - clockOriginWallMs + clockOffsetMs -} - -function recordSceneClock(): void { +// The SDK's own scene clock, in ms, for the tick being processed. The per-tick history behind it lives in +// audioEventsSystem, which is the point of the feature: a scene does not keep one of its own. +function sdkSceneTimeMs(): number | undefined { const tick = EngineInfo.getOrNull(engine.RootEntity)?.tickNumber - if (tick === undefined) return + if (tick === undefined) return undefined currentTick = tick - const clock = sceneClockMs() - if (clock === undefined) return - clockByTick.set(tick, clock) - while (clockByTick.size > TICK_HISTORY) { - const oldest = clockByTick.keys().next().value - if (oldest === undefined) break - clockByTick.delete(oldest) - } + const seconds = audioEventsSystem.getSceneTimeAtTick(tick) + return seconds === undefined ? undefined : seconds * 1000 +} + +// Where the scene EXPECTS the clip to be, as if the renderer had reacted instantly to the last PLAY/SEEK. +function sceneClockMs(): number | undefined { + const now = sdkSceneTimeMs() + if (now === undefined || playSceneTimeS === undefined) return undefined + return now - playSceneTimeS * 1000 + clockOffsetMs } -// Higher priority runs first: this tick's clock must exist before the SDK's audio-events system (default -// priority) delivers a report that may carry the current tickNumber. -engine.addSystem(recordSceneClock, 200000, 'record-scene-clock') // --------------------------------------------------------------------------- // Audio entity and measurements @@ -154,7 +153,7 @@ const audioEntity = engine.addEntity() Transform.create(audioEntity, { position: Vector3.create(8, 1, 8) }) AudioSource.create(audioEntity, { audioClipUrl: CLIP, playing: false, loop: false }) -let lagMs: number | undefined // clockAtTick(report.tickNumber) - offset: the correct figure +let lagMs: number | undefined // resolved at the report's own tick: the correct figure let naiveLagMs: number | undefined // clock at processing time - offset: wrong by the transport delay let firstLagMs: number | undefined let lastReportWallMs: number | undefined @@ -235,7 +234,7 @@ function renderPanel(): void { : 'waiting for the first position report...' ) } else { - lines.push(`audio behind clock by ${fmtMs(lagMs)} (correct: clock looked up at the report's tick)`) + lines.push(`audio behind clock by ${fmtMs(lagMs)} (correct: resolved at the report's own tick)`) lines.push(`naive figure ${fmtMs(naiveLagMs)} (clock at processing time; off by the transport delay)`) if (firstLagMs !== undefined) lines.push(`drift since first report ${fmtMs(lagMs - firstLagMs)}`) } @@ -268,21 +267,26 @@ function renderSidePanel(playback: PBAudioEvent | undefined, state: PBAudioEvent // --------------------------------------------------------------------------- // Push API: every report, position updates included // --------------------------------------------------------------------------- +// The naive half of the demo: a raw report carries the tick it was sampled in, but a scene that ignores it and +// times the report on arrival is wrong by however long the report spent in transit. function onPlaybackReport(report: Readonly): void { playbackCallbackCount++ lastReportWallMs = Date.now() if (report.currentOffset === undefined) return - positionReportCount++ - const offsetMs = report.currentOffset * 1000 - const clockAtTick = report.tickNumber === undefined ? undefined : clockByTick.get(report.tickNumber) const clockNow = sceneClockMs() - if (clockAtTick !== undefined) { - lagMs = clockAtTick - offsetMs - if (firstLagMs === undefined) firstLagMs = lagMs - } - if (clockNow !== undefined) naiveLagMs = clockNow - offsetMs + if (clockNow !== undefined) naiveLagMs = clockNow - report.currentOffset * 1000 } +// The correct half: the SDK resolves each report against the scene clock at its own tick, so the time the +// report spent in transit never enters the result. This is the callback a scene should reach for. +audioEventsSystem.registerAudioPlaybackSampleEntity(audioEntity, ({ sceneTime, offset }) => { + positionReportCount++ + if (playSceneTimeS === undefined) return + const expectedAtTick = (sceneTime - playSceneTimeS) * 1000 + clockOffsetMs + lagMs = expectedAtTick - offset * 1000 + if (firstLagMs === undefined) firstLagMs = lagMs +}) + function setPushCallback(enabled: boolean): void { if (enabled) audioEventsSystem.registerAudioPlaybackEntity(audioEntity, onPlaybackReport) else audioEventsSystem.removeAudioPlaybackEntity(audioEntity) @@ -301,14 +305,13 @@ audioEventsSystem.registerAudioEventsEntity(audioEntity, (event) => { // Buttons: three in front, two in the corner // --------------------------------------------------------------------------- function startClock(offsetMs: number): void { - clockOriginWallMs = Date.now() + const now = sdkSceneTimeMs() + playSceneTimeS = now === undefined ? undefined : now / 1000 clockOffsetMs = offsetMs - clockByTick.clear() lagMs = undefined naiveLagMs = undefined firstLagMs = undefined for (const cube of [clockBeat, audioBeat, naiveBeat]) cube.lastSecond = -1 - recordSceneClock() } function addButton( @@ -370,7 +373,7 @@ addButton( Vector3.create(14.6, 0.8, 4), Color4.create(0.5, 0.5, 0.5, 1), 'PUSH CB', - 'registerAudioPlaybackEntity / removeAudioPlaybackEntity', + 'registerAudioPlaybackSampleEntity / registerAudioPlaybackEntity / getSceneTimeAtTick', () => { setPushCallback(!pushCallbackRegistered) }, From 4f4543f4e0c39fe58394578a1dc057f802cf6164 Mon Sep 17 00:00:00 2001 From: LautaroPetaccio Date: Thu, 17 Sep 2026 16:35:58 -0300 Subject: [PATCH 4/5] feat(audio-playback): one callback, one reading timed two ways The SDK collapsed its two playback registrations into one that hands over the resolved reading, so the scene no longer needs a callback each for the correct and naive figures. Both now come from the same reading in one place, which is a tighter demonstration: same report, two ways of timing it, and the gap between the cubes is exactly the transport delay. The two callback counters collapse into one for the same reason. Repin @dcl/sdk to the build carrying the merged API. --- .../package.json | 4 +- .../src/index.ts | 40 +++++++++---------- 2 files changed, 20 insertions(+), 24 deletions(-) diff --git a/scenes/89,-12-audio-playback-position/package.json b/scenes/89,-12-audio-playback-position/package.json index 5f029d7a..789bfe95 100644 --- a/scenes/89,-12-audio-playback-position/package.json +++ b/scenes/89,-12-audio-playback-position/package.json @@ -18,7 +18,7 @@ "trailingComma": "none" }, "devDependencies": { - "@dcl/sdk": "https://sdk-team-cdn.decentraland.org/@dcl/js-sdk-toolchain/branch/feat/audio-event-playback-position/dcl-sdk-7.29.1-35251291973.commit-5406571.tgz", - "@dcl/js-runtime": "https://sdk-team-cdn.decentraland.org/@dcl/js-sdk-toolchain/branch/feat/audio-event-playback-position/@dcl/js-runtime/dcl-js-runtime-7.29.1-35251291973.commit-5406571.tgz" + "@dcl/sdk": "https://sdk-team-cdn.decentraland.org/@dcl/js-sdk-toolchain/branch/feat/audio-event-playback-position/dcl-sdk-7.29.1-35265276424.commit-b686d72.tgz", + "@dcl/js-runtime": "https://sdk-team-cdn.decentraland.org/@dcl/js-sdk-toolchain/branch/feat/audio-event-playback-position/@dcl/js-runtime/dcl-js-runtime-7.29.1-35265276424.commit-b686d72.tgz" } } diff --git a/scenes/89,-12-audio-playback-position/src/index.ts b/scenes/89,-12-audio-playback-position/src/index.ts index a797f346..00c10af0 100644 --- a/scenes/89,-12-audio-playback-position/src/index.ts +++ b/scenes/89,-12-audio-playback-position/src/index.ts @@ -21,7 +21,7 @@ * later, so comparing it with the clock at processing time is wrong by exactly that gap. That gap is why the * field is a tick and not a timestamp: the scene clock has to be read at the tick the position was sampled in. * The SDK keeps that history, so a scene never rebuilds it: - * registerAudioPlaybackSampleEntity -> { report, sceneTime, offset }, sceneTime already at report.tickNumber + * registerAudioPlaybackEntity -> { report, sceneTime, offset }, sceneTime already at report.tickNumber * lag = (sceneTime - sceneTimeAtPlay) * 1000 - offset * 1000 * * Buttons: PLAY (from 0, clock -> 0), SEEK 10s (currentTime = 10, clock -> 10 s; the next report shows where the @@ -29,9 +29,9 @@ * offset wraps while the clock keeps counting), PUSH CB unregisters and re-registers the playback callback. * * API under test (audioEventsSystem from '@dcl/sdk/ecs'): - * - registerAudioPlaybackSampleEntity: report resolved against the scene clock at its own tick (drives AUDIO) - * - registerAudioPlaybackEntity / removeAudioPlaybackEntity: newest report of the frame, unresolved, so the - * scene can only time it on arrival (drives NAIVE, and the PUSH CB toggle) + * - registerAudioPlaybackEntity / removeAudioPlaybackEntity: the newest position report of the frame, already + * resolved against the scene clock at its own tick. Drives AUDIO; the same reading timed on arrival instead + * drives NAIVE, so one callback shows both. Also behind the PUSH CB toggle. * - getSceneTimeAtTick(tick): the same per-tick lookup on its own, for raw reports and for video * - getAudioPlayback(entity): latest report carrying currentOffset, or undefined (polled, shown in the side panel) * - registerAudioEventsEntity (pre-existing): still fires ONLY on media-state changes (side panel counts both @@ -57,6 +57,7 @@ import { audioEventsSystem, MediaState, PBAudioEvent, + AudioPlaybackSample, pointerEventsSystem, InputAction } from '@dcl/sdk/ecs' @@ -157,7 +158,6 @@ let lagMs: number | undefined // resolved at the report's own tick: the correct let naiveLagMs: number | undefined // clock at processing time - offset: wrong by the transport delay let firstLagMs: number | undefined let lastReportWallMs: number | undefined -let playbackCallbackCount = 0 let positionReportCount = 0 let stateCallbackCount = 0 let pushCallbackRegistered = false @@ -243,7 +243,7 @@ function renderPanel(): void { function renderSidePanel(playback: PBAudioEvent | undefined, state: PBAudioEvent | undefined): void { const lines = ['audioEventsSystem'] - lines.push(`playback callbacks ${playbackCallbackCount} (${positionReportCount} with position)`) + lines.push(`position reports delivered ${positionReportCount}`) lines.push(`state callbacks ${stateCallbackCount} push callback ${pushCallbackRegistered ? 'ON' : 'OFF'}`) lines.push( playback === undefined @@ -267,28 +267,24 @@ function renderSidePanel(playback: PBAudioEvent | undefined, state: PBAudioEvent // --------------------------------------------------------------------------- // Push API: every report, position updates included // --------------------------------------------------------------------------- -// The naive half of the demo: a raw report carries the tick it was sampled in, but a scene that ignores it and -// times the report on arrival is wrong by however long the report spent in transit. -function onPlaybackReport(report: Readonly): void { - playbackCallbackCount++ - lastReportWallMs = Date.now() - if (report.currentOffset === undefined) return - const clockNow = sceneClockMs() - if (clockNow !== undefined) naiveLagMs = clockNow - report.currentOffset * 1000 -} - -// The correct half: the SDK resolves each report against the scene clock at its own tick, so the time the -// report spent in transit never enters the result. This is the callback a scene should reach for. -audioEventsSystem.registerAudioPlaybackSampleEntity(audioEntity, ({ sceneTime, offset }) => { +// One reading, timed two ways. The SDK hands over `sceneTime` already resolved against the tick the renderer +// sampled in, so the time the report spent in transit never enters the correct figure. Timing the same reading +// on arrival instead is the mistake this scene exists to show, and it is off by exactly that transit time. +function onPlaybackSample({ sceneTime, offset }: AudioPlaybackSample): void { positionReportCount++ + lastReportWallMs = Date.now() if (playSceneTimeS === undefined) return + const expectedAtTick = (sceneTime - playSceneTimeS) * 1000 + clockOffsetMs lagMs = expectedAtTick - offset * 1000 if (firstLagMs === undefined) firstLagMs = lagMs -}) + + const clockNow = sceneClockMs() + if (clockNow !== undefined) naiveLagMs = clockNow - offset * 1000 +} function setPushCallback(enabled: boolean): void { - if (enabled) audioEventsSystem.registerAudioPlaybackEntity(audioEntity, onPlaybackReport) + if (enabled) audioEventsSystem.registerAudioPlaybackEntity(audioEntity, onPlaybackSample) else audioEventsSystem.removeAudioPlaybackEntity(audioEntity) pushCallbackRegistered = enabled } @@ -373,7 +369,7 @@ addButton( Vector3.create(14.6, 0.8, 4), Color4.create(0.5, 0.5, 0.5, 1), 'PUSH CB', - 'registerAudioPlaybackSampleEntity / registerAudioPlaybackEntity / getSceneTimeAtTick', + 'registerAudioPlaybackEntity / removeAudioPlaybackEntity / getSceneTimeAtTick', () => { setPushCallback(!pushCallbackRegistered) }, From ffd2b7380e5237227f1e508efda92fc7b7f806a9 Mon Sep 17 00:00:00 2001 From: LautaroPetaccio Date: Mon, 21 Sep 2026 16:01:29 -0300 Subject: [PATCH 5/5] feat(audio-playback): opt the source into position reports Position reports are now opt-in per source: PBAudioSource gained reportPlaybackPosition (default false). Media-state changes are reported either way, so a scene that registers a playback callback without the flag receives nothing and gets no error about it. Set it on the scene's AudioSource, document it in the header block next to the PBAudioEvent fields and at the top of the API-under-test list, and name it in the on-screen fallback line, which now has two causes rather than one. Repin @dcl/sdk and @dcl/js-runtime to the branch build carrying the field (35640312842, commit 7ee164e). --- .../package.json | 4 ++-- .../src/index.ts | 19 ++++++++++++++++--- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/scenes/89,-12-audio-playback-position/package.json b/scenes/89,-12-audio-playback-position/package.json index 789bfe95..4b43f2d4 100644 --- a/scenes/89,-12-audio-playback-position/package.json +++ b/scenes/89,-12-audio-playback-position/package.json @@ -18,7 +18,7 @@ "trailingComma": "none" }, "devDependencies": { - "@dcl/sdk": "https://sdk-team-cdn.decentraland.org/@dcl/js-sdk-toolchain/branch/feat/audio-event-playback-position/dcl-sdk-7.29.1-35265276424.commit-b686d72.tgz", - "@dcl/js-runtime": "https://sdk-team-cdn.decentraland.org/@dcl/js-sdk-toolchain/branch/feat/audio-event-playback-position/@dcl/js-runtime/dcl-js-runtime-7.29.1-35265276424.commit-b686d72.tgz" + "@dcl/sdk": "https://sdk-team-cdn.decentraland.org/@dcl/js-sdk-toolchain/branch/feat/audio-event-playback-position/dcl-sdk-7.29.1-35640312842.commit-7ee164e.tgz", + "@dcl/js-runtime": "https://sdk-team-cdn.decentraland.org/@dcl/js-sdk-toolchain/branch/feat/audio-event-playback-position/@dcl/js-runtime/dcl-js-runtime-7.29.1-35640312842.commit-7ee164e.tgz" } } diff --git a/scenes/89,-12-audio-playback-position/src/index.ts b/scenes/89,-12-audio-playback-position/src/index.ts index 00c10af0..f0c3cec7 100644 --- a/scenes/89,-12-audio-playback-position/src/index.ts +++ b/scenes/89,-12-audio-playback-position/src/index.ts @@ -12,6 +12,14 @@ * - clipLength total clip length in seconds, when known * `state` (MediaState) and `timestamp` (a per-entity monotonic counter, NOT a time) are unchanged. * + * PBAudioSource gained one OPTIONAL field, and it is the gate for all of the above: + * - reportPlaybackPosition opt in to position reports (default false) + * Media-state changes are reported either way; positions are NOT. A scene that registers a playback callback + * without setting this flag on its AudioSource receives nothing, silently. It is opt-in because a position is + * written whenever the playhead moves - far more often than a state changes - a scene can hold many sources, and + * AudioEvent is a grow-only set capped at 100 entries per entity, so one always-on source fills its own buffer in + * under two seconds. + * * THE DEMO: three cubes behind the buttons, and a clip that beeps on every whole second. * CLOCK flashes on each whole second of the scene clock (what the scene assumes the audio is doing) * AUDIO flashes on each whole second of (clock - lag), lag measured through tickNumber @@ -29,6 +37,8 @@ * offset wraps while the clock keeps counting), PUSH CB unregisters and re-registers the playback callback. * * API under test (audioEventsSystem from '@dcl/sdk/ecs'): + * - AudioSource.reportPlaybackPosition: true - REQUIRED. Nothing below delivers a position without it, and + * there is no error to tell you: the callback simply never runs. * - registerAudioPlaybackEntity / removeAudioPlaybackEntity: the newest position report of the frame, already * resolved against the scene clock at its own tick. Drives AUDIO; the same reading timed on arrival instead * drives NAIVE, so one callback shows both. Also behind the PUSH CB toggle. @@ -36,7 +46,8 @@ * - getAudioPlayback(entity): latest report carrying currentOffset, or undefined (polled, shown in the side panel) * - registerAudioEventsEntity (pre-existing): still fires ONLY on media-state changes (side panel counts both * callbacks so the difference is visible) - * Renderers that never send a position show "no position reports from this renderer" and only CLOCK flashes. + * Renderers that never send a position show "no position reports" and only CLOCK flashes - as does forgetting + * reportPlaybackPosition, which is why the message names both. * Note the floor on accuracy: currentOffset is the decoder's playhead, and the output path adds tens of * milliseconds more that no field carries, so AUDIO lands close to the beep rather than exactly on it. * @@ -152,7 +163,9 @@ function sceneClockMs(): number | undefined { // --------------------------------------------------------------------------- const audioEntity = engine.addEntity() Transform.create(audioEntity, { position: Vector3.create(8, 1, 8) }) -AudioSource.create(audioEntity, { audioClipUrl: CLIP, playing: false, loop: false }) +// reportPlaybackPosition is the opt-in: without it the renderer reports media-state changes only, and the +// registerAudioPlaybackEntity callback below never fires. +AudioSource.create(audioEntity, { audioClipUrl: CLIP, playing: false, loop: false, reportPlaybackPosition: true }) let lagMs: number | undefined // resolved at the report's own tick: the correct figure let naiveLagMs: number | undefined // clock at processing time - offset: wrong by the transport delay @@ -230,7 +243,7 @@ function renderPanel(): void { const sincePress = clock - clockOffsetMs lines.push( sincePress > NO_REPORTS_AFTER_MS && stateCallbackCount > 0 - ? 'no position reports from this renderer (only CLOCK flashes)' + ? 'no position reports: older renderer, or reportPlaybackPosition not set (only CLOCK flashes)' : 'waiting for the first position report...' ) } else {