import { Destroyable, OmpAudioRouterChangeEvent } from '../types';
import { Observable, Subject } from 'rxjs';
import { AudioInputOutputNode, OmpAudioRouterState } from './model';
import { AudioRouterApi } from '../api/audio-router-api';
export declare class OmpAudioRouter implements AudioRouterApi, Destroyable {
    readonly onChange$: Subject<OmpAudioRouterChangeEvent>;
    protected _inputsNumber: number;
    protected _outputsNumber: number;
    protected _sourceAudioNode?: AudioNode;
    protected _channelSplitterNode: ChannelSplitterNode;
    protected _channelMergerNode: ChannelMergerNode;
    /**
     * Mapped by inputNumber, then by outputNumber
     * @protected
     */
    protected _audioInputOutputNodes: Map<number, Map<number, AudioInputOutputNode>>;
    protected _destroyed$: Subject<void>;
    protected static readonly defaultAudioOutputsResolver: (maxChannelCount: number) => number;
    constructor(audioContext: AudioContext, inputsNumber: number, outputsNumberResolver?: (maxChannelCount: number) => number);
    get isSourceConnected(): boolean;
    disconnectSource(): void;
    connectSource(audioNode: AudioNode): void;
    routeAudioInputOutputNodes(newAudioInputOutputNodes: AudioInputOutputNode[]): Observable<void>;
    routeAudioInputOutputNode(newAudioInputOutputNode: AudioInputOutputNode): Observable<void>;
    getAudioInputOutputNodes(): AudioInputOutputNode[][];
    get sourceAudioNode(): AudioNode | undefined;
    get inputsNumber(): number;
    get outputsNumber(): number;
    getAudioRouterState(): OmpAudioRouterState;
    protected dispatchOnChange(): void;
    protected _routeAudioInputOutputNode(newNode: AudioInputOutputNode, emitEvent?: boolean): void;
    destroy(): void;
}
