@byomakase/omakase-player
Version:
## Omakase Player - Open source JavaScript framework for building frame accurate video experiences
434 lines (433 loc) • 24.7 kB
TypeScript
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 {};