import type { RefObject } from 'react'; import type ReactPlayer from 'react-player'; import { useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react'; import { AudioPlayer, PlayerOnProgressProps } from '/@/renderer/features/player/audio-player/types'; import { convertToLogVolume } from '/@/renderer/features/player/audio-player/utils/player-utils'; import { LogCategory, logFn } from '/@/renderer/utils/logger'; import { logMsg } from '/@/renderer/utils/logger-message'; import { PlayerStatus } from '/@/shared/types/types'; export interface WebPlayerEngineHandle extends AudioPlayer { player1(): { ref: null | ReactPlayer; setVolume: (volume: number) => void; }; player2(): { ref: null | ReactPlayer; setVolume: (volume: number) => void; }; } interface WebPlayerEngineProps { isMuted: boolean; isTransitioning: boolean; loopPlayer1: boolean; loopPlayer2: boolean; onEndedPlayer1: () => void; onEndedPlayer2: () => void; onErrorPause: () => void; onProgressPlayer1: (e: PlayerOnProgressProps) => void; onProgressPlayer2: (e: PlayerOnProgressProps) => void; onStartedPlayer1: (player: ReactPlayer) => void; onStartedPlayer2: (player: ReactPlayer) => void; playerNum: number; playerRef: RefObject; playerStatus: PlayerStatus; preservesPitch: boolean; speed?: number; src1: string | undefined; src2: string | undefined; volume: number; } const MAX_NETWORK_RETRIES = 5; const NETWORK_RETRY_DELAY_MS = 2000; // Credits: https://gist.github.com/novwhisky/8a1a0168b94f3b6abfaa?permalink_comment_id=1551393#gistcomment-1551393 // This is used so that the player will always have an