import { BehaviorSubject, Observable } from 'rxjs';
import { VideoApi } from '../api';
import { AudioLoadedEvent, AudioPeakProcessorMessageEvent, AudioSwitchedEvent, Destroyable, MainAudioChangeEvent, OmpAudioTrack, OmpNamedEventEventName, SidecarAudioChangeEvent, SidecarAudioCreateEvent, SidecarAudioPeakProcessorMessageEvent, SidecarAudioRemoveEvent, SubtitlesCreateEvent, SubtitlesEvent, SubtitlesLoadedEvent, SubtitlesVttTrack, ThumnbailVttUrlChangedEvent, VideoHelpMenuChangeEvent } from '../types';
import { VideoControllerConfig } from './video-controller';
import { AudioInputOutputNode, AudioMeterStandard, BufferedTimespan, OmpAudioRouterState, OmpMainAudioState, OmpSidecarAudioState, PlaybackState, Video, VideoLoadOptions, VideoLoadOptionsInternal } from './model';
import { OmpAudioRouter } from './audio-router';
import { SidecarAudioApi } from '../api/sidecar-audio-api';
/**
 * @internal
 */
export interface VideoControllerApi extends VideoApi, Destroyable {
    onAudioLoaded$: BehaviorSubject<AudioLoadedEvent | undefined>;
    onAudioSwitched$: Observable<AudioSwitchedEvent>;
    onSubtitlesLoaded$: BehaviorSubject<SubtitlesLoadedEvent | undefined>;
    onPlaybackState$: Observable<PlaybackState>;
    onSubtitlesCreate$: Observable<SubtitlesCreateEvent>;
    onSubtitlesRemove$: Observable<SubtitlesEvent>;
    onSubtitlesShow$: Observable<SubtitlesEvent>;
    onSubtitlesHide$: Observable<SubtitlesEvent>;
    onHelpMenuChange$: Observable<VideoHelpMenuChangeEvent>;
    onThumbnailVttUrlChanged$: Observable<ThumnbailVttUrlChangedEvent>;
    onActiveNamedEventStreamsChange$: Observable<OmpNamedEventEventName[]>;
    loadVideoInternal(sourceUrl: string, frameRate: number | string, options: VideoLoadOptions | undefined, optionsInternal: VideoLoadOptionsInternal): Observable<Video>;
    getConfig(): VideoControllerConfig;
    getPlaybackState(): PlaybackState | undefined;
    getBufferedTimespans(): BufferedTimespan[];
    createSubtitlesVttTrack(subtitlesVttTrack: SubtitlesVttTrack): Observable<SubtitlesVttTrack | undefined>;
    removeSubtitlesTrack(id: string): Observable<void>;
    removeAllSubtitlesTracks(): Observable<void>;
    getSubtitlesTracks(): SubtitlesVttTrack[];
    getActiveSubtitlesTrack(): SubtitlesVttTrack | undefined;
    showSubtitlesTrack(id: string): Observable<void>;
    hideSubtitlesTrack(id: string): Observable<void>;
    getAudioContext(): AudioContext;
    onMainAudioChange$: Observable<MainAudioChangeEvent | undefined>;
    onMainAudioPeakProcessorMessage$: Observable<AudioPeakProcessorMessageEvent>;
    getMainAudioSourceNode(): AudioNode;
    getMainAudioState(): OmpMainAudioState | undefined;
    getMainAudioRouter(): OmpAudioRouter | undefined;
    createMainAudioRouter(inputsNumber: number, outputsNumber?: number): Observable<OmpAudioRouterState>;
    createMainAudioRouterWithOutputsResolver(inputsNumber: number, outputsNumberResolver: (maxChannelCount: number) => number): Observable<OmpAudioRouterState>;
    createMainAudioPeakProcessor(audioMeterStandard?: AudioMeterStandard): Observable<Observable<AudioPeakProcessorMessageEvent>>;
    routeMainAudioRouterNodes(newAudioInputOutputNodes: AudioInputOutputNode[]): Observable<void>;
    onSidecarAudioCreate$: Observable<SidecarAudioCreateEvent>;
    onSidecarAudioRemove$: Observable<SidecarAudioRemoveEvent>;
    onSidecarAudioChange$: Observable<SidecarAudioChangeEvent>;
    onSidecarAudioPeakProcessorMessage$: Observable<SidecarAudioPeakProcessorMessageEvent>;
    getSidecarAudios(): SidecarAudioApi[];
    getSidecarAudio(id: string): SidecarAudioApi | undefined;
    getSidecarAudioStates(): OmpSidecarAudioState[];
    createSidecarAudioTrack(track: Partial<OmpAudioTrack>): Observable<OmpAudioTrack>;
    createSidecarAudioTracks(tracks: Partial<OmpAudioTrack>[]): Observable<OmpAudioTrack[]>;
    removeSidecarAudioTracks(ids: string[]): Observable<void>;
    removeAllSidecarAudioTracks(): Observable<void>;
    getSidecarAudioTracks(): OmpAudioTrack[];
    getActiveSidecarAudioTracks(): OmpAudioTrack[];
    activateSidecarAudioTracks(ids: string[], deactivateOthers: boolean | undefined): Observable<void>;
    deactivateSidecarAudioTracks(ids: string[]): Observable<void>;
    createSidecarAudioRouter(sidecarAudioTrackId: string, inputsNumber?: number, outputsNumber?: number): Observable<OmpAudioRouterState>;
    routeSidecarAudioRouterNodes(sidecarAudioTrackId: string, newAudioInputOutputNodes: AudioInputOutputNode[]): Observable<void>;
    createSidecarAudioPeakProcessor(sidecarAudioTrackId: string, audioMeterStandard?: AudioMeterStandard): Observable<Observable<AudioPeakProcessorMessageEvent>>;
    exportMainAudioTrackToSidecar(mainAudioTrackId: string): Observable<OmpAudioTrack>;
    exportMainAudioTracksToSidecar(mainAudioTrackIds: string[]): Observable<OmpAudioTrack[]>;
    getThumbnailVttUrl(): string | undefined;
    loadThumbnailVttUrl(thumbnailVttUrl: string): Observable<void>;
    isPiPSupported(): boolean;
}
