UNPKG

@byomakase/omakase-player

Version:

## Omakase Player - Open source JavaScript framework for building frame accurate video experiences

434 lines (433 loc) • 24.7 kB
import Decimal from 'decimal.js'; import { AudioLoadedEvent, AudioPeakProcessorMessageEvent, AudioSwitchedEvent, AudioUpdatedEvent, HelpMenuGroup, MainAudioChangeEvent, MainAudioInputSoloMuteEvent, OmpAudioTrack, OmpAudioTrackCreateType, OmpNamedEvent, OmpNamedEventEventName, SidecarAudioChangeEvent, SidecarAudioCreateEvent, SidecarAudioInputSoloMuteEvent, SidecarAudioPeakProcessorMessageEvent, SidecarAudioRemoveEvent, SidecarAudiosChangeEvent, SidecarAudioVideoCurrentTimeBufferingEvent, SidecarAudioVolumeChangeEvent, SubtitlesCreateEvent, SubtitlesEvent, SubtitlesLoadedEvent, SubtitlesVttTrack, SyncTickEvent, ThumnbailVttUrlChangedEvent, VideoBufferingEvent, VideoDurationEvent, VideoEndedEvent, VideoErrorEvent, VideoFullscreenChangeEvent, VideoHelpMenuChangeEvent, VideoLoadedEvent, VideoLoadingEvent, VideoPlaybackRateEvent, VideoPlayEvent, VideoSafeZoneChangeEvent, VideoSeekedEvent, VideoSeekingEvent, VideoTimeChangeEvent, VideoWindowPlaybackStateChangeEvent, VolumeChangeEvent } from '../types'; import { BehaviorSubject, Observable, Subject } from 'rxjs'; import Hls from 'hls.js'; import { VideoControllerApi } from './video-controller-api'; import { AudioEffectBundle, AudioMeterStandard, BufferedTimespan, VideoKeyframe, VideoKeyframeOptions, MediaElementPlaybackState, OmpAudioRouterState, OmpAudioRoutingConnection, OmpAudioRoutingInputType, OmpMainAudioInputSoloMuteState, OmpMainAudioState, OmpSidecarAudioInputSoloMuteState, OmpSidecarAudioState, Video, VideoLoadOptions, VideoLoadOptionsInternal, VideoProtocol, VideoSafeZone, VideoWindowPlaybackState } from './model'; import { VideoDomControllerApi } from './video-dom-controller-api'; import { VideoLoader } from './video-loader'; import { OmpHlsConfig } from './video-hls-loader'; import { OmpAudioRouter } from './audio-router'; import { OmpAudioPeakProcessor } from './audio-peak-processor'; import { OmpAudioEffectFactory, OmpAudioEffectFilter, OmpAudioEffectParam, OmpAudioEffectsGraph, OmpAudioEffectsGraphDef } from '../audio'; import { MediaElementPlayback } from './media-element-playback'; import { SidecarAudioApi } from '../api/sidecar-audio-api'; import { OmpAudioEffectsGraphConnection, OmpAudioEffectsSlot } from '../audio/model'; export interface VideoControllerConfig { frameDurationSpillOverCorrection: number; audioPlayMode: 'multiple' | 'single'; hlsConfig: Partial<OmpHlsConfig>; } export declare const VIDEO_CONTROLLER_CONFIG_DEFAULT: VideoControllerConfig; interface VideoFrameCallbackData { now: DOMHighResTimeStamp; metadata: VideoFrameCallbackMetadata; } export type SeekDirection = 'bw' | 'fw' | 'o'; export declare class VideoController implements VideoControllerApi { static readonly videoVolumeDefault: number; static readonly videoPlaybackRateDefault: number; static readonly videoMutedDefault: boolean; readonly onSyncTick$: Subject<SyncTickEvent>; readonly onVideoLoaded$: BehaviorSubject<VideoLoadedEvent | undefined>; readonly onVideoLoading$: Subject<VideoLoadingEvent>; readonly onAudioLoaded$: BehaviorSubject<AudioLoadedEvent | undefined>; readonly onAudioSwitched$: Subject<AudioSwitchedEvent>; readonly onAudioUpdated$: Subject<AudioUpdatedEvent>; readonly onSubtitlesLoaded$: BehaviorSubject<SubtitlesLoadedEvent | undefined>; readonly onSubtitlesCreate$: Subject<SubtitlesCreateEvent>; readonly onSubtitlesRemove$: Subject<SubtitlesEvent>; readonly onSubtitlesShow$: Subject<SubtitlesEvent>; readonly onSubtitlesHide$: Subject<SubtitlesEvent>; readonly onPlay$: Subject<VideoPlayEvent>; readonly onPause$: Subject<VideoPlayEvent>; readonly onVideoTimeChange$: Subject<VideoTimeChangeEvent>; readonly onSeeking$: Subject<VideoSeekingEvent>; readonly onSeeked$: Subject<VideoSeekedEvent>; readonly onBuffering$: Subject<VideoBufferingEvent>; readonly onEnded$: Subject<VideoEndedEvent>; readonly onVideoError$: Subject<VideoErrorEvent>; readonly onVolumeChange$: Subject<VolumeChangeEvent>; readonly onFullscreenChange$: Subject<VideoFullscreenChangeEvent>; readonly onVideoSafeZoneChange$: Subject<VideoSafeZoneChangeEvent>; readonly onVideoWindowPlaybackStateChange$: Subject<VideoWindowPlaybackStateChangeEvent>; readonly onHelpMenuChange$: Subject<VideoHelpMenuChangeEvent>; readonly onPlaybackState$: Subject<MediaElementPlaybackState>; readonly onPlaybackRateChange$: Subject<VideoPlaybackRateEvent>; readonly onDurationChange$: Subject<VideoDurationEvent>; readonly onThumbnailVttUrlChanged$: Subject<ThumnbailVttUrlChangedEvent>; readonly onMainAudioChange$: BehaviorSubject<MainAudioChangeEvent | undefined>; readonly onMainAudioPeakProcessorMessage$: Subject<AudioPeakProcessorMessageEvent>; readonly onMainAudioInputSoloMute$: BehaviorSubject<MainAudioInputSoloMuteEvent | undefined>; readonly onSidecarAudioCreate$: Subject<SidecarAudioCreateEvent>; readonly onSidecarAudioLoaded$: Subject<SidecarAudioCreateEvent>; readonly onSidecarAudioRemove$: Subject<SidecarAudioRemoveEvent>; readonly onSidecarAudioChange$: Subject<SidecarAudioChangeEvent>; readonly onSidecarAudioVolumeChange$: Subject<SidecarAudioVolumeChangeEvent>; readonly onSidecarAudioPeakProcessorMessage$: Subject<SidecarAudioPeakProcessorMessageEvent>; readonly onSidecarAudioInputSoloMute$: Subject<SidecarAudioInputSoloMuteEvent>; readonly onSidecarAudiosChange$: Subject<SidecarAudiosChangeEvent>; readonly onSidecarAudioVideoCurrentTimeBuffering$: Subject<SidecarAudioVideoCurrentTimeBufferingEvent>; readonly onAudioOutputVolumeChange$: Subject<VolumeChangeEvent>; readonly onActiveNamedEventStreamsChange$: Subject<OmpNamedEventEventName[]>; readonly onNamedEvent$: Subject<OmpNamedEvent>; protected readonly _config: VideoControllerConfig; protected readonly _videoDomController: VideoDomControllerApi; /** * Stream of data provided by videoElement.requestVideoFrameCallback() * @protected */ protected readonly _videoFrameCallback$: Subject<VideoFrameCallbackData | undefined>; protected _videoLoader?: VideoLoader; protected _video?: Video; protected _videoLoadOptions?: VideoLoadOptions; protected _mediaElementPlayback?: MediaElementPlayback; protected _syncFrameNudgeTime: number; protected _syncFineFrameTolerancePercent: number; protected _syncLoopMaxIterations: number; protected _videoFrameCallbackHandle?: number; protected _videoStalledCheckIntervalMs: number; protected _videoStalledCheckLastCurrentTime?: number; protected _videoPausedSeekBufferingThresholdMs: number; protected _activeNamedEventStreams: OmpNamedEventEventName[]; protected _subtitlesTracks: Map<string, SubtitlesVttTrack>; protected _activeSubtitlesTrack?: SubtitlesVttTrack; protected _audioTracks: Map<string, OmpAudioTrack>; /** * Created in constructor * @protected */ protected _audioContext: AudioContext; protected _audioOutputNode: GainNode; protected _audioOutputMuted: boolean; protected _audioOutputVolume: number; protected _mediaElementAudioSourceNode?: MediaElementAudioSourceNode; /** * Created in constructor * @protected */ protected _mainAudioNode?: AudioNode; protected _mainAudioRouter?: OmpAudioRouter; protected _mainAudioPeakProcessor?: OmpAudioPeakProcessor; /** * Tracks main audio active state depending on {@link VideoControllerConfig.audioPlayMode}. If value is false, main audio is muted * @protected */ protected _mainAudioActive: boolean; protected _sidecarAudios: Map<string, SidecarAudioApi>; /** * Audio node where all sidecar audios merge * @protected */ protected _sidecarAudiosOutputNode: GainNode; /** * Contains sidecar audio id's for sidecar audios that are buffering video current time (and are not ready for playback) * @protected */ protected _sidecarAudiosVideoCurrentTimeBuffering: Set<string>; /** * Stores last video playback state {@link _mediaElementPlayback} before {@link _mediaElementPlayback.waitingSyncedMedia} changes to true * Used for restoring playback after {@link _mediaElementPlayback.waitingSyncedMedia} changes to false * @protected */ protected _waitingSyncedMediaLastPlaybackState: MediaElementPlaybackState | undefined; /** * Time synchronization worklet * @protected */ protected _syncWorklet?: AudioWorkletNode; protected _syncWorkletSource?: MediaElementAudioSourceNode; protected _blackMp4Url: string; protected _lastMainVolumeChangeEvent?: VolumeChangeEvent; /** * Volume tracking for Safari * @protected */ protected _lastProvidedMainVolumeHlsLoaderSafari?: number; /** * Mute tracking for Safari * @protected */ protected _lastProvidedMainMutedHlsLoaderSafari?: boolean; protected _thumbnailVttUrl?: string; protected _helpMenuGroups: HelpMenuGroup[]; /** * Source slot audio effects */ protected _sourceSlot: OmpAudioEffectsSlot; protected _sourceSlotEffectsGraph?: OmpAudioEffectsGraph; protected _isSourceSlotEffectAttaching: boolean; protected _destinationSlot: OmpAudioEffectsSlot; protected _destinationSlotEffectsGraph?: OmpAudioEffectsGraph; protected _isDestinationSlotEffectAttaching: boolean; /** * Circut breaker for all loaded video events * @protected */ protected _videoEventBreaker$: Subject<void>; /** * Cancels previous unfinished seek operation if ie. new seek is requested * @protected */ protected _seekBreaker$: Subject<void>; /** * Cancels previous unfinished pause operation * @protected */ protected _pausingBreaker$: Subject<void>; /** * Cancels monitoring for AudioContext.resume() * @protected */ protected _audioContextResumeBreaker$: Subject<void>; /** * Cancels unfinished keyframe extraction if a new one was triggered * @protected */ protected _extractVideoKeyframeBreaker$: Subject<unknown>; protected _destroyed$: Subject<void>; constructor(config: Partial<VideoControllerConfig>, videoDomController: VideoDomControllerApi); private isVideoHlsLoaderInSafari; /** * For DRM'd videos Firefox doesn't allow tampering with audio source before setting up keys inside <video> element * That's why we are creating main audio after applying DRM keyes * * @protected */ protected isMainAudioCreationDelayed(): boolean; loadVideoInternal(sourceUrl: string, options: VideoLoadOptions | undefined, optionsInternal?: VideoLoadOptionsInternal): Observable<Video>; protected createSyncWorklet(): Observable<void>; protected resolveAndAttachVideoLoader(sourceUrl: string, videoProtocol: VideoProtocol | undefined): VideoLoader; loadVideo(sourceUrl: string, options?: VideoLoadOptions): Observable<Video>; reloadVideo(): Observable<Video>; get videoElement(): HTMLVideoElement; protected createVideoPlayEvent(): VideoPlayEvent; protected createAudioElement(options?: { loop?: boolean; }): Observable<HTMLAudioElement>; protected initEventHandlers(): void; getBufferedTimespans(): BufferedTimespan[]; protected startTimeSynchronizationCallback(): void; protected stopSynchronizationCallbacks(): void; protected startSWSynchronization(): void; protected stopSWSynchronization(): void; protected startRVFCSynchronization(): void; protected stopRVFCSynchronization(): void; private syncVideoFrames; private constrainSeekTime; private constrainSeekFrame; private seekTimeAndSync; private seekTimeWithoutSync; private _seekTimeFireAndForget; /** * * @param timeOffset Time offset in seconds * @param syncConditions */ private seekFromCurrentTimeAndSync; private setCurrentTime; private getMostAccurateDuration; private _seekToFrame; /** * Three consecutive seeks are executed: * 1. Seeks to most accurate video duration. After first seek and video.seeked event, video element should trigger video.ondurationchange and we'll have that value available in video.correctedDuration * 2. Seeks to a time just before last frame ends * 3. Seeks to most accurate video duration which aligns video.currentTime with video.duration * * @private */ private _seekToEnd; /** * * @param framesCount Positive or negative number of frames. If positive - seek forward, if negative - seek backward. */ private _seekFromCurrentFrame; dispatchVideoTimeChange(): void; private validateVideoLoaded; getPlaybackState(): MediaElementPlaybackState | undefined; getVideo(): Video | undefined; getVideoLoadOptions(): VideoLoadOptions | undefined; getHTMLVideoElement(): HTMLVideoElement; calculateTimeToFrame(time: number): number; calculateFrameToTime(frameNumber: number): number; /** * Enables preventing video from returning to stored playback state, if user manually initiated action after waitingSyncedMedia was set * @protected */ protected resetWaitingSyncedMediaLastPlaybackState(): void; play(): Observable<void>; protected _play(): Observable<void>; pause(): Observable<void>; protected _pause(): Observable<void>; private _checkAndCancelPausing; togglePlayPause(): Observable<void>; isPlaying(): boolean; isPaused(): boolean; isSeeking(): boolean; getCurrentTime(): number; getCurrentTimecode(): string; getPlaybackRate(): number; setPlaybackRate(playbackRate: number): Observable<void>; getVolume(): number; setVolume(volume: number): Observable<void>; protected getVideoElementVolume(): number; protected getVideoElementMuted(): boolean; protected _setVolume(volume: number): Observable<void>; private dispatchOnVolumeChange; /** * return Video duration in seconds */ getDuration(): number; getFrameRate(): number; getTotalFrames(): number; getCurrentFrame(): number; seekToFrame(frame: number): Observable<boolean>; seekFromCurrentFrame(framesCount: number): Observable<boolean>; seekFromCurrentTime(timeAmount: number): Observable<boolean>; seekPreviousFrame(): Observable<boolean>; seekNextFrame(): Observable<boolean>; seekToTime(time: number): Observable<boolean>; seekToTimecode(timecode: string): Observable<boolean>; seekToPercent(percent: number): Observable<boolean>; seekToEnd(): Observable<boolean>; formatToTimecode(time: number): string; formatToTimecodeDecimal(time: Decimal): string; parseTimecodeToFrame(timecode: string): number; parseTimecodeToTime(timecode: string): number; parseTimecodeToTimeDecimal(timecode: string): Decimal; mute(): Observable<void>; unmute(): Observable<void>; protected _setMuted(muted: boolean): void; isMuted(): boolean; toggleMuteUnmute(): Observable<void>; isFullscreen(): boolean; toggleFullscreen(): Observable<void>; protected setAudioTracks(audioTracks: OmpAudioTrack[]): Observable<void>; getActiveAudioTrack(): OmpAudioTrack | undefined; getAudioTracks(): OmpAudioTrack[]; setActiveAudioTrack(id: string): Observable<void>; updateAudioTrack(newAudioTrack: OmpAudioTrack): Observable<void>; activateMainAudio(): Observable<void>; deactivateMainAudio(): Observable<void>; protected _setMainAudioActive(active: boolean): void; protected updateActiveAudioTrack(id: string): void; isVideoLoaded(): boolean; appendHelpMenuGroup(helpMenuGroup: HelpMenuGroup): Observable<void>; prependHelpMenuGroup(helpMenuGroup: HelpMenuGroup): Observable<void>; clearHelpMenuGroups(): Observable<void>; getHelpMenuGroups(): HelpMenuGroup[]; addSafeZone(videoSafeZone: VideoSafeZone): Observable<VideoSafeZone>; removeSafeZone(id: string): Observable<void>; clearSafeZones(): Observable<void>; getSafeZones(): VideoSafeZone[]; isDetachable(): boolean; canDetach(): boolean; canAttach(): boolean; getVideoWindowPlaybackState(): VideoWindowPlaybackState; detachVideoWindow(): Observable<void>; attachVideoWindow(): Observable<void>; isPiPSupported(): boolean; enablePiP(): Observable<void>; disablePiP(): Observable<void>; protected setSubtitlesTracks(subtitlesVttTracks: SubtitlesVttTrack[]): Observable<void>; createSubtitlesVttTrack(subtitlesVttTrack: SubtitlesVttTrack): Observable<SubtitlesVttTrack>; protected _createSubtitlesVttTrack(subtitlesVttTrack: SubtitlesVttTrack): Observable<SubtitlesVttTrack | undefined>; getSubtitlesTracks(): SubtitlesVttTrack[]; removeAllSubtitlesTracks(): Observable<void>; protected _removeAllSubtitlesTracks(emitEvent?: boolean): void; removeSubtitlesTrack(id: string): Observable<void>; protected _removeSubtitlesTrack(id: string, emitEvent?: boolean): void; getActiveSubtitlesTrack(): SubtitlesVttTrack | undefined; showSubtitlesTrack(id: string): Observable<void>; hideSubtitlesTrack(id: string): Observable<void>; private createSubtitlesEvent; protected createAudioContext(contextOptions?: AudioContextOptions): AudioContext; protected createMainAudio(): void; getAudioContext(): AudioContext; getAudioOutputNode(): AudioNode; getSidecarAudiosOutputNode(): AudioNode; getAudioOutputVolume(): number; isAudioOutputMuted(): boolean; setAudioOutputMuted(muted: boolean): Observable<void>; toggleAudioOutputMuteUnmute(): Observable<void>; setAudioOutputVolume(volume: number): Observable<void>; muteAudioOutput(): Observable<void>; unmuteAudioOutput(): Observable<void>; protected updateAudioOutputVolume(volume: number, muted: boolean): void; getMainAudioNode(): AudioNode | undefined; getMainAudioState(): OmpMainAudioState | undefined; getMainAudioRouter(): OmpAudioRouter | undefined; getMainAudioInputSoloMuteState(): OmpMainAudioInputSoloMuteState | undefined; getMainAudioRouterInitialRoutingConnections(): OmpAudioRoutingConnection[] | undefined; setMainAudioRouterInitialRoutingConnections(connections: OmpAudioRoutingConnection[]): Observable<void>; createMainAudioRouter(inputsNumber: number, outputsNumber?: number): Observable<OmpAudioRouterState>; createMainAudioRouterWithOutputsResolver(inputsNumber: number, outputsNumberResolver: (maxChannelCount: number) => number): Observable<OmpAudioRouterState>; protected _emitMainAudioChange(): void; protected _emitSoloMute(): void; createMainAudioPeakProcessor(audioMeterStandard?: AudioMeterStandard): Observable<Observable<AudioPeakProcessorMessageEvent>>; updateMainAudioRouterConnections(connections: OmpAudioRoutingConnection[]): Observable<void>; setMainAudioEffectsGraphs(effectsGraphDef: OmpAudioEffectsGraphDef, effectsGraphConnection: OmpAudioEffectsGraphConnection): Observable<void>; _setMainAudioInterleavedEffectsGraph(effectsGraphDef: OmpAudioEffectsGraphDef, effectsGraphConnection: OmpAudioEffectsGraphConnection): Observable<void>; protected _createEffectsSlots(): void; removeMainAudioEffectsGraphs(effectsGraphConnection: OmpAudioEffectsGraphConnection): Observable<void>; protected _removeMainAudioInterleavedEffectsGraph(effectGraphConnection: OmpAudioEffectsGraphConnection): void; setMainAudioEffectsParams(param: OmpAudioEffectParam, effectGraphConnection: OmpAudioEffectsGraphConnection, filter?: OmpAudioEffectFilter): Observable<void>; protected _setMainAudioEffectsParams(param: OmpAudioEffectParam, effectGraphConnection: OmpAudioEffectsGraphConnection, filter?: OmpAudioEffectFilter): void; protected getInterleavedAudioEffects(): AudioEffectBundle[]; toggleMainAudioRouterSolo(routingPath: OmpAudioRoutingInputType): Observable<void>; toggleMainAudioRouterMute(routingPath: OmpAudioRoutingInputType): Observable<void>; protected _createAudioRouter(inputsNumber: number, outputsNumber?: number): Observable<OmpAudioRouter>; protected _createAudioRouterWithOutputsResolver(inputsNumber: number, outputsNumberResolver: (maxChannelCount: number) => number): Observable<OmpAudioRouter>; protected destroyAudioContext(): void; getThumbnailVttUrl(): string | undefined; loadThumbnailVttUrl(thumbnailVttUrl: string): Observable<void>; getConfig(): VideoControllerConfig; getHls(): Hls | undefined; updateActiveNamedEventStreams(eventNames: OmpNamedEventEventName[]): Observable<void>; getActiveNamedEventStreams(): OmpNamedEventEventName[]; loadBlackVideo(): Observable<Video>; extractVideoKeyframe(options?: VideoKeyframeOptions): Observable<VideoKeyframe>; protected _extractVideoKeyframe(options?: VideoKeyframeOptions): Observable<VideoKeyframe>; getSidecarAudios(): SidecarAudioApi[]; getSidecarAudio(id: string): SidecarAudioApi | undefined; getSidecarAudioState(id: string): OmpSidecarAudioState | undefined; getSidecarAudioStates(): OmpSidecarAudioState[]; getSidecarAudioInputSoloMuteState(id: string): OmpSidecarAudioInputSoloMuteState | undefined; getSidecarAudioInputSoloMuteStates(): OmpSidecarAudioInputSoloMuteState[]; getSidecarAudioRouterInitialRoutingConnections(id: string): OmpAudioRoutingConnection[] | undefined; setSidecarAudioRouterInitialRoutingConnections(id: string, connections: OmpAudioRoutingConnection[]): Observable<void>; createSidecarAudioTrack(track: OmpAudioTrackCreateType): Observable<OmpAudioTrack>; protected _createSidecarAudioTrack(track: OmpAudioTrackCreateType): Observable<OmpAudioTrack>; createSidecarAudioTracks(tracks: OmpAudioTrackCreateType[]): Observable<OmpAudioTrack[]>; protected _createSidecarAudio(track: OmpAudioTrackCreateType): Observable<SidecarAudioApi>; protected _createSidecarAudios(tracks: OmpAudioTrackCreateType[]): Observable<SidecarAudioApi[]>; removeSidecarAudioTracks(ids: string[]): Observable<void>; removeAllSidecarAudioTracks(): Observable<void>; protected _removeSidecarAudios(ids: string[]): void; protected _removeAllSidecarAudioTracks(): void; protected _removeSidecarAudio(id: string): void; getSidecarAudioTracks(): OmpAudioTrack[]; getActiveSidecarAudioTracks(): OmpAudioTrack[]; activateSidecarAudioTracks(ids: string[] | undefined, deactivateOthers?: boolean | undefined): Observable<void>; deactivateSidecarAudioTracks(ids?: string[]): Observable<void>; setSidecarVolume(volume: number, ids: string[] | undefined): Observable<void>; setSidecarMuted(muted: boolean, ids: string[] | undefined): Observable<void>; muteSidecar(ids: string[] | undefined): Observable<void>; unmuteSidecar(ids: string[] | undefined): Observable<void>; createSidecarAudioRouter(sidecarAudioTrackId: string, inputsNumber?: number, outputsNumber?: number): Observable<OmpAudioRouterState>; updateSidecarAudioRouterConnections(sidecarAudioTrackId: string, connections: OmpAudioRoutingConnection[]): Observable<void>; setSidecarAudioEffectsGraph(sidecarAudioTrackId: string, effectsGraphDef: OmpAudioEffectsGraphDef, effectsGraphConnection: OmpAudioEffectsGraphConnection): Observable<void>; removeSidecarAudioEffectsGraphs(sidecarAudioTrackId: string, effectsGraphConnection: OmpAudioEffectsGraphConnection): Observable<void>; setSidecarAudioEffectsParams(sidecarAudioTrackId: string, param: OmpAudioEffectParam, effectGraphConnection: OmpAudioEffectsGraphConnection, filter?: OmpAudioEffectFilter): Observable<void>; createSidecarAudioPeakProcessor(sidecarAudioTrackId: string, audioMeterStandard?: AudioMeterStandard): Observable<Observable<AudioPeakProcessorMessageEvent>>; protected _activateSidecarAudioTracks(ids: string[]): void; protected _deactivateSidecarAudioTracks(ids: string[]): void; exportMainAudioTracksToSidecar(mainAudioTrackIds: string[]): Observable<OmpAudioTrack[]>; exportMainAudioTrackToSidecar(mainAudioTrackId: string): Observable<OmpAudioTrack>; _exportMainAudioTrackToSidecar(mainAudioTrackId: string): Observable<OmpAudioTrack>; toggleSidecarAudioRouterSolo(sidecarAudioTrackId: string, routingPath: OmpAudioRoutingInputType): Observable<void>; toggleSidecarAudioRouterMute(sidecarAudioTrackId: string, routingPath: OmpAudioRoutingInputType): Observable<void>; registerAudioEffect(effectType: string, effectFactory: OmpAudioEffectFactory): void; destroy(): void; } export {};