1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.useMediaPlayback = void 0;
|
4 | const react_1 = require("react");
|
5 | const use_audio_frame_1 = require("./audio/use-audio-frame");
|
6 | const play_and_handle_not_allowed_error_1 = require("./play-and-handle-not-allowed-error");
|
7 | const timeline_position_state_1 = require("./timeline-position-state");
|
8 | const use_frame_1 = require("./use-frame");
|
9 | const use_video_config_1 = require("./use-video-config");
|
10 | const get_current_time_1 = require("./video/get-current-time");
|
11 | const warn_about_non_seekable_media_1 = require("./warn-about-non-seekable-media");
|
12 | const useMediaPlayback = ({ mediaRef, src, mediaType, playbackRate: localPlaybackRate, }) => {
|
13 | const { playbackRate: globalPlaybackRate } = (0, react_1.useContext)(timeline_position_state_1.TimelineContext);
|
14 | const frame = (0, use_frame_1.useCurrentFrame)();
|
15 | const absoluteFrame = (0, use_frame_1.useAbsoluteCurrentFrame)();
|
16 | const [playing] = (0, timeline_position_state_1.usePlayingState)();
|
17 | const { fps } = (0, use_video_config_1.useVideoConfig)();
|
18 | const mediaStartsAt = (0, use_audio_frame_1.useMediaStartsAt)();
|
19 | const playbackRate = localPlaybackRate * globalPlaybackRate;
|
20 | (0, react_1.useEffect)(() => {
|
21 | var _a;
|
22 | if (!playing) {
|
23 | (_a = mediaRef.current) === null || _a === void 0 ? void 0 : _a.pause();
|
24 | }
|
25 | }, [mediaRef, mediaType, playing]);
|
26 | (0, react_1.useEffect)(() => {
|
27 | const tagName = mediaType === 'audio' ? '<Audio>' : '<Video>';
|
28 | if (!mediaRef.current) {
|
29 | throw new Error(`No ${mediaType} ref found`);
|
30 | }
|
31 | if (!src) {
|
32 | throw new Error(`No 'src' attribute was passed to the ${tagName} element.`);
|
33 | }
|
34 | mediaRef.current.playbackRate = Math.max(0, playbackRate);
|
35 | const shouldBeTime = (0, get_current_time_1.getMediaTime)({
|
36 | fps,
|
37 | frame,
|
38 | src,
|
39 | playbackRate: localPlaybackRate,
|
40 | startFrom: -mediaStartsAt,
|
41 | });
|
42 | const isTime = mediaRef.current.currentTime;
|
43 | const timeShift = Math.abs(shouldBeTime - isTime);
|
44 | if (timeShift > 0.45 && !mediaRef.current.ended) {
|
45 | console.log('Time has shifted by', timeShift, 'sec. Fixing...', `(isTime=${isTime},shouldBeTime=${shouldBeTime})`);
|
46 |
|
47 |
|
48 | mediaRef.current.currentTime = shouldBeTime;
|
49 | (0, warn_about_non_seekable_media_1.warnAboutNonSeekableMedia)(mediaRef.current);
|
50 | }
|
51 | if (!playing || absoluteFrame === 0) {
|
52 | mediaRef.current.currentTime = shouldBeTime;
|
53 | }
|
54 | if (mediaRef.current.paused && !mediaRef.current.ended && playing) {
|
55 | const { current } = mediaRef;
|
56 | current.currentTime = shouldBeTime;
|
57 | (0, play_and_handle_not_allowed_error_1.playAndHandleNotAllowedError)(mediaRef, mediaType);
|
58 | }
|
59 | }, [
|
60 | absoluteFrame,
|
61 | fps,
|
62 | playbackRate,
|
63 | frame,
|
64 | mediaRef,
|
65 | mediaType,
|
66 | playing,
|
67 | src,
|
68 | mediaStartsAt,
|
69 | localPlaybackRate,
|
70 | ]);
|
71 | };
|
72 | exports.useMediaPlayback = useMediaPlayback;
|
73 |
|
\ | No newline at end of file |