import { type TimelineProject } from '../types/timeline.js'; type PlaybackEngineOpts = { getProject: () => TimelineProject; getPlayhead: () => number; setPlayhead: (t: number) => void; getDuration: () => number; getLoopRange: () => { inSec: number; outSec: number; } | null; onEnded: () => void; }; export declare const PRELOAD_LOOKAHEAD = 5; /** * Clock for the DOM-layered preview. While a video clip is active its element * IS the clock (a video is never drift-corrected against itself, so single- * video playback is perfectly smooth); the wall clock (performance.now) is * continuously re-anchored to it and takes over across gaps, images and * audio-only stretches. Secondary elements get loose drift correction with a * cooldown instead of per-frame hard seeks. */ export declare class PlaybackEngine { #private; constructor(opts: PlaybackEngineOpts); register(clipId: string, el: HTMLVideoElement | HTMLAudioElement): void; unregister(clipId: string): void; play(): void; pause(): void; seek(t: number): void; /** Re-apply mute/volume/position to all registered elements (e.g. after a track mute toggle). */ refresh(): void; destroy(): void; syncFrame(t: number, forceSeek: boolean): void; } export {};