import { Api } from './api';
import { Observable } from 'rxjs';
import { AudioLoadedEvent, AudioPeakProcessorMessageEvent, AudioSwitchedEvent, MainAudioChangeEvent, OmpAudioTrack, SidecarAudioChangeEvent, SidecarAudioCreateEvent, SidecarAudioPeakProcessorMessageEvent, SidecarAudioRemoveEvent } from '../types';
import { AudioInputOutputNode, AudioMeterStandard, OmpAudioRouterState, OmpMainAudioState } from '../video/model';
import { OmpAudioRouter } from '../video/audio-router';
import { SidecarAudioApi } from './sidecar-audio-api';
export interface AudioApi extends Api {
    /**
     * Fires on audio load. Initial value is undefined.
     * Always emits the current value on subscription.
     *
     * @readonly
     */
    onAudioLoaded$: Observable<AudioLoadedEvent | undefined>;
    /**
     *  Fires on audio track switched
     *  @readonly
     */
    onAudioSwitched$: Observable<AudioSwitchedEvent>;
    /**
     * @returns available audio tracks
     */
    getAudioTracks(): OmpAudioTrack[];
    /**
     * @returns current active audio track
     */
    getActiveAudioTrack(): OmpAudioTrack | undefined;
    /**
     * Sets active audio track
     * @param id {@link OmpAudioTrack} id
     */
    setActiveAudioTrack(id: string): Observable<void>;
    /**
     * @returns {@link AudioContext}
     */
    getAudioContext(): AudioContext;
    /**
     * Fires when Main audio topology changes. For example, audio router is created.
     * @readonly
     */
    onMainAudioChange$: Observable<MainAudioChangeEvent | undefined>;
    /**
     * Fires on Main audio peak processor message
     * @readonly
     */
    onMainAudioPeakProcessorMessage$: Observable<AudioPeakProcessorMessageEvent>;
    /**
     * @returns Main {@link AudioNode}
     */
    getMainAudioSourceNode(): AudioNode;
    /**
     * @returns Main audio state
     */
    getMainAudioState(): OmpMainAudioState | undefined;
    /**
     * @returns Main audio router
     */
    getMainAudioRouter(): OmpAudioRouter | undefined;
    /**
     * Creates Main audio router
     *
     * @param inputsNumber Number of inputs
     * @param outputsNumber Number of outputs
     */
    createMainAudioRouter(inputsNumber: number, outputsNumber?: number): Observable<OmpAudioRouterState>;
    /**
     * Creates Main audio router
     *
     * @param inputsNumber Number of inputs
     * @param outputsNumberResolver Function for resolving number of router outputs. Provides {@link outputsNumberResolver.maxChannelCount} as function input
     */
    createMainAudioRouterWithOutputsResolver(inputsNumber: number, outputsNumberResolver: (maxChannelCount: number) => number): Observable<OmpAudioRouterState>;
    /**
     * Creates Main audio peak processor
     *
     * @param audioMeterStandard default "peak-sample"
     * @returns observable with stream of {@link AudioPeakProcessorMessageEvent} events
     */
    createMainAudioPeakProcessor(audioMeterStandard?: AudioMeterStandard): Observable<Observable<AudioPeakProcessorMessageEvent>>;
    /**
     * Routes provided Main audio  {@link AudioInputOutputNode} nodes
     *
     * @param newAudioInputOutputNodes
     */
    routeMainAudioRouterNodes(newAudioInputOutputNodes: AudioInputOutputNode[]): Observable<void>;
    /**
     * Fires when Sidecar audio is created
     * @readonly
     */
    onSidecarAudioCreate$: Observable<SidecarAudioCreateEvent>;
    /**
     * Fires when Sidecar audio is removed
     * @readonly
     */
    onSidecarAudioRemove$: Observable<SidecarAudioRemoveEvent>;
    /**
     * Fires when Sidecar audio topology changes. For example, audio router is created.
     * @readonly
     */
    onSidecarAudioChange$: Observable<SidecarAudioChangeEvent>;
    /**
     * Fires on Sidecar audio peak processor message
     * @readonly
     */
    onSidecarAudioPeakProcessorMessage$: Observable<SidecarAudioPeakProcessorMessageEvent>;
    /**
     * @returns Sidecar audios
     */
    getSidecarAudios(): SidecarAudioApi[];
    /**
     * @returns Sidecar audio
     * @param id Sidecar audio {@link OmpAudioTrack.id}
     */
    getSidecarAudio(id: string): SidecarAudioApi | undefined;
    /**
     * Creates new Sidecar audio track
     * @param track
     */
    createSidecarAudioTrack(track: Partial<OmpAudioTrack>): Observable<OmpAudioTrack>;
    /**
     * Creates multiple Sidecar audio tracks
     * @param tracks
     */
    createSidecarAudioTracks(tracks: Partial<OmpAudioTrack>[]): Observable<OmpAudioTrack[]>;
    /**
     * Removes Sidecar audio tracks
     * @param ids Sidecar audio {@link OmpAudioTrack}.id array
     */
    removeSidecarAudioTracks(ids: string[]): Observable<void>;
    /**
     * @returns Sidecar audio tracks
     */
    getSidecarAudioTracks(): OmpAudioTrack[];
    /**
     * @returns active Sidecar audio tracks
     */
    getActiveSidecarAudioTracks(): OmpAudioTrack[];
    /**
     * Activates Sidecar audio tracks
     * @param ids Sidecar audio {@link OmpAudioTrack.id} array to activate
     * @param deactivateOthers Set to true if other sidecar audios should be deactivated
     */
    activateSidecarAudioTracks(ids: string[], deactivateOthers: boolean | undefined): Observable<void>;
    /**
     * Deactivates Sidecar audio tracks
     * @param ids Sidecar audio {@link OmpAudioTrack.id} array to activate
     */
    deactivateSidecarAudioTracks(ids: string[]): Observable<void>;
    /**
     * Removes all Sidecar audio tracks
     */
    removeAllSidecarAudioTracks(): Observable<void>;
    /**
     * Creates Sidecar audio router
     *
     * @param sidecarAudioTrackId id Sidecar audio {@link OmpAudioTrack.id}
     * @param inputsNumber
     * @param outputsNumber
     */
    createSidecarAudioRouter(sidecarAudioTrackId: string, inputsNumber?: number, outputsNumber?: number): Observable<OmpAudioRouterState>;
    /**
     * Routes provided Sidecar audio {@link AudioInputOutputNode} nodes
     * @param sidecarAudioTrackId id Sidecar audio {@link OmpAudioTrack.id}
     * @param newAudioInputOutputNodes
     */
    routeSidecarAudioRouterNodes(sidecarAudioTrackId: string, newAudioInputOutputNodes: AudioInputOutputNode[]): Observable<void>;
    /**
     * Creates Sidecar audio peak processor
     *
     * @param sidecarAudioTrackId id Sidecar audio {@link OmpAudioTrack.id}
     * @param audioMeterStandard
     * @returns observable with stream of {@link AudioPeakProcessorMessageEvent} events
     */
    createSidecarAudioPeakProcessor(sidecarAudioTrackId: string, audioMeterStandard?: AudioMeterStandard): Observable<Observable<AudioPeakProcessorMessageEvent>>;
    /**
     * Exports Main audio track as Sidecar audio track
     *
     * @param mainAudioTrackId Main audio track id
     */
    exportMainAudioTrackToSidecar(mainAudioTrackId: string): Observable<OmpAudioTrack>;
    /**
     * Exports Main audio tracks as Sidecar audio tracks
     *
     * @param mainAudioTrackIds
     */
    exportMainAudioTracksToSidecar(mainAudioTrackIds: string[]): Observable<OmpAudioTrack[]>;
}
