remotion 3.3.51 → 3.3.52

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.
Files changed (198) hide show
  1. package/dist/AbsoluteFill.d.ts +6 -0
  2. package/dist/AbsoluteFill.js +28 -0
  3. package/dist/CanUseRemotionHooks.d.ts +5 -0
  4. package/dist/CanUseRemotionHooks.js +10 -0
  5. package/dist/Clipper.d.ts +7 -0
  6. package/dist/Clipper.js +24 -0
  7. package/dist/Composition.d.ts +23 -0
  8. package/dist/Composition.js +113 -0
  9. package/dist/CompositionManager.d.ts +82 -0
  10. package/dist/CompositionManager.js +164 -0
  11. package/dist/Folder.d.ts +15 -0
  12. package/dist/Folder.js +33 -0
  13. package/dist/IFrame.d.ts +2 -0
  14. package/dist/IFrame.js +24 -0
  15. package/dist/Img.d.ts +2 -0
  16. package/dist/Img.js +52 -0
  17. package/dist/NativeLayers.d.ts +13 -0
  18. package/dist/NativeLayers.js +29 -0
  19. package/dist/Null.d.ts +2 -0
  20. package/dist/Null.js +25 -0
  21. package/dist/RemotionRoot.d.ts +5 -0
  22. package/dist/RemotionRoot.js +73 -0
  23. package/dist/Sequence.d.ts +29 -0
  24. package/dist/Sequence.js +131 -0
  25. package/dist/Still.d.ts +2 -0
  26. package/dist/Still.js +9 -0
  27. package/dist/absolute-src.d.ts +1 -0
  28. package/dist/absolute-src.js +7 -0
  29. package/dist/asset-types.d.ts +50 -0
  30. package/dist/asset-types.js +1 -0
  31. package/dist/audio/Audio.d.ts +8 -0
  32. package/dist/audio/Audio.js +52 -0
  33. package/dist/audio/AudioForDevelopment.d.ts +11 -0
  34. package/dist/audio/AudioForDevelopment.js +94 -0
  35. package/dist/audio/AudioForRendering.d.ts +10 -0
  36. package/dist/audio/AudioForRendering.js +111 -0
  37. package/dist/audio/index.d.ts +2 -0
  38. package/dist/audio/index.js +18 -0
  39. package/dist/audio/props.d.ts +12 -0
  40. package/dist/audio/props.js +2 -0
  41. package/dist/audio/shared-audio-tags.d.ts +37 -0
  42. package/dist/audio/shared-audio-tags.js +222 -0
  43. package/dist/audio/use-audio-frame.d.ts +6 -0
  44. package/dist/audio/use-audio-frame.js +23 -0
  45. package/dist/bezier.d.ts +1 -0
  46. package/dist/bezier.js +114 -0
  47. package/dist/cancel-render.d.ts +1 -0
  48. package/dist/cancel-render.js +43 -0
  49. package/dist/cjs/series/index.js +5 -2
  50. package/dist/cjs/test/series.test.js +32 -27
  51. package/dist/cjs/version.d.ts +1 -1
  52. package/dist/cjs/version.js +1 -1
  53. package/dist/config/input-props.d.ts +1 -0
  54. package/dist/config/input-props.js +31 -0
  55. package/dist/config.d.ts +285 -0
  56. package/dist/config.js +21 -0
  57. package/dist/default-css.d.ts +3 -0
  58. package/dist/default-css.js +49 -0
  59. package/dist/delay-render.d.ts +14 -0
  60. package/dist/delay-render.js +77 -0
  61. package/dist/easing.d.ts +19 -0
  62. package/dist/easing.js +77 -0
  63. package/dist/esm/series/index.js +5 -2
  64. package/dist/esm/test/series.test.js +32 -27
  65. package/dist/esm/version.d.ts +1 -1
  66. package/dist/esm/version.js +1 -1
  67. package/dist/freeze.d.ts +7 -0
  68. package/dist/freeze.js +34 -0
  69. package/dist/get-asset-file-name.d.ts +1 -0
  70. package/dist/get-asset-file-name.js +14 -0
  71. package/dist/get-environment.d.ts +3 -0
  72. package/dist/get-environment.js +34 -0
  73. package/dist/get-preview-dom-element.d.ts +1 -0
  74. package/dist/get-preview-dom-element.js +7 -0
  75. package/dist/get-static-files.d.ts +17 -0
  76. package/dist/get-static-files.js +31 -0
  77. package/dist/get-timeline-clip-name.d.ts +1 -0
  78. package/dist/get-timeline-clip-name.js +25 -0
  79. package/dist/index.d.ts +92 -0
  80. package/dist/index.js +73 -0
  81. package/dist/internals.d.ts +97 -0
  82. package/dist/internals.js +99 -0
  83. package/dist/interpolate-colors.d.ts +5 -0
  84. package/dist/interpolate-colors.js +401 -0
  85. package/dist/interpolate.d.ts +18 -0
  86. package/dist/interpolate.js +123 -0
  87. package/dist/is-approximately-the-same.d.ts +1 -0
  88. package/dist/is-approximately-the-same.js +8 -0
  89. package/dist/is-player.d.ts +3 -0
  90. package/dist/is-player.js +14 -0
  91. package/dist/loading-indicator.d.ts +2 -0
  92. package/dist/loading-indicator.js +35 -0
  93. package/dist/loop/index.d.ts +9 -0
  94. package/dist/loop/index.js +29 -0
  95. package/dist/multiple-versions-warning.d.ts +1 -0
  96. package/dist/multiple-versions-warning.js +32 -0
  97. package/dist/nonce.d.ts +7 -0
  98. package/dist/nonce.js +17 -0
  99. package/dist/play-and-handle-not-allowed-error.d.ts +2 -0
  100. package/dist/play-and-handle-not-allowed-error.js +44 -0
  101. package/dist/portal-node.d.ts +1 -0
  102. package/dist/portal-node.js +23 -0
  103. package/dist/prefetch-state.d.ts +8 -0
  104. package/dist/prefetch-state.js +27 -0
  105. package/dist/prefetch.d.ts +9 -0
  106. package/dist/prefetch.js +108 -0
  107. package/dist/random.d.ts +7 -0
  108. package/dist/random.js +41 -0
  109. package/dist/register-root.d.ts +4 -0
  110. package/dist/register-root.js +33 -0
  111. package/dist/series/flatten-children.d.ts +2 -0
  112. package/dist/series/flatten-children.js +19 -0
  113. package/dist/series/index.d.ts +13 -0
  114. package/dist/series/index.js +60 -0
  115. package/dist/setup-env-variables.d.ts +2 -0
  116. package/dist/setup-env-variables.js +36 -0
  117. package/dist/spring/index.d.ts +27 -0
  118. package/dist/spring/index.js +51 -0
  119. package/dist/spring/measure-spring.d.ts +8 -0
  120. package/dist/spring/measure-spring.js +64 -0
  121. package/dist/spring/spring-utils.d.ts +21 -0
  122. package/dist/spring/spring-utils.js +103 -0
  123. package/dist/static-file.d.ts +5 -0
  124. package/dist/static-file.js +33 -0
  125. package/dist/timeline-position-state.d.ts +29 -0
  126. package/dist/timeline-position-state.js +41 -0
  127. package/dist/truthy.d.ts +3 -0
  128. package/dist/truthy.js +7 -0
  129. package/dist/tsconfig-cjs.tsbuildinfo +1 -1
  130. package/dist/use-current-frame.d.ts +6 -0
  131. package/dist/use-current-frame.js +28 -0
  132. package/dist/use-lazy-component.d.ts +7 -0
  133. package/dist/use-lazy-component.js +49 -0
  134. package/dist/use-media-in-timeline.d.ts +10 -0
  135. package/dist/use-media-in-timeline.js +129 -0
  136. package/dist/use-media-playback.d.ts +10 -0
  137. package/dist/use-media-playback.js +77 -0
  138. package/dist/use-media-tag-volume.d.ts +2 -0
  139. package/dist/use-media-tag-volume.js +31 -0
  140. package/dist/use-sync-volume-with-media-tag.d.ts +10 -0
  141. package/dist/use-sync-volume-with-media-tag.js +21 -0
  142. package/dist/use-unsafe-video-config.d.ts +2 -0
  143. package/dist/use-unsafe-video-config.js +27 -0
  144. package/dist/use-video-config.d.ts +7 -0
  145. package/dist/use-video-config.js +29 -0
  146. package/dist/use-video.d.ts +12 -0
  147. package/dist/use-video.js +28 -0
  148. package/dist/validate-media-props.d.ts +4 -0
  149. package/dist/validate-media-props.js +24 -0
  150. package/dist/validate-start-from-props.d.ts +1 -0
  151. package/dist/validate-start-from-props.js +31 -0
  152. package/dist/validation/validate-composition-id.d.ts +3 -0
  153. package/dist/validation/validate-composition-id.js +13 -0
  154. package/dist/validation/validate-dimensions.d.ts +1 -0
  155. package/dist/validation/validate-dimensions.js +21 -0
  156. package/dist/validation/validate-duration-in-frames.d.ts +1 -0
  157. package/dist/validation/validate-duration-in-frames.js +15 -0
  158. package/dist/validation/validate-folder-name.d.ts +3 -0
  159. package/dist/validation/validate-folder-name.js +19 -0
  160. package/dist/validation/validate-fps.d.ts +1 -0
  161. package/dist/validation/validate-fps.js +21 -0
  162. package/dist/validation/validate-offthreadvideo-image-format.d.ts +1 -0
  163. package/dist/validation/validate-offthreadvideo-image-format.js +15 -0
  164. package/dist/validation/validation-spring-duration.d.ts +1 -0
  165. package/dist/validation/validation-spring-duration.js +21 -0
  166. package/dist/version.d.ts +1 -0
  167. package/dist/version.js +5 -0
  168. package/dist/video/OffthreadVideo.d.ts +3 -0
  169. package/dist/video/OffthreadVideo.js +33 -0
  170. package/dist/video/OffthreadVideoForRendering.d.ts +3 -0
  171. package/dist/video/OffthreadVideoForRendering.js +104 -0
  172. package/dist/video/Video.d.ts +8 -0
  173. package/dist/video/Video.js +50 -0
  174. package/dist/video/VideoForDevelopment.d.ts +11 -0
  175. package/dist/video/VideoForDevelopment.js +113 -0
  176. package/dist/video/VideoForRendering.d.ts +10 -0
  177. package/dist/video/VideoForRendering.js +203 -0
  178. package/dist/video/duration-state.d.ts +17 -0
  179. package/dist/video/duration-state.js +34 -0
  180. package/dist/video/get-current-time.d.ts +13 -0
  181. package/dist/video/get-current-time.js +31 -0
  182. package/dist/video/index.d.ts +3 -0
  183. package/dist/video/index.js +7 -0
  184. package/dist/video/props.d.ts +25 -0
  185. package/dist/video/props.js +2 -0
  186. package/dist/video/video-fragment.d.ts +12 -0
  187. package/dist/video/video-fragment.js +60 -0
  188. package/dist/video-config.d.ts +8 -0
  189. package/dist/video-config.js +2 -0
  190. package/dist/volume-position-state.d.ts +19 -0
  191. package/dist/volume-position-state.js +32 -0
  192. package/dist/volume-prop.d.ts +7 -0
  193. package/dist/volume-prop.js +24 -0
  194. package/dist/warn-about-non-seekable-media.d.ts +1 -0
  195. package/dist/warn-about-non-seekable-media.js +34 -0
  196. package/dist/wrap-remotion-context.d.ts +18 -0
  197. package/dist/wrap-remotion-context.js +73 -0
  198. package/package.json +4 -5
package/dist/Null.js ADDED
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Null = void 0;
4
+ const react_1 = require("react");
5
+ const NativeLayers_1 = require("./NativeLayers");
6
+ const Null = () => {
7
+ const { setClipRegion } = (0, react_1.useContext)(NativeLayers_1.NativeLayersContext);
8
+ (0, react_1.useEffect)(() => {
9
+ setClipRegion((c) => {
10
+ if (c === null) {
11
+ return 'hide';
12
+ }
13
+ // Rendering multiple <Null> is fine, because they are all hidden
14
+ if (c === 'hide') {
15
+ return 'hide';
16
+ }
17
+ throw new Error('Cannot render <Null>, because another component clipping the region was already rendered (most likely <Clipper>)');
18
+ });
19
+ return () => {
20
+ setClipRegion(null);
21
+ };
22
+ }, [setClipRegion]);
23
+ return null;
24
+ };
25
+ exports.Null = Null;
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ export declare const RemotionRoot: React.FC<{
3
+ children: React.ReactNode;
4
+ numberOfAudioTags: number;
5
+ }>;
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RemotionRoot = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const shared_audio_tags_1 = require("./audio/shared-audio-tags");
7
+ const CompositionManager_1 = require("./CompositionManager");
8
+ const delay_render_1 = require("./delay-render");
9
+ const NativeLayers_1 = require("./NativeLayers");
10
+ const nonce_1 = require("./nonce");
11
+ const prefetch_state_1 = require("./prefetch-state");
12
+ const random_1 = require("./random");
13
+ const timeline_position_state_1 = require("./timeline-position-state");
14
+ const duration_state_1 = require("./video/duration-state");
15
+ const RemotionRoot = ({ children, numberOfAudioTags }) => {
16
+ var _a;
17
+ const [remotionRootId] = (0, react_1.useState)(() => String((0, random_1.random)(null)));
18
+ const [frame, setFrame] = (0, react_1.useState)((_a = window.remotion_initialFrame) !== null && _a !== void 0 ? _a : 0);
19
+ const [playing, setPlaying] = (0, react_1.useState)(false);
20
+ const imperativePlaying = (0, react_1.useRef)(false);
21
+ const [fastRefreshes, setFastRefreshes] = (0, react_1.useState)(0);
22
+ const [playbackRate, setPlaybackRate] = (0, react_1.useState)(1);
23
+ const audioAndVideoTags = (0, react_1.useRef)([]);
24
+ (0, react_1.useLayoutEffect)(() => {
25
+ if (typeof window !== 'undefined') {
26
+ window.remotion_setFrame = (f) => {
27
+ const id = (0, delay_render_1.delayRender)(`Setting the current frame to ${f}`);
28
+ setFrame(f);
29
+ requestAnimationFrame(() => (0, delay_render_1.continueRender)(id));
30
+ };
31
+ window.remotion_isPlayer = false;
32
+ }
33
+ }, []);
34
+ const timelineContextValue = (0, react_1.useMemo)(() => {
35
+ return {
36
+ frame,
37
+ playing,
38
+ imperativePlaying,
39
+ rootId: remotionRootId,
40
+ playbackRate,
41
+ setPlaybackRate,
42
+ audioAndVideoTags,
43
+ };
44
+ }, [frame, playbackRate, playing, remotionRootId]);
45
+ const setTimelineContextValue = (0, react_1.useMemo)(() => {
46
+ return {
47
+ setFrame,
48
+ setPlaying,
49
+ };
50
+ }, []);
51
+ const nonceContext = (0, react_1.useMemo)(() => {
52
+ let counter = 0;
53
+ return {
54
+ getNonce: () => counter++,
55
+ fastRefreshes,
56
+ };
57
+ }, [fastRefreshes]);
58
+ (0, react_1.useEffect)(() => {
59
+ if (module.hot) {
60
+ module.hot.addStatusHandler((status) => {
61
+ if (status === 'idle') {
62
+ setFastRefreshes((i) => i + 1);
63
+ }
64
+ });
65
+ }
66
+ }, []);
67
+ return ((0, jsx_runtime_1.jsx)(nonce_1.NonceContext.Provider, { value: nonceContext, children: (0, jsx_runtime_1.jsx)(timeline_position_state_1.TimelineContext.Provider, { value: timelineContextValue, children: (0, jsx_runtime_1.jsx)(timeline_position_state_1.SetTimelineContext.Provider, { value: setTimelineContextValue, children: (0, jsx_runtime_1.jsx)(prefetch_state_1.PrefetchProvider, { children: (0, jsx_runtime_1.jsx)(NativeLayers_1.NativeLayersProvider, { children: (0, jsx_runtime_1.jsx)(CompositionManager_1.CompositionManagerProvider, { children: (0, jsx_runtime_1.jsx)(duration_state_1.DurationsContextProvider, { children: (0, jsx_runtime_1.jsx)(shared_audio_tags_1.SharedAudioContextProvider
68
+ // In the preview, which is mostly played on Desktop, we opt out of the autoplay policy fix as described in https://github.com/remotion-dev/remotion/pull/554, as it mostly applies to mobile.
69
+ , {
70
+ // In the preview, which is mostly played on Desktop, we opt out of the autoplay policy fix as described in https://github.com/remotion-dev/remotion/pull/554, as it mostly applies to mobile.
71
+ numberOfAudioTags: numberOfAudioTags, children: children }) }) }) }) }) }) }) }));
72
+ };
73
+ exports.RemotionRoot = RemotionRoot;
@@ -0,0 +1,29 @@
1
+ import React from 'react';
2
+ export declare type SequenceContextType = {
3
+ cumulatedFrom: number;
4
+ relativeFrom: number;
5
+ parentFrom: number;
6
+ durationInFrames: number;
7
+ id: string;
8
+ };
9
+ export declare const SequenceContext: React.Context<SequenceContextType | null>;
10
+ export declare type LayoutAndStyle = {
11
+ layout: 'none';
12
+ } | {
13
+ layout?: 'absolute-fill';
14
+ style?: React.CSSProperties;
15
+ className?: string;
16
+ };
17
+ export declare type SequenceProps = {
18
+ children: React.ReactNode;
19
+ from?: number;
20
+ durationInFrames?: number;
21
+ name?: string;
22
+ showInTimeline?: boolean;
23
+ showLoopTimesInTimeline?: number;
24
+ } & LayoutAndStyle;
25
+ /**
26
+ * A component that time-shifts its children and wraps them in an absolutely positioned <div>.
27
+ * @link https://www.remotion.dev/docs/sequence
28
+ */
29
+ export declare const Sequence: React.ForwardRefExoticComponent<SequenceProps & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Sequence = exports.SequenceContext = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const AbsoluteFill_1 = require("./AbsoluteFill");
7
+ const CompositionManager_1 = require("./CompositionManager");
8
+ const get_environment_1 = require("./get-environment");
9
+ const get_timeline_clip_name_1 = require("./get-timeline-clip-name");
10
+ const nonce_1 = require("./nonce");
11
+ const timeline_position_state_1 = require("./timeline-position-state");
12
+ const use_video_config_1 = require("./use-video-config");
13
+ exports.SequenceContext = (0, react_1.createContext)(null);
14
+ const SequenceRefForwardingFunction = ({ from = 0, durationInFrames = Infinity, children, name, showInTimeline = true, showLoopTimesInTimeline, ...other }, ref) => {
15
+ const { layout = 'absolute-fill' } = other;
16
+ const [id] = (0, react_1.useState)(() => String(Math.random()));
17
+ const parentSequence = (0, react_1.useContext)(exports.SequenceContext);
18
+ const { rootId } = (0, react_1.useContext)(timeline_position_state_1.TimelineContext);
19
+ const cumulatedFrom = parentSequence
20
+ ? parentSequence.cumulatedFrom + parentSequence.relativeFrom
21
+ : 0;
22
+ const nonce = (0, nonce_1.useNonce)();
23
+ const environment = (0, get_environment_1.useRemotionEnvironment)();
24
+ if (layout !== 'absolute-fill' && layout !== 'none') {
25
+ throw new TypeError(`The layout prop of <Sequence /> expects either "absolute-fill" or "none", but you passed: ${layout}`);
26
+ }
27
+ // @ts-expect-error
28
+ if (layout === 'none' && typeof other.style !== 'undefined') {
29
+ throw new TypeError('If layout="none", you may not pass a style.');
30
+ }
31
+ if (typeof durationInFrames !== 'number') {
32
+ throw new TypeError(`You passed to durationInFrames an argument of type ${typeof durationInFrames}, but it must be a number.`);
33
+ }
34
+ if (durationInFrames <= 0) {
35
+ throw new TypeError(`durationInFrames must be positive, but got ${durationInFrames}`);
36
+ }
37
+ // Infinity is non-integer but allowed!
38
+ if (durationInFrames % 1 !== 0 && Number.isFinite(durationInFrames)) {
39
+ throw new TypeError(`The "durationInFrames" of a sequence must be an integer, but got ${durationInFrames}.`);
40
+ }
41
+ if (typeof from !== 'number') {
42
+ throw new TypeError(`You passed to the "from" props of your <Sequence> an argument of type ${typeof from}, but it must be a number.`);
43
+ }
44
+ if (from % 1 !== 0) {
45
+ throw new TypeError(`The "from" prop of a sequence must be an integer, but got ${from}.`);
46
+ }
47
+ const absoluteFrame = (0, timeline_position_state_1.useTimelinePosition)();
48
+ const videoConfig = (0, use_video_config_1.useVideoConfig)();
49
+ const parentSequenceDuration = parentSequence
50
+ ? Math.min(parentSequence.durationInFrames - from, durationInFrames)
51
+ : durationInFrames;
52
+ const actualDurationInFrames = Math.max(0, Math.min(videoConfig.durationInFrames - from, parentSequenceDuration));
53
+ const { registerSequence, unregisterSequence } = (0, react_1.useContext)(CompositionManager_1.CompositionManager);
54
+ const contextValue = (0, react_1.useMemo)(() => {
55
+ var _a;
56
+ return {
57
+ cumulatedFrom,
58
+ relativeFrom: from,
59
+ durationInFrames: actualDurationInFrames,
60
+ parentFrom: (_a = parentSequence === null || parentSequence === void 0 ? void 0 : parentSequence.relativeFrom) !== null && _a !== void 0 ? _a : 0,
61
+ id,
62
+ };
63
+ }, [
64
+ cumulatedFrom,
65
+ from,
66
+ actualDurationInFrames,
67
+ parentSequence === null || parentSequence === void 0 ? void 0 : parentSequence.relativeFrom,
68
+ id,
69
+ ]);
70
+ const timelineClipName = (0, react_1.useMemo)(() => {
71
+ return name !== null && name !== void 0 ? name : (0, get_timeline_clip_name_1.getTimelineClipName)(children);
72
+ }, [children, name]);
73
+ (0, react_1.useEffect)(() => {
74
+ var _a;
75
+ if (environment !== 'preview') {
76
+ return;
77
+ }
78
+ registerSequence({
79
+ from,
80
+ duration: actualDurationInFrames,
81
+ id,
82
+ displayName: timelineClipName,
83
+ parent: (_a = parentSequence === null || parentSequence === void 0 ? void 0 : parentSequence.id) !== null && _a !== void 0 ? _a : null,
84
+ type: 'sequence',
85
+ rootId,
86
+ showInTimeline,
87
+ nonce,
88
+ showLoopTimesInTimeline,
89
+ });
90
+ return () => {
91
+ unregisterSequence(id);
92
+ };
93
+ }, [
94
+ durationInFrames,
95
+ id,
96
+ name,
97
+ registerSequence,
98
+ timelineClipName,
99
+ unregisterSequence,
100
+ parentSequence === null || parentSequence === void 0 ? void 0 : parentSequence.id,
101
+ actualDurationInFrames,
102
+ rootId,
103
+ from,
104
+ showInTimeline,
105
+ nonce,
106
+ showLoopTimesInTimeline,
107
+ environment,
108
+ ]);
109
+ const endThreshold = cumulatedFrom + from + durationInFrames - 1;
110
+ const content = absoluteFrame < cumulatedFrom + from
111
+ ? null
112
+ : absoluteFrame > endThreshold
113
+ ? null
114
+ : children;
115
+ const styleIfThere = other.layout === 'none' ? undefined : other.style;
116
+ const defaultStyle = (0, react_1.useMemo)(() => {
117
+ return {
118
+ flexDirection: undefined,
119
+ ...(styleIfThere !== null && styleIfThere !== void 0 ? styleIfThere : {}),
120
+ };
121
+ }, [styleIfThere]);
122
+ if (ref !== null && layout === 'none') {
123
+ throw new TypeError('It is not supported to pass both a `ref` and `layout="none"` to <Sequence />.');
124
+ }
125
+ return ((0, jsx_runtime_1.jsx)(exports.SequenceContext.Provider, { value: contextValue, children: content === null ? null : other.layout === 'none' ? (content) : ((0, jsx_runtime_1.jsx)(AbsoluteFill_1.AbsoluteFill, { ref: ref, style: defaultStyle, className: other.className, children: content })) }));
126
+ };
127
+ /**
128
+ * A component that time-shifts its children and wraps them in an absolutely positioned <div>.
129
+ * @link https://www.remotion.dev/docs/sequence
130
+ */
131
+ exports.Sequence = (0, react_1.forwardRef)(SequenceRefForwardingFunction);
@@ -0,0 +1,2 @@
1
+ import type { StillProps } from './Composition';
2
+ export declare const Still: <T>(props: StillProps<T>) => JSX.Element;
package/dist/Still.js ADDED
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Still = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const Composition_1 = require("./Composition");
6
+ const Still = (props) => {
7
+ return (0, jsx_runtime_1.jsx)(Composition_1.Composition, { fps: 1, durationInFrames: 1, ...props });
8
+ };
9
+ exports.Still = Still;
@@ -0,0 +1 @@
1
+ export declare const getAbsoluteSrc: (relativeSrc: string) => string;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getAbsoluteSrc = void 0;
4
+ const getAbsoluteSrc = (relativeSrc) => {
5
+ return new URL(relativeSrc, window.location.origin).href;
6
+ };
7
+ exports.getAbsoluteSrc = getAbsoluteSrc;
@@ -0,0 +1,50 @@
1
+ declare module '*.webm' {
2
+ const src: string;
3
+ export default src;
4
+ }
5
+ declare module '*.png' {
6
+ const src: string;
7
+ export default src;
8
+ }
9
+ declare module '*.mp4' {
10
+ const src: string;
11
+ export default src;
12
+ }
13
+ declare module '*.mp3' {
14
+ const src: string;
15
+ export default src;
16
+ }
17
+ declare module '*.wav' {
18
+ const src: string;
19
+ export default src;
20
+ }
21
+ declare module '*.aac' {
22
+ const src: string;
23
+ export default src;
24
+ }
25
+ declare module '*.svg';
26
+ declare module '*.jpg' {
27
+ const src: string;
28
+ export default src;
29
+ }
30
+ declare module '*.jpeg' {
31
+ const src: string;
32
+ export default src;
33
+ }
34
+ declare module '*.bmp' {
35
+ const src: string;
36
+ export default src;
37
+ }
38
+ declare module '*.gif' {
39
+ const src: string;
40
+ export default src;
41
+ }
42
+ declare module '*.woff' {
43
+ const src: string;
44
+ export default src;
45
+ }
46
+ declare module '*.woff2' {
47
+ const src: string;
48
+ export default src;
49
+ }
50
+ declare module '*.css';
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import type { RemotionMainAudioProps } from './props';
3
+ export declare const Audio: React.ForwardRefExoticComponent<Pick<Omit<React.DetailedHTMLProps<React.AudioHTMLAttributes<HTMLAudioElement>, HTMLAudioElement>, "nonce" | "autoPlay" | "controls" | "onEnded" | "onResize" | "onResizeCapture"> & {
4
+ volume?: import("../volume-prop").VolumeProp | undefined;
5
+ playbackRate?: number | undefined;
6
+ acceptableTimeShiftInSeconds?: number | undefined;
7
+ allowAmplificationDuringRender?: boolean | undefined;
8
+ } & RemotionMainAudioProps, "children" | "id" | "slot" | "style" | "title" | "src" | "volume" | "playbackRate" | "allowAmplificationDuringRender" | "property" | "key" | "is" | "color" | "hidden" | "className" | "controlsList" | "crossOrigin" | "loop" | "mediaGroup" | "muted" | "playsInline" | "preload" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "lang" | "placeholder" | "spellCheck" | "tabIndex" | "translate" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "acceptableTimeShiftInSeconds" | keyof RemotionMainAudioProps> & React.RefAttributes<HTMLAudioElement>>;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Audio = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const get_environment_1 = require("../get-environment");
7
+ const loop_1 = require("../loop");
8
+ const Sequence_1 = require("../Sequence");
9
+ const use_video_config_1 = require("../use-video-config");
10
+ const validate_media_props_1 = require("../validate-media-props");
11
+ const validate_start_from_props_1 = require("../validate-start-from-props");
12
+ const duration_state_1 = require("../video/duration-state");
13
+ const AudioForDevelopment_1 = require("./AudioForDevelopment");
14
+ const AudioForRendering_1 = require("./AudioForRendering");
15
+ const shared_audio_tags_1 = require("./shared-audio-tags");
16
+ const AudioRefForwardingFunction = (props, ref) => {
17
+ var _a;
18
+ const audioContext = (0, react_1.useContext)(shared_audio_tags_1.SharedAudioContext);
19
+ const { startFrom, endAt, ...otherProps } = props;
20
+ const { loop, ...propsOtherThanLoop } = props;
21
+ const { fps } = (0, use_video_config_1.useVideoConfig)();
22
+ const environment = (0, get_environment_1.useRemotionEnvironment)();
23
+ const { durations, setDurations } = (0, react_1.useContext)(duration_state_1.DurationsContext);
24
+ if (typeof props.src !== 'string') {
25
+ throw new TypeError(`The \`<Audio>\` tag requires a string for \`src\`, but got ${JSON.stringify(props.src)} instead.`);
26
+ }
27
+ const onError = (0, react_1.useCallback)((e) => {
28
+ console.log(e.currentTarget.error);
29
+ throw new Error(`Could not play audio with src ${otherProps.src}: ${e.currentTarget.error}. See https://remotion.dev/docs/media-playback-error for help.`);
30
+ }, [otherProps.src]);
31
+ const onDuration = (0, react_1.useCallback)((src, durationInSeconds) => {
32
+ setDurations({ type: 'got-duration', durationInSeconds, src });
33
+ }, [setDurations]);
34
+ if (loop && props.src && durations[props.src] !== undefined) {
35
+ const duration = Math.floor(durations[props.src] * fps);
36
+ const playbackRate = (_a = props.playbackRate) !== null && _a !== void 0 ? _a : 1;
37
+ const actualDuration = duration / playbackRate;
38
+ return ((0, jsx_runtime_1.jsx)(loop_1.Loop, { layout: "none", durationInFrames: Math.floor(actualDuration), children: (0, jsx_runtime_1.jsx)(exports.Audio, { ...propsOtherThanLoop, ref: ref }) }));
39
+ }
40
+ if (typeof startFrom !== 'undefined' || typeof endAt !== 'undefined') {
41
+ (0, validate_start_from_props_1.validateStartFromProps)(startFrom, endAt);
42
+ const startFromFrameNo = startFrom !== null && startFrom !== void 0 ? startFrom : 0;
43
+ const endAtFrameNo = endAt !== null && endAt !== void 0 ? endAt : Infinity;
44
+ return ((0, jsx_runtime_1.jsx)(Sequence_1.Sequence, { layout: "none", from: 0 - startFromFrameNo, showInTimeline: false, durationInFrames: endAtFrameNo, children: (0, jsx_runtime_1.jsx)(exports.Audio, { ...otherProps, ref: ref }) }));
45
+ }
46
+ (0, validate_media_props_1.validateMediaProps)(props, 'Audio');
47
+ if (environment === 'rendering') {
48
+ return ((0, jsx_runtime_1.jsx)(AudioForRendering_1.AudioForRendering, { onDuration: onDuration, ...props, ref: ref, onError: onError }));
49
+ }
50
+ return ((0, jsx_runtime_1.jsx)(AudioForDevelopment_1.AudioForDevelopment, { shouldPreMountAudioTags: audioContext !== null && audioContext.numberOfAudioTags > 0, ...props, ref: ref, onError: onError, onDuration: onDuration }));
51
+ };
52
+ exports.Audio = (0, react_1.forwardRef)(AudioRefForwardingFunction);
@@ -0,0 +1,11 @@
1
+ import type { ForwardRefExoticComponent, RefAttributes } from 'react';
2
+ import React from 'react';
3
+ export declare const AudioForDevelopment: ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.AudioHTMLAttributes<HTMLAudioElement>, HTMLAudioElement>, "nonce" | "autoPlay" | "controls" | "onEnded" | "onResize" | "onResizeCapture"> & {
4
+ volume?: import("../volume-prop").VolumeProp | undefined;
5
+ playbackRate?: number | undefined;
6
+ acceptableTimeShiftInSeconds?: number | undefined;
7
+ allowAmplificationDuringRender?: boolean | undefined;
8
+ } & {
9
+ shouldPreMountAudioTags: boolean;
10
+ onDuration: (src: string, durationInSeconds: number) => void;
11
+ } & RefAttributes<HTMLAudioElement>>;
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AudioForDevelopment = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const prefetch_1 = require("../prefetch");
7
+ const random_1 = require("../random");
8
+ const Sequence_1 = require("../Sequence");
9
+ const use_media_in_timeline_1 = require("../use-media-in-timeline");
10
+ const use_media_playback_1 = require("../use-media-playback");
11
+ const use_media_tag_volume_1 = require("../use-media-tag-volume");
12
+ const use_sync_volume_with_media_tag_1 = require("../use-sync-volume-with-media-tag");
13
+ const volume_position_state_1 = require("../volume-position-state");
14
+ const shared_audio_tags_1 = require("./shared-audio-tags");
15
+ const use_audio_frame_1 = require("./use-audio-frame");
16
+ const AudioForDevelopmentForwardRefFunction = (props, ref) => {
17
+ const [initialShouldPreMountAudioElements] = (0, react_1.useState)(props.shouldPreMountAudioTags);
18
+ if (props.shouldPreMountAudioTags !== initialShouldPreMountAudioElements) {
19
+ throw new Error('Cannot change the behavior for pre-mounting audio tags dynamically.');
20
+ }
21
+ const [mediaVolume] = (0, volume_position_state_1.useMediaVolumeState)();
22
+ const [mediaMuted] = (0, volume_position_state_1.useMediaMutedState)();
23
+ const volumePropFrame = (0, use_audio_frame_1.useFrameForVolumeProp)();
24
+ const { volume, muted, playbackRate, shouldPreMountAudioTags, src, onDuration, acceptableTimeShiftInSeconds, ...nativeProps } = props;
25
+ if (!src) {
26
+ throw new TypeError("No 'src' was passed to <Audio>.");
27
+ }
28
+ const preloadedSrc = (0, prefetch_1.usePreload)(src);
29
+ const propsToPass = (0, react_1.useMemo)(() => {
30
+ return {
31
+ muted: muted || mediaMuted,
32
+ src: preloadedSrc,
33
+ ...nativeProps,
34
+ };
35
+ }, [mediaMuted, muted, nativeProps, preloadedSrc]);
36
+ const sequenceContext = (0, react_1.useContext)(Sequence_1.SequenceContext);
37
+ // Generate a string that's as unique as possible for this asset
38
+ // but at the same time deterministic. We use it to combat strict mode issues.
39
+ const id = (0, react_1.useMemo)(() => `audio-${(0, random_1.random)(src !== null && src !== void 0 ? src : '')}-${sequenceContext === null || sequenceContext === void 0 ? void 0 : sequenceContext.relativeFrom}-${sequenceContext === null || sequenceContext === void 0 ? void 0 : sequenceContext.cumulatedFrom}-${sequenceContext === null || sequenceContext === void 0 ? void 0 : sequenceContext.durationInFrames}-muted:${props.muted}`, [props.muted, src, sequenceContext]);
40
+ const audioRef = (0, shared_audio_tags_1.useSharedAudio)(propsToPass, id).el;
41
+ const actualVolume = (0, use_media_tag_volume_1.useMediaTagVolume)(audioRef);
42
+ (0, use_sync_volume_with_media_tag_1.useSyncVolumeWithMediaTag)({
43
+ volumePropFrame,
44
+ actualVolume,
45
+ volume,
46
+ mediaVolume,
47
+ mediaRef: audioRef,
48
+ });
49
+ (0, use_media_in_timeline_1.useMediaInTimeline)({
50
+ volume,
51
+ mediaVolume,
52
+ mediaRef: audioRef,
53
+ src,
54
+ mediaType: 'audio',
55
+ playbackRate: playbackRate !== null && playbackRate !== void 0 ? playbackRate : 1,
56
+ });
57
+ (0, use_media_playback_1.useMediaPlayback)({
58
+ mediaRef: audioRef,
59
+ src,
60
+ mediaType: 'audio',
61
+ playbackRate: playbackRate !== null && playbackRate !== void 0 ? playbackRate : 1,
62
+ onlyWarnForMediaSeekingError: false,
63
+ acceptableTimeshift: acceptableTimeShiftInSeconds !== null && acceptableTimeShiftInSeconds !== void 0 ? acceptableTimeShiftInSeconds : use_media_playback_1.DEFAULT_ACCEPTABLE_TIMESHIFT,
64
+ });
65
+ (0, react_1.useImperativeHandle)(ref, () => {
66
+ return audioRef.current;
67
+ }, [audioRef]);
68
+ const currentOnDurationCallback = (0, react_1.useRef)();
69
+ currentOnDurationCallback.current = onDuration;
70
+ (0, react_1.useEffect)(() => {
71
+ var _a;
72
+ const { current } = audioRef;
73
+ if (!current) {
74
+ return;
75
+ }
76
+ if (current.duration) {
77
+ (_a = currentOnDurationCallback.current) === null || _a === void 0 ? void 0 : _a.call(currentOnDurationCallback, src, current.duration);
78
+ return;
79
+ }
80
+ const onLoadedMetadata = () => {
81
+ var _a;
82
+ (_a = currentOnDurationCallback.current) === null || _a === void 0 ? void 0 : _a.call(currentOnDurationCallback, src, current.duration);
83
+ };
84
+ current.addEventListener('loadedmetadata', onLoadedMetadata);
85
+ return () => {
86
+ current.removeEventListener('loadedmetadata', onLoadedMetadata);
87
+ };
88
+ }, [audioRef, src]);
89
+ if (initialShouldPreMountAudioElements) {
90
+ return null;
91
+ }
92
+ return (0, jsx_runtime_1.jsx)("audio", { ref: audioRef, ...propsToPass });
93
+ };
94
+ exports.AudioForDevelopment = (0, react_1.forwardRef)(AudioForDevelopmentForwardRefFunction);
@@ -0,0 +1,10 @@
1
+ import type { ForwardRefExoticComponent, RefAttributes } from 'react';
2
+ import React from 'react';
3
+ export declare const AudioForRendering: ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.AudioHTMLAttributes<HTMLAudioElement>, HTMLAudioElement>, "nonce" | "autoPlay" | "controls" | "onEnded" | "onResize" | "onResizeCapture"> & {
4
+ volume?: import("../volume-prop").VolumeProp | undefined;
5
+ playbackRate?: number | undefined;
6
+ acceptableTimeShiftInSeconds?: number | undefined;
7
+ allowAmplificationDuringRender?: boolean | undefined;
8
+ } & {
9
+ onDuration: (src: string, durationInSeconds: number) => void;
10
+ } & RefAttributes<HTMLAudioElement>>;
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AudioForRendering = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const absolute_src_1 = require("../absolute-src");
7
+ const CompositionManager_1 = require("../CompositionManager");
8
+ const delay_render_1 = require("../delay-render");
9
+ const get_environment_1 = require("../get-environment");
10
+ const random_1 = require("../random");
11
+ const Sequence_1 = require("../Sequence");
12
+ const timeline_position_state_1 = require("../timeline-position-state");
13
+ const use_current_frame_1 = require("../use-current-frame");
14
+ const volume_prop_1 = require("../volume-prop");
15
+ const use_audio_frame_1 = require("./use-audio-frame");
16
+ const AudioForRenderingRefForwardingFunction = (props, ref) => {
17
+ const audioRef = (0, react_1.useRef)(null);
18
+ const absoluteFrame = (0, timeline_position_state_1.useTimelinePosition)();
19
+ const volumePropFrame = (0, use_audio_frame_1.useFrameForVolumeProp)();
20
+ const frame = (0, use_current_frame_1.useCurrentFrame)();
21
+ const sequenceContext = (0, react_1.useContext)(Sequence_1.SequenceContext);
22
+ const { registerAsset, unregisterAsset } = (0, react_1.useContext)(CompositionManager_1.CompositionManager);
23
+ const environment = (0, get_environment_1.useRemotionEnvironment)();
24
+ // Generate a string that's as unique as possible for this asset
25
+ // but at the same time the same on all threads
26
+ const id = (0, react_1.useMemo)(() => {
27
+ var _a;
28
+ return `audio-${(0, random_1.random)((_a = props.src) !== null && _a !== void 0 ? _a : '')}-${sequenceContext === null || sequenceContext === void 0 ? void 0 : sequenceContext.relativeFrom}-${sequenceContext === null || sequenceContext === void 0 ? void 0 : sequenceContext.cumulatedFrom}-${sequenceContext === null || sequenceContext === void 0 ? void 0 : sequenceContext.durationInFrames}`;
29
+ }, [props.src, sequenceContext]);
30
+ const { volume: volumeProp, playbackRate, allowAmplificationDuringRender, onDuration, ...nativeProps } = props;
31
+ const volume = (0, volume_prop_1.evaluateVolume)({
32
+ volume: volumeProp,
33
+ frame: volumePropFrame,
34
+ mediaVolume: 1,
35
+ allowAmplificationDuringRender: allowAmplificationDuringRender !== null && allowAmplificationDuringRender !== void 0 ? allowAmplificationDuringRender : false,
36
+ });
37
+ (0, react_1.useImperativeHandle)(ref, () => {
38
+ return audioRef.current;
39
+ }, []);
40
+ (0, react_1.useEffect)(() => {
41
+ var _a;
42
+ if (!props.src) {
43
+ throw new Error('No src passed');
44
+ }
45
+ if (!window.remotion_audioEnabled) {
46
+ return;
47
+ }
48
+ if (props.muted) {
49
+ return;
50
+ }
51
+ if (volume <= 0) {
52
+ return;
53
+ }
54
+ registerAsset({
55
+ type: 'audio',
56
+ src: (0, absolute_src_1.getAbsoluteSrc)(props.src),
57
+ id,
58
+ frame: absoluteFrame,
59
+ volume,
60
+ mediaFrame: frame,
61
+ playbackRate: (_a = props.playbackRate) !== null && _a !== void 0 ? _a : 1,
62
+ allowAmplificationDuringRender: allowAmplificationDuringRender !== null && allowAmplificationDuringRender !== void 0 ? allowAmplificationDuringRender : false,
63
+ });
64
+ return () => unregisterAsset(id);
65
+ }, [
66
+ props.muted,
67
+ props.src,
68
+ registerAsset,
69
+ absoluteFrame,
70
+ id,
71
+ unregisterAsset,
72
+ volume,
73
+ volumePropFrame,
74
+ frame,
75
+ playbackRate,
76
+ props.playbackRate,
77
+ allowAmplificationDuringRender,
78
+ ]);
79
+ const { src } = props;
80
+ // If audio source switches, make new handle
81
+ if (environment === 'rendering') {
82
+ // eslint-disable-next-line react-hooks/rules-of-hooks
83
+ (0, react_1.useLayoutEffect)(() => {
84
+ if (process.env.NODE_ENV === 'test') {
85
+ return;
86
+ }
87
+ const newHandle = (0, delay_render_1.delayRender)('Loading <Audio> duration with src=' + src);
88
+ const { current } = audioRef;
89
+ const didLoad = () => {
90
+ if (current === null || current === void 0 ? void 0 : current.duration) {
91
+ onDuration(src, current.duration);
92
+ }
93
+ (0, delay_render_1.continueRender)(newHandle);
94
+ };
95
+ if (current === null || current === void 0 ? void 0 : current.duration) {
96
+ onDuration(src, current.duration);
97
+ (0, delay_render_1.continueRender)(newHandle);
98
+ }
99
+ else {
100
+ current === null || current === void 0 ? void 0 : current.addEventListener('loadedmetadata', didLoad, { once: true });
101
+ }
102
+ // If tag gets unmounted, clear pending handles because video metadata is not going to load
103
+ return () => {
104
+ current === null || current === void 0 ? void 0 : current.removeEventListener('loadedmetadata', didLoad);
105
+ (0, delay_render_1.continueRender)(newHandle);
106
+ };
107
+ }, [src, onDuration]);
108
+ }
109
+ return (0, jsx_runtime_1.jsx)("audio", { ref: audioRef, ...nativeProps });
110
+ };
111
+ exports.AudioForRendering = (0, react_1.forwardRef)(AudioForRenderingRefForwardingFunction);