@smoove/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +80 -0
- package/dist/animation/color.d.ts +9 -0
- package/dist/animation/color.d.ts.map +1 -0
- package/dist/animation/color.js +224 -0
- package/dist/animation/color.js.map +1 -0
- package/dist/animation/easing.d.ts +22 -0
- package/dist/animation/easing.d.ts.map +1 -0
- package/dist/animation/easing.js +59 -0
- package/dist/animation/easing.js.map +1 -0
- package/dist/animation/interpolate-colors.d.ts +7 -0
- package/dist/animation/interpolate-colors.d.ts.map +1 -0
- package/dist/animation/interpolate-colors.js +19 -0
- package/dist/animation/interpolate-colors.js.map +1 -0
- package/dist/animation/interpolate.d.ts +12 -0
- package/dist/animation/interpolate.d.ts.map +1 -0
- package/dist/animation/interpolate.js +65 -0
- package/dist/animation/interpolate.js.map +1 -0
- package/dist/audio/asset.d.ts +21 -0
- package/dist/audio/asset.d.ts.map +1 -0
- package/dist/audio/asset.js +2 -0
- package/dist/audio/asset.js.map +1 -0
- package/dist/audio/audio-driver.d.ts +34 -0
- package/dist/audio/audio-driver.d.ts.map +1 -0
- package/dist/audio/audio-driver.js +2 -0
- package/dist/audio/audio-driver.js.map +1 -0
- package/dist/audio/audio-for-preview.d.ts +12 -0
- package/dist/audio/audio-for-preview.d.ts.map +1 -0
- package/dist/audio/audio-for-preview.js +70 -0
- package/dist/audio/audio-for-preview.js.map +1 -0
- package/dist/audio/audio-for-rendering.d.ts +16 -0
- package/dist/audio/audio-for-rendering.d.ts.map +1 -0
- package/dist/audio/audio-for-rendering.js +32 -0
- package/dist/audio/audio-for-rendering.js.map +1 -0
- package/dist/audio/audio-source-browser.d.ts +30 -0
- package/dist/audio/audio-source-browser.d.ts.map +1 -0
- package/dist/audio/audio-source-browser.js +139 -0
- package/dist/audio/audio-source-browser.js.map +1 -0
- package/dist/audio/audio-source.d.ts +38 -0
- package/dist/audio/audio-source.d.ts.map +1 -0
- package/dist/audio/audio-source.js +2 -0
- package/dist/audio/audio-source.js.map +1 -0
- package/dist/audio/index.d.ts +45 -0
- package/dist/audio/index.d.ts.map +1 -0
- package/dist/audio/index.js +143 -0
- package/dist/audio/index.js.map +1 -0
- package/dist/audio/mixer.d.ts +43 -0
- package/dist/audio/mixer.d.ts.map +1 -0
- package/dist/audio/mixer.js +51 -0
- package/dist/audio/mixer.js.map +1 -0
- package/dist/audio/types.d.ts +31 -0
- package/dist/audio/types.d.ts.map +1 -0
- package/dist/audio/types.js +2 -0
- package/dist/audio/types.js.map +1 -0
- package/dist/block.d.ts +16 -0
- package/dist/block.d.ts.map +1 -0
- package/dist/block.js +173 -0
- package/dist/block.js.map +1 -0
- package/dist/composition.d.ts.map +1 -0
- package/dist/composition.js.map +1 -0
- package/dist/easing.d.ts +22 -0
- package/dist/easing.d.ts.map +1 -0
- package/dist/easing.js +59 -0
- package/dist/easing.js.map +1 -0
- package/dist/emitter.d.ts +7 -0
- package/dist/emitter.d.ts.map +1 -0
- package/dist/emitter.js +29 -0
- package/dist/emitter.js.map +1 -0
- package/dist/engine/composition.d.ts +182 -0
- package/dist/engine/composition.d.ts.map +1 -0
- package/dist/engine/composition.js +527 -0
- package/dist/engine/composition.js.map +1 -0
- package/dist/engine/emitter.d.ts +7 -0
- package/dist/engine/emitter.d.ts.map +1 -0
- package/dist/engine/emitter.js +29 -0
- package/dist/engine/emitter.js.map +1 -0
- package/dist/engine/environment.d.ts +30 -0
- package/dist/engine/environment.d.ts.map +1 -0
- package/dist/engine/environment.js +27 -0
- package/dist/engine/environment.js.map +1 -0
- package/dist/engine/offsets.d.ts +39 -0
- package/dist/engine/offsets.d.ts.map +1 -0
- package/dist/engine/offsets.js +54 -0
- package/dist/engine/offsets.js.map +1 -0
- package/dist/engine/runtime-defaults.d.ts +50 -0
- package/dist/engine/runtime-defaults.d.ts.map +1 -0
- package/dist/engine/runtime-defaults.js +77 -0
- package/dist/engine/runtime-defaults.js.map +1 -0
- package/dist/engine/sequence.d.ts +44 -0
- package/dist/engine/sequence.d.ts.map +1 -0
- package/dist/engine/sequence.js +101 -0
- package/dist/engine/sequence.js.map +1 -0
- package/dist/engine/series.d.ts +40 -0
- package/dist/engine/series.d.ts.map +1 -0
- package/dist/engine/series.js +58 -0
- package/dist/engine/series.js.map +1 -0
- package/dist/engine/signal.d.ts +10 -0
- package/dist/engine/signal.d.ts.map +1 -0
- package/dist/engine/signal.js +39 -0
- package/dist/engine/signal.js.map +1 -0
- package/dist/environment.d.ts.map +1 -0
- package/dist/environment.js.map +1 -0
- package/dist/flex-engine.d.ts +31 -0
- package/dist/flex-engine.d.ts.map +1 -0
- package/dist/flex-engine.js +186 -0
- package/dist/flex-engine.js.map +1 -0
- package/dist/flex-types.d.ts +165 -0
- package/dist/flex-types.d.ts.map +1 -0
- package/dist/flex-types.js +2 -0
- package/dist/flex-types.js.map +1 -0
- package/dist/flex.d.ts +26 -0
- package/dist/flex.d.ts.map +1 -0
- package/dist/flex.js +179 -0
- package/dist/flex.js.map +1 -0
- package/dist/image.d.ts +10 -0
- package/dist/image.d.ts.map +1 -0
- package/dist/image.js +156 -0
- package/dist/image.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/interpolate-colors.d.ts +7 -0
- package/dist/interpolate-colors.d.ts.map +1 -0
- package/dist/interpolate-colors.js +240 -0
- package/dist/interpolate-colors.js.map +1 -0
- package/dist/interpolate.d.ts +12 -0
- package/dist/interpolate.d.ts.map +1 -0
- package/dist/interpolate.js +65 -0
- package/dist/interpolate.js.map +1 -0
- package/dist/layout/block.d.ts +54 -0
- package/dist/layout/block.d.ts.map +1 -0
- package/dist/layout/block.js +186 -0
- package/dist/layout/block.js.map +1 -0
- package/dist/layout/contract.d.ts +41 -0
- package/dist/layout/contract.d.ts.map +1 -0
- package/dist/layout/contract.js +8 -0
- package/dist/layout/contract.js.map +1 -0
- package/dist/layout/flex/engine.d.ts +31 -0
- package/dist/layout/flex/engine.d.ts.map +1 -0
- package/dist/layout/flex/engine.js +186 -0
- package/dist/layout/flex/engine.js.map +1 -0
- package/dist/layout/flex/flex.d.ts +31 -0
- package/dist/layout/flex/flex.d.ts.map +1 -0
- package/dist/layout/flex/flex.js +175 -0
- package/dist/layout/flex/flex.js.map +1 -0
- package/dist/layout/flex/mixin.d.ts +52 -0
- package/dist/layout/flex/mixin.d.ts.map +1 -0
- package/dist/layout/flex/mixin.js +114 -0
- package/dist/layout/flex/mixin.js.map +1 -0
- package/dist/layout/flex/types.d.ts +31 -0
- package/dist/layout/flex/types.d.ts.map +1 -0
- package/dist/layout/flex/types.js +2 -0
- package/dist/layout/flex/types.js.map +1 -0
- package/dist/layout/image.d.ts +46 -0
- package/dist/layout/image.d.ts.map +1 -0
- package/dist/layout/image.js +198 -0
- package/dist/layout/image.js.map +1 -0
- package/dist/layout/shapes.d.ts +72 -0
- package/dist/layout/shapes.d.ts.map +1 -0
- package/dist/layout/shapes.js +29 -0
- package/dist/layout/shapes.js.map +1 -0
- package/dist/layout/text/font.d.ts +92 -0
- package/dist/layout/text/font.d.ts.map +1 -0
- package/dist/layout/text/font.js +166 -0
- package/dist/layout/text/font.js.map +1 -0
- package/dist/layout/text/geometry.d.ts +31 -0
- package/dist/layout/text/geometry.d.ts.map +1 -0
- package/dist/layout/text/geometry.js +81 -0
- package/dist/layout/text/geometry.js.map +1 -0
- package/dist/layout/text/text.d.ts +98 -0
- package/dist/layout/text/text.d.ts.map +1 -0
- package/dist/layout/text/text.js +676 -0
- package/dist/layout/text/text.js.map +1 -0
- package/dist/layout/text/types.d.ts +103 -0
- package/dist/layout/text/types.d.ts.map +1 -0
- package/dist/layout/text/types.js +2 -0
- package/dist/layout/text/types.js.map +1 -0
- package/dist/media/audio/asset.d.ts +21 -0
- package/dist/media/audio/asset.d.ts.map +1 -0
- package/dist/media/audio/asset.js +2 -0
- package/dist/media/audio/asset.js.map +1 -0
- package/dist/media/audio/audio-driver.d.ts +34 -0
- package/dist/media/audio/audio-driver.d.ts.map +1 -0
- package/dist/media/audio/audio-driver.js +2 -0
- package/dist/media/audio/audio-driver.js.map +1 -0
- package/dist/media/audio/audio-for-preview.d.ts +47 -0
- package/dist/media/audio/audio-for-preview.d.ts.map +1 -0
- package/dist/media/audio/audio-for-preview.js +232 -0
- package/dist/media/audio/audio-for-preview.js.map +1 -0
- package/dist/media/audio/audio-for-rendering.d.ts +16 -0
- package/dist/media/audio/audio-for-rendering.d.ts.map +1 -0
- package/dist/media/audio/audio-for-rendering.js +32 -0
- package/dist/media/audio/audio-for-rendering.js.map +1 -0
- package/dist/media/audio/audio-source-browser.d.ts +30 -0
- package/dist/media/audio/audio-source-browser.d.ts.map +1 -0
- package/dist/media/audio/audio-source-browser.js +139 -0
- package/dist/media/audio/audio-source-browser.js.map +1 -0
- package/dist/media/audio/audio-source-mediabunny.d.ts +45 -0
- package/dist/media/audio/audio-source-mediabunny.d.ts.map +1 -0
- package/dist/media/audio/audio-source-mediabunny.js +79 -0
- package/dist/media/audio/audio-source-mediabunny.js.map +1 -0
- package/dist/media/audio/audio-source.d.ts +38 -0
- package/dist/media/audio/audio-source.d.ts.map +1 -0
- package/dist/media/audio/audio-source.js +2 -0
- package/dist/media/audio/audio-source.js.map +1 -0
- package/dist/media/audio/index.d.ts +57 -0
- package/dist/media/audio/index.d.ts.map +1 -0
- package/dist/media/audio/index.js +170 -0
- package/dist/media/audio/index.js.map +1 -0
- package/dist/media/audio/mixer.d.ts +43 -0
- package/dist/media/audio/mixer.d.ts.map +1 -0
- package/dist/media/audio/mixer.js +51 -0
- package/dist/media/audio/mixer.js.map +1 -0
- package/dist/media/audio/shared-audio-context.d.ts +30 -0
- package/dist/media/audio/shared-audio-context.d.ts.map +1 -0
- package/dist/media/audio/shared-audio-context.js +68 -0
- package/dist/media/audio/shared-audio-context.js.map +1 -0
- package/dist/media/audio/types.d.ts +31 -0
- package/dist/media/audio/types.d.ts.map +1 -0
- package/dist/media/audio/types.js +2 -0
- package/dist/media/audio/types.js.map +1 -0
- package/dist/media/media-marker.d.ts +26 -0
- package/dist/media/media-marker.d.ts.map +1 -0
- package/dist/media/media-marker.js +26 -0
- package/dist/media/media-marker.js.map +1 -0
- package/dist/media/media-time.d.ts +17 -0
- package/dist/media/media-time.d.ts.map +1 -0
- package/dist/media/media-time.js +17 -0
- package/dist/media/media-time.js.map +1 -0
- package/dist/media/video/driver.d.ts +31 -0
- package/dist/media/video/driver.d.ts.map +1 -0
- package/dist/media/video/driver.js +3 -0
- package/dist/media/video/driver.js.map +1 -0
- package/dist/media/video/index.d.ts +66 -0
- package/dist/media/video/index.d.ts.map +1 -0
- package/dist/media/video/index.js +372 -0
- package/dist/media/video/index.js.map +1 -0
- package/dist/media/video/types.d.ts +36 -0
- package/dist/media/video/types.d.ts.map +1 -0
- package/dist/media/video/types.js +2 -0
- package/dist/media/video/types.js.map +1 -0
- package/dist/media/video/video-for-preview.d.ts +17 -0
- package/dist/media/video/video-for-preview.d.ts.map +1 -0
- package/dist/media/video/video-for-preview.js +30 -0
- package/dist/media/video/video-for-preview.js.map +1 -0
- package/dist/media/video/video-for-rendering.d.ts +17 -0
- package/dist/media/video/video-for-rendering.d.ts.map +1 -0
- package/dist/media/video/video-for-rendering.js +59 -0
- package/dist/media/video/video-for-rendering.js.map +1 -0
- package/dist/media/video/video-source-browser.d.ts +37 -0
- package/dist/media/video/video-source-browser.d.ts.map +1 -0
- package/dist/media/video/video-source-browser.js +171 -0
- package/dist/media/video/video-source-browser.js.map +1 -0
- package/dist/media/video/video-source-mediabunny.d.ts +69 -0
- package/dist/media/video/video-source-mediabunny.d.ts.map +1 -0
- package/dist/media/video/video-source-mediabunny.js +236 -0
- package/dist/media/video/video-source-mediabunny.js.map +1 -0
- package/dist/media/video/video-source.d.ts +48 -0
- package/dist/media/video/video-source.d.ts.map +1 -0
- package/dist/media/video/video-source.js +2 -0
- package/dist/media/video/video-source.js.map +1 -0
- package/dist/media-marker.d.ts +19 -0
- package/dist/media-marker.d.ts.map +1 -0
- package/dist/media-marker.js +19 -0
- package/dist/media-marker.js.map +1 -0
- package/dist/media-time.d.ts +17 -0
- package/dist/media-time.d.ts.map +1 -0
- package/dist/media-time.js +17 -0
- package/dist/media-time.js.map +1 -0
- package/dist/signal.d.ts +10 -0
- package/dist/signal.d.ts.map +1 -0
- package/dist/signal.js +39 -0
- package/dist/signal.js.map +1 -0
- package/dist/text.d.ts +91 -0
- package/dist/text.d.ts.map +1 -0
- package/dist/text.js +704 -0
- package/dist/text.js.map +1 -0
- package/dist/video/driver.d.ts +31 -0
- package/dist/video/driver.d.ts.map +1 -0
- package/dist/video/driver.js +3 -0
- package/dist/video/driver.js.map +1 -0
- package/dist/video/index.d.ts +45 -0
- package/dist/video/index.d.ts.map +1 -0
- package/dist/video/index.js +276 -0
- package/dist/video/index.js.map +1 -0
- package/dist/video/types.d.ts +35 -0
- package/dist/video/types.d.ts.map +1 -0
- package/dist/video/types.js +2 -0
- package/dist/video/types.js.map +1 -0
- package/dist/video/video-for-preview.d.ts +12 -0
- package/dist/video/video-for-preview.d.ts.map +1 -0
- package/dist/video/video-for-preview.js +73 -0
- package/dist/video/video-for-preview.js.map +1 -0
- package/dist/video/video-for-rendering.d.ts +16 -0
- package/dist/video/video-for-rendering.d.ts.map +1 -0
- package/dist/video/video-for-rendering.js +45 -0
- package/dist/video/video-for-rendering.js.map +1 -0
- package/dist/video/video-source-browser.d.ts +37 -0
- package/dist/video/video-source-browser.d.ts.map +1 -0
- package/dist/video/video-source-browser.js +171 -0
- package/dist/video/video-source-browser.js.map +1 -0
- package/dist/video/video-source.d.ts +48 -0
- package/dist/video/video-source.d.ts.map +1 -0
- package/dist/video/video-source.js +2 -0
- package/dist/video/video-source.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mixer.d.ts","sourceRoot":"","sources":["../../../src/media/audio/mixer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,cAAc,EAAe,MAAM,wBAAwB,CAAC;AAExF;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,iCAAiC;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,yDAAyD;IACzD,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IACxC,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,2EAA2E;IAC3E,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC;IAC3C,wEAAwE;IACxE,WAAW,IAAI,IAAI,CAAC;CACrB;AAED;;;;;;GAMG;AACH,qBAAa,UAAU;IACrB,0BAA0B;IAC1B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IAExC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2B;;IASrD,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAK1B,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI;IAK1B,oEAAoE;IACpE,QAAQ,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI;IAMhC,UAAU,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI;IAKlC,oEAAoE;IACpE,IAAI,QAAQ,IAAI,YAAY,EAAE,CAE7B;IAED,OAAO,CAAC,WAAW;CAGpB"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { createSignal } from "../../engine/signal.js";
|
|
2
|
+
/**
|
|
3
|
+
* Composition-level audio bus. Holds a master volume + mute that multiply into
|
|
4
|
+
* every registered {@link AudioChannel}: a channel's effective output is
|
|
5
|
+
* `master × channel.volume`, muted when `masterMuted || channel.muted`. The
|
|
6
|
+
* mixer never touches a source directly — on any change it asks each channel to
|
|
7
|
+
* re-apply its own audio.
|
|
8
|
+
*/
|
|
9
|
+
export class AudioMixer {
|
|
10
|
+
/** Master level, 0..1. */
|
|
11
|
+
volume;
|
|
12
|
+
muted;
|
|
13
|
+
_volume;
|
|
14
|
+
_muted;
|
|
15
|
+
_channels = new Set();
|
|
16
|
+
constructor() {
|
|
17
|
+
this._volume = createSignal(1);
|
|
18
|
+
this._muted = createSignal(false);
|
|
19
|
+
this.volume = this._volume;
|
|
20
|
+
this.muted = this._muted;
|
|
21
|
+
}
|
|
22
|
+
setVolume(v) {
|
|
23
|
+
this._volume.set(Math.max(0, Math.min(1, v)));
|
|
24
|
+
this._reapplyAll();
|
|
25
|
+
}
|
|
26
|
+
setMuted(m) {
|
|
27
|
+
this._muted.set(m);
|
|
28
|
+
this._reapplyAll();
|
|
29
|
+
}
|
|
30
|
+
/** Register a channel. Idempotent — the Set dedupes by instance. */
|
|
31
|
+
register(ch) {
|
|
32
|
+
if (this._channels.has(ch))
|
|
33
|
+
return;
|
|
34
|
+
this._channels.add(ch);
|
|
35
|
+
ch._bindMixer(this);
|
|
36
|
+
}
|
|
37
|
+
unregister(ch) {
|
|
38
|
+
if (!this._channels.delete(ch))
|
|
39
|
+
return;
|
|
40
|
+
ch._bindMixer(null);
|
|
41
|
+
}
|
|
42
|
+
/** Snapshot of registered channels — for building per-track UIs. */
|
|
43
|
+
get channels() {
|
|
44
|
+
return [...this._channels];
|
|
45
|
+
}
|
|
46
|
+
_reapplyAll() {
|
|
47
|
+
for (const c of this._channels)
|
|
48
|
+
c._applyAudio();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=mixer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mixer.js","sourceRoot":"","sources":["../../../src/media/audio/mixer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAoC,MAAM,wBAAwB,CAAC;AAoBxF;;;;;;GAMG;AACH,MAAM,OAAO,UAAU;IACrB,0BAA0B;IACjB,MAAM,CAAyB;IAC/B,KAAK,CAA0B;IAEvB,OAAO,CAAiB;IACxB,MAAM,CAAkB;IACxB,SAAS,GAAG,IAAI,GAAG,EAAgB,CAAC;IAErD;QACE,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QAC3B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,SAAS,CAAC,CAAS;QACjB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAED,QAAQ,CAAC,CAAU;QACjB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAED,oEAAoE;IACpE,QAAQ,CAAC,EAAgB;QACvB,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO;QACnC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,UAAU,CAAC,EAAgB;QACzB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YAAE,OAAO;QACvC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,oEAAoE;IACpE,IAAI,QAAQ;QACV,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IAEO,WAAW;QACjB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS;YAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAClD,CAAC;CACF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Composition } from "../../engine/composition.js";
|
|
2
|
+
/**
|
|
3
|
+
* Browser-only Web Audio bus, one per {@link Composition}. Owns the single
|
|
4
|
+
* {@link AudioContext} every preview audio clip schedules against, plus a master
|
|
5
|
+
* {@link GainNode} feeding the speakers. Created lazily on first use (so nothing
|
|
6
|
+
* touches `AudioContext` in Node) and cached per composition.
|
|
7
|
+
*
|
|
8
|
+
* It deliberately knows nothing about clips or timing — the per-clip
|
|
9
|
+
* {@link PreviewAudioDriver} owns the schedule-ahead pump and the timeline↔context
|
|
10
|
+
* clock anchor. This just hands out a context, a channel gain, and `resume()`.
|
|
11
|
+
*/
|
|
12
|
+
export declare class SharedAudioContext {
|
|
13
|
+
private _ctx;
|
|
14
|
+
private _master;
|
|
15
|
+
/** The live context, created on first access. Null only if Web Audio is absent. */
|
|
16
|
+
get context(): AudioContext | null;
|
|
17
|
+
/** Current context clock in seconds, or 0 if Web Audio is absent. */
|
|
18
|
+
now(): number;
|
|
19
|
+
/**
|
|
20
|
+
* Resume the context — `AudioContext` starts suspended until a user gesture.
|
|
21
|
+
* Safe to call repeatedly; resolves once running (or immediately if no context).
|
|
22
|
+
*/
|
|
23
|
+
resume(): Promise<void>;
|
|
24
|
+
/** A fresh per-clip {@link GainNode} wired into the master bus. */
|
|
25
|
+
createChannelGain(): GainNode | null;
|
|
26
|
+
destroy(): void;
|
|
27
|
+
}
|
|
28
|
+
/** Lazily get (and cache) the {@link SharedAudioContext} for a composition. */
|
|
29
|
+
export declare function getSharedAudioContext(comp: Composition): SharedAudioContext;
|
|
30
|
+
//# sourceMappingURL=shared-audio-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-audio-context.d.ts","sourceRoot":"","sources":["../../../src/media/audio/shared-audio-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE/D;;;;;;;;;GASG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,IAAI,CAA6B;IACzC,OAAO,CAAC,OAAO,CAAyB;IAExC,mFAAmF;IACnF,IAAI,OAAO,IAAI,YAAY,GAAG,IAAI,CAYjC;IAED,qEAAqE;IACrE,GAAG,IAAI,MAAM;IAIb;;;OAGG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAO7B,mEAAmE;IACnE,iBAAiB,IAAI,QAAQ,GAAG,IAAI;IAQpC,OAAO,IAAI,IAAI;CAKhB;AAID,+EAA+E;AAC/E,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,WAAW,GAAG,kBAAkB,CAO3E"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-only Web Audio bus, one per {@link Composition}. Owns the single
|
|
3
|
+
* {@link AudioContext} every preview audio clip schedules against, plus a master
|
|
4
|
+
* {@link GainNode} feeding the speakers. Created lazily on first use (so nothing
|
|
5
|
+
* touches `AudioContext` in Node) and cached per composition.
|
|
6
|
+
*
|
|
7
|
+
* It deliberately knows nothing about clips or timing — the per-clip
|
|
8
|
+
* {@link PreviewAudioDriver} owns the schedule-ahead pump and the timeline↔context
|
|
9
|
+
* clock anchor. This just hands out a context, a channel gain, and `resume()`.
|
|
10
|
+
*/
|
|
11
|
+
export class SharedAudioContext {
|
|
12
|
+
_ctx = null;
|
|
13
|
+
_master = null;
|
|
14
|
+
/** The live context, created on first access. Null only if Web Audio is absent. */
|
|
15
|
+
get context() {
|
|
16
|
+
if (this._ctx)
|
|
17
|
+
return this._ctx;
|
|
18
|
+
const Ctor = typeof globalThis.AudioContext === "function"
|
|
19
|
+
? globalThis.AudioContext
|
|
20
|
+
: globalThis
|
|
21
|
+
.webkitAudioContext;
|
|
22
|
+
if (!Ctor)
|
|
23
|
+
return null;
|
|
24
|
+
this._ctx = new Ctor();
|
|
25
|
+
this._master = this._ctx.createGain();
|
|
26
|
+
this._master.connect(this._ctx.destination);
|
|
27
|
+
return this._ctx;
|
|
28
|
+
}
|
|
29
|
+
/** Current context clock in seconds, or 0 if Web Audio is absent. */
|
|
30
|
+
now() {
|
|
31
|
+
return this.context?.currentTime ?? 0;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Resume the context — `AudioContext` starts suspended until a user gesture.
|
|
35
|
+
* Safe to call repeatedly; resolves once running (or immediately if no context).
|
|
36
|
+
*/
|
|
37
|
+
async resume() {
|
|
38
|
+
const ctx = this.context;
|
|
39
|
+
if (ctx && ctx.state === "suspended") {
|
|
40
|
+
await ctx.resume().catch(() => { });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/** A fresh per-clip {@link GainNode} wired into the master bus. */
|
|
44
|
+
createChannelGain() {
|
|
45
|
+
const ctx = this.context;
|
|
46
|
+
if (!ctx || !this._master)
|
|
47
|
+
return null;
|
|
48
|
+
const gain = ctx.createGain();
|
|
49
|
+
gain.connect(this._master);
|
|
50
|
+
return gain;
|
|
51
|
+
}
|
|
52
|
+
destroy() {
|
|
53
|
+
void this._ctx?.close().catch(() => { });
|
|
54
|
+
this._ctx = null;
|
|
55
|
+
this._master = null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const perComposition = new WeakMap();
|
|
59
|
+
/** Lazily get (and cache) the {@link SharedAudioContext} for a composition. */
|
|
60
|
+
export function getSharedAudioContext(comp) {
|
|
61
|
+
let shared = perComposition.get(comp);
|
|
62
|
+
if (!shared) {
|
|
63
|
+
shared = new SharedAudioContext();
|
|
64
|
+
perComposition.set(comp, shared);
|
|
65
|
+
}
|
|
66
|
+
return shared;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=shared-audio-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-audio-context.js","sourceRoot":"","sources":["../../../src/media/audio/shared-audio-context.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,OAAO,kBAAkB;IACrB,IAAI,GAAwB,IAAI,CAAC;IACjC,OAAO,GAAoB,IAAI,CAAC;IAExC,mFAAmF;IACnF,IAAI,OAAO;QACT,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC;QAChC,MAAM,IAAI,GACR,OAAO,UAAU,CAAC,YAAY,KAAK,UAAU;YAC3C,CAAC,CAAC,UAAU,CAAC,YAAY;YACzB,CAAC,CAAE,UAAsE;iBACpE,kBAAkB,CAAC;QAC5B,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACtC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,qEAAqE;IACrE,GAAG;QACD,OAAO,IAAI,CAAC,OAAO,EAAE,WAAW,IAAI,CAAC,CAAC;IACxC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM;QACV,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC;QACzB,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YACrC,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,mEAAmE;IACnE,iBAAiB;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC;QACzB,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QACvC,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,KAAK,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;CACF;AAED,MAAM,cAAc,GAAG,IAAI,OAAO,EAAmC,CAAC;AAEtE,+EAA+E;AAC/E,MAAM,UAAU,qBAAqB,CAAC,IAAiB;IACrD,IAAI,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;QAClC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { AudioSourceFactory } from "./audio-source.js";
|
|
2
|
+
/**
|
|
3
|
+
* Config for {@link Audio}. Mirrors Remotion's `<Audio>` playback props
|
|
4
|
+
* (`trimBefore`/`trimAfter`/`loop`/`muted`/`volume`/`playbackRate`) plus a
|
|
5
|
+
* `sourceFactory` dependency-injection seam. Unlike {@link VideoConfig} there
|
|
6
|
+
* are no visual/layout props — audio produces no pixels.
|
|
7
|
+
*/
|
|
8
|
+
export type AudioConfig = {
|
|
9
|
+
src: string;
|
|
10
|
+
/** Stable id used for the Konva node and rendered {@link AudioAsset}s. */
|
|
11
|
+
id?: string;
|
|
12
|
+
/** Human label for the audio mixer channel / UIs. Defaults to {@link src}. */
|
|
13
|
+
name?: string;
|
|
14
|
+
/** Frames trimmed from the start of the media (composition fps). Remotion v4 name. */
|
|
15
|
+
trimBefore?: number;
|
|
16
|
+
/** Exclusive frame bound — media past this offset is trimmed (composition fps). */
|
|
17
|
+
trimAfter?: number;
|
|
18
|
+
/** @deprecated alias of {@link trimBefore} (Remotion's pre-v4.0.319 name). */
|
|
19
|
+
startFrom?: number;
|
|
20
|
+
/** @deprecated alias of {@link trimAfter} (Remotion's pre-v4.0.319 name). */
|
|
21
|
+
endAt?: number;
|
|
22
|
+
/** Repeat the trimmed clip within its sequence window instead of freezing on the last frame. */
|
|
23
|
+
loop?: boolean;
|
|
24
|
+
muted?: boolean;
|
|
25
|
+
/** 0..1 */
|
|
26
|
+
volume?: number;
|
|
27
|
+
playbackRate?: number;
|
|
28
|
+
/** Inject an alternative AudioSource. Defaults to BrowserAudioSource. */
|
|
29
|
+
sourceFactory?: AudioSourceFactory;
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/media/audio/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,0EAA0E;IAC1E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,8EAA8E;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mFAAmF;IACnF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gGAAgG;IAChG,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,aAAa,CAAC,EAAE,kBAAkB,CAAC;CACpC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/media/audio/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Marker attrs stamped on media nodes ({@link Video}, {@link Audio}) and
|
|
3
|
+
* inspected by `Sequence`/`Composition`. Kept in a dependency-free leaf so
|
|
4
|
+
* `composition.ts` can discover media by string without importing `video/` or
|
|
5
|
+
* `audio/` (which would create an import cycle).
|
|
6
|
+
*/
|
|
7
|
+
/** Set by every tickable media node — drives Sequence discovery + mixer registration. */
|
|
8
|
+
export declare const MEDIA_MARK = "__kmIsMedia";
|
|
9
|
+
/** Additionally set by {@link Video} — backs `isVideoNode`. */
|
|
10
|
+
export declare const VIDEO_MARK = "__kmIsVideo";
|
|
11
|
+
/** Additionally set by {@link Audio} — backs `isAudioNode`. */
|
|
12
|
+
export declare const AUDIO_MARK = "__kmIsAudio";
|
|
13
|
+
/**
|
|
14
|
+
* Set by non-media nodes that still want a per-frame `_kmTick` callback (e.g.
|
|
15
|
+
* {@link Text}'s typewriter). Discovered by `Sequence` alongside media, but
|
|
16
|
+
* NOT registered with the audio mixer.
|
|
17
|
+
*/
|
|
18
|
+
export declare const TICK_MARK = "__kmIsTick";
|
|
19
|
+
/**
|
|
20
|
+
* Set by {@link Font} nodes. Walked by `Composition.add` so a scene-declared
|
|
21
|
+
* font is loaded (and buffered on) before playback. Kept here, like the other
|
|
22
|
+
* markers, so `composition.ts` discovers fonts by string without importing
|
|
23
|
+
* `layout/text/` (avoiding an import cycle).
|
|
24
|
+
*/
|
|
25
|
+
export declare const FONT_MARK = "__kmIsFont";
|
|
26
|
+
//# sourceMappingURL=media-marker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-marker.d.ts","sourceRoot":"","sources":["../../src/media/media-marker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,yFAAyF;AACzF,eAAO,MAAM,UAAU,gBAAgB,CAAC;AACxC,+DAA+D;AAC/D,eAAO,MAAM,UAAU,gBAAgB,CAAC;AACxC,+DAA+D;AAC/D,eAAO,MAAM,UAAU,gBAAgB,CAAC;AACxC;;;;GAIG;AACH,eAAO,MAAM,SAAS,eAAe,CAAC;AACtC;;;;;GAKG;AACH,eAAO,MAAM,SAAS,eAAe,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Marker attrs stamped on media nodes ({@link Video}, {@link Audio}) and
|
|
3
|
+
* inspected by `Sequence`/`Composition`. Kept in a dependency-free leaf so
|
|
4
|
+
* `composition.ts` can discover media by string without importing `video/` or
|
|
5
|
+
* `audio/` (which would create an import cycle).
|
|
6
|
+
*/
|
|
7
|
+
/** Set by every tickable media node — drives Sequence discovery + mixer registration. */
|
|
8
|
+
export const MEDIA_MARK = "__kmIsMedia";
|
|
9
|
+
/** Additionally set by {@link Video} — backs `isVideoNode`. */
|
|
10
|
+
export const VIDEO_MARK = "__kmIsVideo";
|
|
11
|
+
/** Additionally set by {@link Audio} — backs `isAudioNode`. */
|
|
12
|
+
export const AUDIO_MARK = "__kmIsAudio";
|
|
13
|
+
/**
|
|
14
|
+
* Set by non-media nodes that still want a per-frame `_kmTick` callback (e.g.
|
|
15
|
+
* {@link Text}'s typewriter). Discovered by `Sequence` alongside media, but
|
|
16
|
+
* NOT registered with the audio mixer.
|
|
17
|
+
*/
|
|
18
|
+
export const TICK_MARK = "__kmIsTick";
|
|
19
|
+
/**
|
|
20
|
+
* Set by {@link Font} nodes. Walked by `Composition.add` so a scene-declared
|
|
21
|
+
* font is loaded (and buffered on) before playback. Kept here, like the other
|
|
22
|
+
* markers, so `composition.ts` discovers fonts by string without importing
|
|
23
|
+
* `layout/text/` (avoiding an import cycle).
|
|
24
|
+
*/
|
|
25
|
+
export const FONT_MARK = "__kmIsFont";
|
|
26
|
+
//# sourceMappingURL=media-marker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-marker.js","sourceRoot":"","sources":["../../src/media/media-marker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,yFAAyF;AACzF,MAAM,CAAC,MAAM,UAAU,GAAG,aAAa,CAAC;AACxC,+DAA+D;AAC/D,MAAM,CAAC,MAAM,UAAU,GAAG,aAAa,CAAC;AACxC,+DAA+D;AAC/D,MAAM,CAAC,MAAM,UAAU,GAAG,aAAa,CAAC;AACxC;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,YAAY,CAAC;AACtC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,YAAY,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Resolved per-clip timing, derived from a media config + composition fps. */
|
|
2
|
+
export type MediaTiming = {
|
|
3
|
+
fps: number;
|
|
4
|
+
/** Frames trimmed from the start of the media. */
|
|
5
|
+
trimBefore: number;
|
|
6
|
+
/** Exclusive frame bound, or undefined to play to the media's natural end. */
|
|
7
|
+
trimAfter?: number;
|
|
8
|
+
loop: boolean;
|
|
9
|
+
playbackRate: number;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Convert a local frame to a media time in seconds — Remotion's `getMediaTime`,
|
|
13
|
+
* extended with `loop` wrap-around. Without `loop`, the media freezes on its
|
|
14
|
+
* last in-range frame (Remotion's default behavior). Shared by video and audio.
|
|
15
|
+
*/
|
|
16
|
+
export declare function getMediaTime(localFrame: number, timing: MediaTiming): number;
|
|
17
|
+
//# sourceMappingURL=media-time.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-time.d.ts","sourceRoot":"","sources":["../../src/media/media-time.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,kDAAkD;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CAU5E"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert a local frame to a media time in seconds — Remotion's `getMediaTime`,
|
|
3
|
+
* extended with `loop` wrap-around. Without `loop`, the media freezes on its
|
|
4
|
+
* last in-range frame (Remotion's default behavior). Shared by video and audio.
|
|
5
|
+
*/
|
|
6
|
+
export function getMediaTime(localFrame, timing) {
|
|
7
|
+
const { fps, trimBefore, trimAfter, loop, playbackRate } = timing;
|
|
8
|
+
const advanced = localFrame * playbackRate;
|
|
9
|
+
if (trimAfter === undefined) {
|
|
10
|
+
// No explicit end bound: play forward; loop has no length to wrap to.
|
|
11
|
+
return (trimBefore + advanced) / fps;
|
|
12
|
+
}
|
|
13
|
+
const loopLen = Math.max(1, trimAfter - trimBefore);
|
|
14
|
+
const eff = loop ? ((advanced % loopLen) + loopLen) % loopLen : Math.min(advanced, loopLen - 1);
|
|
15
|
+
return (trimBefore + eff) / fps;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=media-time.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-time.js","sourceRoot":"","sources":["../../src/media/media-time.ts"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,UAAkB,EAAE,MAAmB;IAClE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;IAClE,MAAM,QAAQ,GAAG,UAAU,GAAG,YAAY,CAAC;IAC3C,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,sEAAsE;QACtE,OAAO,CAAC,UAAU,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC;IACvC,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC,CAAC;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;IAChG,OAAO,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Composition } from "../../engine/composition.js";
|
|
2
|
+
import type { MediaTiming } from "../media-time.js";
|
|
3
|
+
import { getMediaTime } from "../media-time.js";
|
|
4
|
+
import type { VideoSource } from "./video-source.js";
|
|
5
|
+
/** Resolved per-video timing — alias of the shared {@link MediaTiming}. */
|
|
6
|
+
export type VideoTiming = MediaTiming;
|
|
7
|
+
export { getMediaTime };
|
|
8
|
+
/**
|
|
9
|
+
* What a driver needs from the host {@link Video}: the media source, the
|
|
10
|
+
* resolved timing, the owning composition (for the render gate + play state),
|
|
11
|
+
* and a redraw hook (relayout + batchDraw).
|
|
12
|
+
*/
|
|
13
|
+
export type VideoDriverContext = {
|
|
14
|
+
readonly source: VideoSource;
|
|
15
|
+
readonly timing: VideoTiming;
|
|
16
|
+
readonly comp: Composition;
|
|
17
|
+
redraw(): void;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Strategy that maps the composition's current frame onto the media. Mirrors
|
|
21
|
+
* Remotion's split between `VideoForRendering` and `VideoForPreview`.
|
|
22
|
+
*/
|
|
23
|
+
export interface VideoDriver {
|
|
24
|
+
/** Called by Sequence each tick while the video is on-stage (`localFrame` = frame - sequence.from). */
|
|
25
|
+
tick(localFrame: number): void;
|
|
26
|
+
/** Called by Sequence when the video leaves range. */
|
|
27
|
+
deactivate(): void;
|
|
28
|
+
/** Release any subscriptions; called on `Video.destroy()`. */
|
|
29
|
+
dispose(): void;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../../src/media/video/driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,2EAA2E;AAC3E,MAAM,MAAM,WAAW,GAAG,WAAW,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,MAAM,IAAI,IAAI,CAAC;CAChB,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,uGAAuG;IACvG,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,sDAAsD;IACtD,UAAU,IAAI,IAAI,CAAC;IACnB,8DAA8D;IAC9D,OAAO,IAAI,IAAI,CAAC;CACjB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver.js","sourceRoot":"","sources":["../../../src/media/video/driver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAMhD,OAAO,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import Konva from "konva";
|
|
2
|
+
import { type ReadonlySignal } from "../../engine/signal.js";
|
|
3
|
+
import type { KMLayoutNode, LayoutBox } from "../../layout/contract.js";
|
|
4
|
+
import { type FlexilyNode } from "../../layout/flex/engine.js";
|
|
5
|
+
import type { AudioChannel, AudioMixer } from "../audio/mixer.js";
|
|
6
|
+
import type { VideoConfig } from "./types.js";
|
|
7
|
+
/**
|
|
8
|
+
* Timeline-driven video. API mirrors {@link Image} (`new Video({src, ...ImageProps})`)
|
|
9
|
+
* but the frame source is a runtime-agnostic {@link VideoSource} and playback is
|
|
10
|
+
* driven by the composition's frame clock. Picks a {@link RenderingVideoDriver}
|
|
11
|
+
* or {@link PreviewVideoDriver} based on the composition's {@link Environment}.
|
|
12
|
+
*/
|
|
13
|
+
export declare class Video extends Konva.Group implements AudioChannel, KMLayoutNode {
|
|
14
|
+
readonly _kmRole: "leaf";
|
|
15
|
+
/** Human label for mixer UIs — `config.name`, falling back to `config.src`. */
|
|
16
|
+
readonly label: string;
|
|
17
|
+
/** Intrinsic audio level, 0..1 — scaled by the composition mixer's master. */
|
|
18
|
+
readonly volume: ReadonlySignal<number>;
|
|
19
|
+
readonly muted: ReadonlySignal<boolean>;
|
|
20
|
+
private readonly _img;
|
|
21
|
+
private _source;
|
|
22
|
+
private readonly _env;
|
|
23
|
+
private readonly _factory;
|
|
24
|
+
private _suspended;
|
|
25
|
+
private readonly _trimBefore;
|
|
26
|
+
private readonly _trimAfter?;
|
|
27
|
+
private readonly _loop;
|
|
28
|
+
private readonly _playbackRate;
|
|
29
|
+
private readonly _volume;
|
|
30
|
+
private readonly _muted;
|
|
31
|
+
private _mixer;
|
|
32
|
+
private _driver;
|
|
33
|
+
private _audioDriver;
|
|
34
|
+
private readonly _src;
|
|
35
|
+
constructor(config: VideoConfig);
|
|
36
|
+
/**
|
|
37
|
+
* Create the media source and start loading it. Called once at construction
|
|
38
|
+
* and again by {@link _kmResume} after {@link _kmSuspend} dropped it.
|
|
39
|
+
*/
|
|
40
|
+
private _acquireSource;
|
|
41
|
+
/** @internal — {@link Composition.suspend}: drop the source to stop downloading/decoding. */
|
|
42
|
+
_kmSuspend(): void;
|
|
43
|
+
/** @internal — {@link Composition.resume}: re-acquire the dropped source. */
|
|
44
|
+
_kmResume(): void;
|
|
45
|
+
/** @internal — called by Sequence on each tick while this video is on-stage. */
|
|
46
|
+
_kmTick(localFrame: number): void;
|
|
47
|
+
/** @internal — called by Sequence when it goes out of range. */
|
|
48
|
+
_kmDeactivate(): void;
|
|
49
|
+
/** @internal — {@link KMLayoutNode}: size from explicit width/height (cover/contain handle the rest). */
|
|
50
|
+
_kmMeasure(node: FlexilyNode): void;
|
|
51
|
+
/** @internal — {@link KMLayoutNode}: write the computed box back + re-fit the frame. */
|
|
52
|
+
_kmPlace(box: LayoutBox): void;
|
|
53
|
+
private _ensureDriver;
|
|
54
|
+
setMuted(muted: boolean): void;
|
|
55
|
+
setVolume(volume: number): void;
|
|
56
|
+
/** @internal — {@link AudioMixer} hands us the bus (or null on unregister). */
|
|
57
|
+
_bindMixer(mixer: AudioMixer | null): void;
|
|
58
|
+
/** @internal — push effective level (master × intrinsic) to the source. */
|
|
59
|
+
_applyAudio(): void;
|
|
60
|
+
setPlaybackRate(rate: number): void;
|
|
61
|
+
destroy(): this;
|
|
62
|
+
/** @internal */
|
|
63
|
+
_layoutImage(): void;
|
|
64
|
+
}
|
|
65
|
+
export declare function isVideoNode(node: Konva.Node): node is Video;
|
|
66
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/media/video/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAAgB,KAAK,cAAc,EAAe,MAAM,wBAAwB,CAAC;AACxF,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAa,KAAK,WAAW,EAAa,MAAM,6BAA6B,CAAC;AAOrF,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGlE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAoC9C;;;;;GAKG;AACH,qBAAa,KAAM,SAAQ,KAAK,CAAC,KAAM,YAAW,YAAY,EAAE,YAAY;IAC1E,QAAQ,CAAC,OAAO,EAAG,MAAM,CAAU;IACnC,+EAA+E;IAC/E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,8EAA8E;IAC9E,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IAExC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAc;IAEnC,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAc;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAU;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;gBAElB,MAAM,EAAE,WAAW;IAiD/B;;;OAGG;IACH,OAAO,CAAC,cAAc;IAkBtB,6FAA6F;IAC7F,UAAU,IAAI,IAAI;IAYlB,6EAA6E;IAC7E,SAAS,IAAI,IAAI;IAMjB,gFAAgF;IAChF,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAMjC,gEAAgE;IAChE,aAAa,IAAI,IAAI;IAKrB,yGAAyG;IACzG,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAQnC,wFAAwF;IACxF,QAAQ,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI;IAQ9B,OAAO,CAAC,aAAa;IAyErB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAK9B,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK/B,+EAA+E;IAC/E,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI;IAK1C,2EAA2E;IAC3E,WAAW,IAAI,IAAI;IAQnB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI1B,OAAO,IAAI,IAAI;IAWxB,gBAAgB;IAChB,YAAY,IAAI,IAAI;CAyCrB;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,IAAI,IAAI,KAAK,CAE3D"}
|