import { Observable } from "../../Misc/observable";
import type { Nullable } from "../../types";
import { SoundState } from "../soundState";
import { AbstractNamedAudioNode } from "./abstractAudioNode";
import type { _AbstractSoundInstance } from "./abstractSoundInstance";
import type { PrimaryAudioBus } from "./audioBus";
import type { AudioEngineV2 } from "./audioEngineV2";
import type { _AbstractAudioSubGraph } from "./subNodes/abstractAudioSubGraph";
import type { IVolumeAudioOptions } from "./subNodes/volumeAudioSubNode";
import type { AbstractAudioAnalyzer, IAudioAnalyzerOptions } from "./subProperties/abstractAudioAnalyzer";
import type { AbstractSpatialAudio, ISpatialAudioOptions } from "./subProperties/abstractSpatialAudio";
import type { AbstractStereoAudio, IStereoAudioOptions } from "./subProperties/abstractStereoAudio";
/** @internal */
export interface IAbstractSoundOptionsBase {
    /**
     * Whether the sound should start playing automatically. Defaults to `false`.
     */
    autoplay: boolean;
    /**
     * The maximum number of instances that can play at the same time. Defaults to `Infinity`.
     */
    maxInstances: number;
}
/** @internal */
export interface IAbstractSoundPlayOptionsBase {
    /**
     * Whether the sound should loop. Defaults to `false`.
     */
    loop: boolean;
    /**
     * The time within the sound buffer to start playing at, in seconds. Defaults to `0`.
     */
    startOffset: number;
}
/**
 * Options for creating a sound.
 */
export interface IAbstractSoundOptions extends IAbstractSoundOptionsBase, IAbstractSoundPlayOptions, IAudioAnalyzerOptions, ISpatialAudioOptions, IStereoAudioOptions {
    /**
     * The output bus for the sound. Defaults to `null`.
     * - If not set or `null`, the sound is automatically connected to the audio engine's default main bus.
     * @see {@link AudioEngineV2.defaultMainBus}
     */
    outBus: Nullable<PrimaryAudioBus>;
}
/**
 * Options for playing a sound.
 */
export interface IAbstractSoundPlayOptions extends IAbstractSoundPlayOptionsBase, IVolumeAudioOptions {
}
/**
 * Options stored in a sound.
 * @internal
 */
export interface IAbstractSoundStoredOptions extends IAbstractSoundOptionsBase, IAbstractSoundPlayOptionsBase {
}
/**
 * Abstract class representing a sound in the audio engine.
 */
export declare abstract class AbstractSound extends AbstractNamedAudioNode {
    private _analyzer;
    private _newestInstance;
    private _outBus;
    private _privateInstances;
    private _state;
    protected _instances: ReadonlySet<_AbstractSoundInstance>;
    protected abstract readonly _options: IAbstractSoundStoredOptions;
    protected abstract _subGraph: _AbstractAudioSubGraph;
    /**
     * Observable for when the sound stops playing.
     */
    readonly onEndedObservable: Observable<AbstractSound>;
    protected constructor(name: string, engine: AudioEngineV2);
    /**
     * The analyzer features of the sound.
     */
    get analyzer(): AbstractAudioAnalyzer;
    /**
     * Whether the sound should start playing automatically. Defaults to `false`.
     */
    get autoplay(): boolean;
    /**
     * The current playback time of the sound, in seconds.
     */
    get currentTime(): number;
    set currentTime(value: number);
    /**
     * Whether the sound should loop. Defaults to `false`.
     */
    get loop(): boolean;
    set loop(value: boolean);
    /**
     * The maximum number of instances that can play at the same time. Defaults to `Infinity`.
     */
    get maxInstances(): number;
    set maxInstances(value: number);
    /**
     * The output bus for the sound. Defaults to `null`.
     * - If not set or `null`, the sound is automatically connected to the audio engine's default main bus.
     * @see {@link AudioEngineV2.defaultMainBus}
     */
    get outBus(): Nullable<PrimaryAudioBus>;
    set outBus(outBus: Nullable<PrimaryAudioBus>);
    /**
     * The spatial features of the sound.
     */
    abstract spatial: AbstractSpatialAudio;
    /**
     * The time within the sound buffer to start playing at, in seconds. Defaults to `0`.
     */
    get startOffset(): number;
    set startOffset(value: number);
    /**
     * The state of the sound.
     */
    get state(): SoundState;
    /**
     * The stereo features of the sound.
     */
    abstract stereo: AbstractStereoAudio;
    /**
     * The output volume of the sound.
     */
    get volume(): number;
    set volume(value: number);
    /**
     * Releases associated resources.
     */
    dispose(): void;
    /**
     * Plays the sound.
     * - Triggers `onEndedObservable` if played for the full duration and the `loop` option is not set.
     * @param options The options to use when playing the sound. Options set here override the sound's options.
     */
    abstract play(options?: Partial<IAbstractSoundPlayOptions>): void;
    /**
     * Pauses the sound.
     */
    pause(): void;
    /**
     * Resumes the sound.
     */
    resume(): void;
    /**
     * Stops the sound.
     * - Triggers `onEndedObservable` if the sound is playing.
     */
    abstract stop(): void;
    protected _beforePlay(instance: _AbstractSoundInstance): void;
    protected _afterPlay(instance: _AbstractSoundInstance): void;
    protected _getNewestInstance(): Nullable<_AbstractSoundInstance>;
    protected _setState(state: SoundState): void;
    protected abstract _createInstance(): _AbstractSoundInstance;
    protected _stopExcessInstances(): void;
    private _onInstanceEnded;
    private _onOutBusDisposed;
}
