UNPKG

4.72 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.useMediaInTimeline = void 0;
4const react_1 = require("react");
5const use_audio_frame_1 = require("./audio/use-audio-frame");
6const CompositionManager_1 = require("./CompositionManager");
7const get_asset_file_name_1 = require("./get-asset-file-name");
8const nonce_1 = require("./nonce");
9const play_and_handle_not_allowed_error_1 = require("./play-and-handle-not-allowed-error");
10const sequencing_1 = require("./sequencing");
11const timeline_position_state_1 = require("./timeline-position-state");
12const use_video_config_1 = require("./use-video-config");
13const volume_prop_1 = require("./volume-prop");
14const didWarn = {};
15const warnOnce = (message) => {
16 if (didWarn[message]) {
17 return;
18 }
19 console.warn(message);
20 didWarn[message] = true;
21};
22const useMediaInTimeline = ({ volume, mediaVolume, mediaRef, src, mediaType, }) => {
23 const videoConfig = (0, use_video_config_1.useVideoConfig)();
24 const { rootId, audioAndVideoTags } = (0, react_1.useContext)(timeline_position_state_1.TimelineContext);
25 const parentSequence = (0, react_1.useContext)(sequencing_1.SequenceContext);
26 const actualFrom = parentSequence
27 ? parentSequence.relativeFrom + parentSequence.cumulatedFrom
28 : 0;
29 const [playing] = (0, timeline_position_state_1.usePlayingState)();
30 const startsAt = (0, use_audio_frame_1.useMediaStartsAt)();
31 const { registerSequence, unregisterSequence } = (0, react_1.useContext)(CompositionManager_1.CompositionManager);
32 const [id] = (0, react_1.useState)(() => String(Math.random()));
33 const [initialVolume] = (0, react_1.useState)(() => volume);
34 const nonce = (0, nonce_1.useNonce)();
35 const duration = (() => {
36 return parentSequence
37 ? Math.min(parentSequence.durationInFrames, videoConfig.durationInFrames)
38 : videoConfig.durationInFrames;
39 })();
40 const doesVolumeChange = typeof volume === 'function';
41 const volumes = (0, react_1.useMemo)(() => {
42 if (typeof volume === 'number') {
43 return volume;
44 }
45 return new Array(Math.max(0, duration + startsAt))
46 .fill(true)
47 .map((_, i) => {
48 return (0, volume_prop_1.evaluateVolume)({
49 frame: i + startsAt,
50 volume,
51 mediaVolume,
52 });
53 })
54 .join(',');
55 }, [duration, startsAt, volume, mediaVolume]);
56 (0, react_1.useEffect)(() => {
57 if (typeof volume === 'number' && volume !== initialVolume) {
58 warnOnce(`Remotion: The ${mediaType} with src ${src} has changed it's volume. Prefer the callback syntax for setting volume to get better timeline display: https://www.remotion.dev/docs/using-audio/#controlling-volume`);
59 }
60 }, [initialVolume, mediaType, src, volume]);
61 (0, react_1.useEffect)(() => {
62 var _a;
63 if (!mediaRef.current) {
64 return;
65 }
66 if (!src) {
67 throw new Error('No src passed');
68 }
69 registerSequence({
70 type: mediaType,
71 src,
72 id,
73 duration,
74 from: 0,
75 parent: (_a = parentSequence === null || parentSequence === void 0 ? void 0 : parentSequence.id) !== null && _a !== void 0 ? _a : null,
76 displayName: (0, get_asset_file_name_1.getAssetDisplayName)(src),
77 rootId,
78 volume: volumes,
79 showInTimeline: true,
80 nonce,
81 startMediaFrom: 0 - startsAt,
82 doesVolumeChange,
83 showLoopTimesInTimeline: undefined,
84 });
85 return () => {
86 unregisterSequence(id);
87 };
88 }, [
89 actualFrom,
90 duration,
91 id,
92 parentSequence,
93 src,
94 registerSequence,
95 rootId,
96 unregisterSequence,
97 videoConfig,
98 volumes,
99 doesVolumeChange,
100 nonce,
101 mediaRef,
102 mediaType,
103 startsAt,
104 ]);
105 (0, react_1.useEffect)(() => {
106 const tag = {
107 id,
108 play: () => {
109 if (!playing) {
110 // Don't play if for example in a <Freeze> state.
111 return;
112 }
113 return (0, play_and_handle_not_allowed_error_1.playAndHandleNotAllowedError)(mediaRef, mediaType);
114 },
115 };
116 audioAndVideoTags.current.push(tag);
117 return () => {
118 audioAndVideoTags.current = audioAndVideoTags.current.filter((a) => a.id !== id);
119 };
120 }, [audioAndVideoTags, id, mediaRef, mediaType, playing]);
121};
122exports.useMediaInTimeline = useMediaInTimeline;