import { TimeObject } from './utils/create-time-object';
import { Playable } from './interfaces/playable';
import { Connectable, Connection } from './interfaces/connectable';
import { ControlType, ParamController, RampType, RatioType, SeekType, BaseParamController } from './param-controller';
/**
 * The Sound class provides the core functionality for
 * interacting with the Web Audio API's AudioContext, and is the base class for
 * all other {{#crossLinkModule "Audio"}}{{/crossLinkModule}} types. It prepares
 * an audio source, provides various methods for interacting with the audio source,
 * creates {{#crossLink "AudioNode"}}AudioNodes{{/crossLink}} from the
 * nodes array, sets up the necessary nodes/routing between them,
 * and provides some methods to {{#crossLink "Playable/play:method"}}{{/crossLink}}
 * and {{#crossLink "Sound/stop:method"}}{{/crossLink}} the audio source.
 *
 * @public
 * @class Sound
 * @implements Playable
 */
export declare class Sound implements Playable, Connectable {
    protected audioContext: AudioContext;
    private audioBuffer;
    private gainNode;
    private pannerNode;
    private bufferSourceNode;
    private controller;
    _isPlaying: boolean;
    protected _startedPlayingAt: number;
    startOffset: number;
    connections: Connection[];
    constructor(audioContext: AudioContext, audioBuffer: AudioBuffer);
    private setup;
    wireConnections(): void;
    addConnection(connection: Connection): void;
    removeConnection(name: string): void;
    getConnection(name: string): Connection | undefined;
    getNodeFrom<T extends AudioNode | StereoPannerNode>(connectionName: string): T | undefined;
    get audioSourceNode(): AudioBufferSourceNode;
    update(type: ControlType): {
        to: (value: number) => {
            from: (method: RatioType) => void;
        };
    };
    changePanTo(value: number): void;
    changeGainTo(value: number): {
        from: (method: RatioType) => void;
    };
    onPlaySet(type: ControlType): {
        to: (value: number) => {
            at: (time: number) => void;
            endingAt: (time: number, rampType?: RampType) => void;
        };
    };
    onPlayRamp(type: ControlType, rampType?: RampType): {
        from: (startValue: number) => {
            to: (endValue: number) => {
                in: (endTime: number) => void;
            };
        };
    };
    play(): void;
    playFor(duration: number): void;
    playAt(time: number): void;
    stop(): void;
    get isPlaying(): boolean;
    get duration(): TimeObject;
    get percentGain(): number;
    /**
     * Gets the bufferSource and stops the initAudio,
     * changes it's play position, and restarts the audio.
     *
     * returns a pojo with the `from` method that `value` is curried to, allowing
     * one to specify which type of value is being provided.
     *
     * @example
     *     // for a Sound instance with a duration of 100 seconds, these will all
     *     // move the play position to 90 seconds.
     *     soundInstance.seek(0.9).from('ratio');
     *     soundInstance.seek(0.1).from('inverseRatio')
     *     soundInstance.seek(90).from('percent');
     *     soundInstance.seek(90).from('seconds');
     *
     * @param {number} amount The new play position value.
     */
    seek(amount: number): {
        from: (type: SeekType) => void;
    };
}
export declare class SoundController extends BaseParamController implements ParamController {
    private bufferSourceNode;
    protected gainNode: GainNode;
    protected pannerNode: StereoPannerNode;
    constructor(bufferSourceNode: AudioBufferSourceNode, gainNode: GainNode, pannerNode: StereoPannerNode);
    updateAudioSource(source: AudioBufferSourceNode): void;
    setValuesAtTimes(): void;
    private applyValues;
    private applyRampValues;
}
//# sourceMappingURL=sound.d.ts.map