import { OmpAudioEffectConnectionDef, OmpAudioEffectDef, OmpAudioEffectsGraphDef } from './model';
import { OmpAudioNodeParam, OmpAudioNodeValueParam } from './omp-web-audio';
import { OmpAudioEffectParamType } from '../video/model';
import { Observable, ReplaySubject } from 'rxjs';
/**
 * Implementation of {@link OmpAudioEffectDef}
 */
export interface OmpAudioEffect {
    /**
     * Converts effect to effect definition
     */
    toDef(): OmpAudioEffectDef;
    /**
     * Returns input audio nodes
     */
    getInputNodes(): AudioNode[];
    /**
     * Returns output audio nodes
     */
    getOutputNode(): AudioNode;
    /**
     * Returns all audio nodes
     */
    getNodes(): AudioNode[];
    /**
     * Effect's id. Unique at {@link OmpAudioEffectsGraph} level.
     */
    id: string;
    /**
     * Effect's effect type. Used for dynamic effect instantiation.
     */
    effectType: string;
    /**
     * Arbitrary values used to describe the effect
     */
    attrs: Map<string, any>;
    /**
     * Signals when effect is fully initialized.
     */
    onReady$: Observable<void>;
    /**
     * Sets effect parameter.
     *
     * @param param
     */
    setParam(param: OmpAudioEffectParam): void;
    /**
     * Returns all effect parameters
     */
    getParams(): OmpAudioEffectParamType[] | undefined;
    /**
     * Destroys all effect's nodes and sets up the effect to be garbage collected
     */
    destroy(): void;
}
export declare class DefaultOmpAudioEffectDef implements OmpAudioEffectDef {
    id: string;
    effectType: string;
    attrs?: Record<string, any>;
    connections?: OmpAudioEffectConnectionDef[];
    audioParams?: OmpAudioEffectParamType[];
    constructor(id: string, effectType: string);
    withAttrs(attrs: Record<string, any>): DefaultOmpAudioEffectDef;
    outputTo(...effectConnections: (string | OmpAudioEffectConnectionDef)[]): DefaultOmpAudioEffectDef;
    addParam(audioParam: OmpAudioEffectParamType): this;
}
export declare class OmpAudioEffectsGraphDefBuilder {
    protected _effectDefs: OmpAudioEffectDef[];
    protected _effectDefsMap: Map<string, OmpAudioEffectDef>;
    protected _sourceEffectDefs?: OmpAudioEffectDef[];
    protected _destinationEffectDefs?: OmpAudioEffectDef[];
    private constructor();
    static instance(): OmpAudioEffectsGraphDefBuilder;
    addEffects(effectDefs: OmpAudioEffectDef[]): this;
    addEffect(node: OmpAudioEffectDef): this;
    connections(connections: [{
        from: string;
        to: string;
    }]): this;
    connect(sourceNodeId: string, destinationNodeId: string): this;
    sourceEffectsIds(ids: string[]): this;
    destinationEffectsIds(ids: string[]): this;
    build(): OmpAudioEffectsGraphDef;
}
/**
 * Audio effects graph definition. Contains {@link OmpAudioEffectDef}'s
 */
export declare class DefaultOmpAudioEffectsGraphDef implements OmpAudioEffectsGraphDef {
    effectDefs: OmpAudioEffectDef[];
    sourceEffectIds: string[];
    destinationEffectIds: string[];
    private constructor();
    static create(...effects: OmpAudioEffectDef[]): DefaultOmpAudioEffectsGraphDef;
}
export declare class OmpAudioEffectParam extends OmpAudioNodeParam {
}
export declare class OmpAudioEffectGainParam extends OmpAudioEffectParam {
    protected readonly _valueParam: OmpAudioNodeValueParam;
    constructor(gain?: number);
    setGain(gain: number): void;
}
export declare class OmpAudioEffectDelayTimeParam extends OmpAudioEffectParam {
    protected readonly _valueParam: OmpAudioNodeValueParam;
    constructor(delayTime?: number);
    setDelayTime(delayTime: number): void;
}
export type OmpAudioEffectFactory = (ctx: AudioContext, effectDef: OmpAudioEffectDef) => OmpAudioEffect;
export declare class OmpAudioEffectsRegistry {
    private static _instance?;
    private registry;
    private constructor();
    static get instance(): OmpAudioEffectsRegistry;
    register(name: string, effect: OmpAudioEffectFactory): void;
    get(name: string): OmpAudioEffectFactory | undefined;
}
/**
 * Gain effect
 */
export declare class OmpGainEffect implements OmpAudioEffect {
    private _gainNode;
    private _def;
    readonly id: string;
    readonly effectType: string;
    attrs: Map<string, any>;
    onReady$: ReplaySubject<void>;
    constructor(audioContext: AudioContext, def: OmpAudioEffectDef);
    private extractGainParamFromDef;
    getInputNodes(): AudioNode[];
    getOutputNode(): AudioNode;
    getNodes(): AudioNode[];
    getParams(): OmpAudioEffectParamType[] | undefined;
    toDef(): OmpAudioEffectDef;
    setParam(param: OmpAudioEffectParam): void;
    private updateDefParam;
    destroy(): void;
    static createDef(id: string, gain: number): DefaultOmpAudioEffectDef;
}
/**
 * Delay effect
 */
export declare class OmpDelayEffect implements OmpAudioEffect {
    private _delayNode;
    private _def;
    readonly id: string;
    readonly effectType: string;
    attrs: Map<string, any>;
    onReady$: ReplaySubject<void>;
    constructor(audioContext: AudioContext, def: OmpAudioEffectDef);
    private extractDelayTimeParamFromDef;
    getInputNodes(): AudioNode[];
    getOutputNode(): AudioNode;
    getNodes(): AudioNode[];
    getParams(): OmpAudioEffectParamType[] | undefined;
    toDef(): OmpAudioEffectDef;
    setParam(param: OmpAudioEffectParam): void;
    private updateDefParam;
    destroy(): void;
    static createDef(id: string, delayTime: number): DefaultOmpAudioEffectDef;
}
/**
 * Filter values used for filtering {@link OmpAudioEffect}'s
 */
export interface OmpAudioEffectFilter {
    /**
     * {@link OmpAudioEffect.id}
     */
    id?: string;
    /**
     * {@link OmpAudioEffect.type}
     */
    effectType?: string;
    /**
     * {@link OmpAudioEffect.attrs}
     */
    attrs?: Record<string, any>;
}
/**
 * Audio effects graph. Implementation corresponds to definition {@link OmpAudioEffectsGraph.toDef}
 */
export declare class OmpAudioEffectsGraph {
    private audioContext;
    private def;
    protected _effects: OmpAudioEffect[];
    protected _effectsById: Map<string, OmpAudioEffect>;
    protected _sourceEffects: OmpAudioEffect[];
    protected _destinationEffects: OmpAudioEffect[];
    protected _initialized: boolean;
    get initialized(): boolean;
    constructor(audioContext: AudioContext, def: OmpAudioEffectsGraphDef);
    initialize(): Observable<void>;
    /**
     * Finds all {@link OmpAudioEffect}'s that correspond to {@link filter}
     *
     * @param filter
     */
    findAudioEffects(filter?: OmpAudioEffectFilter): OmpAudioEffect[];
    /**
     * Audio effects graph input {@link OmpAudioEffect}'s
     */
    get sourceEffects(): OmpAudioEffect[];
    /**
     * Audio effects graph output {@link OmpAudioEffect}'s
     */
    get destinationEffects(): OmpAudioEffect[];
    toDef(): OmpAudioEffectsGraphDef;
    destroy(): void;
}
export declare class OmpAudioEffectsUtil {
    /**
     * Calculates crossfade gain value for {@link value} and {@link curve}
     *
     * @param value in [0, 1] range
     * @param curve
     */
    static crossfadeGain(value: number, curve?: 'linear' | 'equal-power' | 'log' | 'sigmoid'): {
        left: number;
        right: number;
    };
}
