import { AudioSourceInfo, FfiHandle } from '@livekit/rtc-ffi-bindings';
import { AudioFrame } from './audio_frame.cjs';

declare class AudioSource {
    /** @internal */
    info: AudioSourceInfo;
    /** @internal */
    ffiHandle: FfiHandle;
    /** @internal */
    lastCapture: number;
    /** @internal */
    currentQueueSize: number;
    /** @internal */
    promise?: Promise<void>;
    /** @internal */
    resolvePromise?: () => void;
    /** @internal */
    timeout?: ReturnType<typeof setTimeout>;
    /** @internal */
    closed: boolean;
    sampleRate: number;
    numChannels: number;
    queueSize: number;
    constructor(sampleRate: number, numChannels: number, queueSize?: number);
    get queuedDuration(): number;
    clearQueue(): void;
    /**
     * Resolve the pending waitForPlayout() promise (if any) and reset the queue
     * bookkeeping. Mirrors python-sdks' AudioSource._release_waiter: the promise is
     * discarded here and lazily re-created by the next captureFrame, so a later
     * waitForPlayout() can never consume a stale resolution and report playout
     * complete while audio is still queued.
     * @internal
     */
    releaseWaiter: () => void;
    waitForPlayout(): Promise<void>;
    captureFrame(frame: AudioFrame): Promise<void>;
    close(): Promise<void>;
}

export { AudioSource };
