declare module 'resonance-audio' {
    namespace ResonanceAudio {
        /** Options for constructing a new ResonanceAudio scene */
        interface Options {
            /** Desired ambisonic Order */
            ambisonicOrder?: number;
            /** The listener's initial position (in meters), where origin is the center of
             * the room */
            listenerPosition?: Float32Array;
            /** The listener's initial forward vector */
            listenerForward?: Float32Array;
            /** The listener's initial up vector */
            listenerUp?: Float32Array;
            /** Room dimensions (in meters) */
            dimensions?: Utils.RoomDimensions;
            /** Named acoustic materials per wall */
            materials?: Utils.RoomMaterials;
            /** (in meters/second) */
            speedOfSound?: number;
        }
    }
    /** Main class for managing sources, room and listener models */
    class ResonanceAudio {
        /** Binaurally-rendered stereo (2-channel) output */
        output: AudioNode;
        /** Ambisonic (multichannel) input */
        ambisonicInput: AudioNode;
        /** Ambisonic (multichannel) output */
        ambisonicOutput: AudioNode;
        constructor(context: AudioContext, options?: ResonanceAudio.Options);
        /**
         * Create a new source for the scene.
         * @param options
         * Options for constructing a new Source.
         */
        createSource(options?: Source.Options): Source;
        /**
         * Set the scene's desired ambisonic order.
         * @param ambisonicOrder Desired ambisonic order.
         */
        setAmbisonicOrder(ambisonicOrder: any): void;
        /**
         * Set the room's dimensions and wall materials.
         * @param dimensions Room dimensions (in meters).
         * @param materials Named acoustic materials per wall.
         */
        setRoomProperties(dimensions: Utils.RoomDimensions, materials: Utils.RoomMaterials): void;
        /**
         * Set the listener's position (in meters), where origin is the center of
         * the room.
         */
        setListenerPosition(x: number, y: number, z: number): any;
        /** Set the source's orientation using forward and up vectors. */
        setOrientation(forwardX: number, forwardY: number, forwardZ: number, upX: number, upY: number, upZ: number): void;
        /**
         * Set the listener's position and orientation using a Three.js Matrix4 object.
         * @param matrix
         * The Three.js Matrix4 object representing the listener's world transform.
         */
        setListenerFromMatrix(matrix4: Float32Array): void;
        /**
         * Set the speed of sound.
         */
        setSpeedOfSound(speedOfSound: number): void;
    }
    namespace Source {
        /** Options for constructing a new Source. */
        interface Options {
            /** The source's initial position (in meters), where origin is the center of
             * the room */
            position?: Float32Array;
            /** The source's initial forward vector */
            forward?: Float32Array;
            /** The source's initial up vector */
            up?: Float32Array;
            /** Min. distance (in meters) */
            minDistance?: number;
            /** Max. distance (in meters) */
            maxDistance?: number;
            /** Rolloff model to use */
            rolloff?: string;
            /** Input gain (linear) */
            gain?: number;
            /** Directivity alpha */
            alpha?: number;
            /** Directivity sharpness */
            sharpness?: number;
            /** Source width (in degrees). Where 0 degrees is a point source and 360 degrees
             * is an omnidirectional source */
            sourceWidth?: number;
        }
    }
    /**
     * Source model to spatialize an audio buffer.
     */
    class Source {
        constructor(scene: ResonanceAudio, options?: Source.Options);
        /** Mono (1-channel) input */
        input: AudioNode;
        /**
         * Set source's position (in meters), where origin is the center of
         * the room.
         */
        setPosition(x: number, y: number, z: number): void;
        /** Set source's rolloff. */
        setRolloff(rolloff: string): void;
        /** Set source's minimum distance (in meters). */
        setMinDistance(minDistance: number): void;
        /** Set source's maximum distance (in meters). */
        setMaxDistance(maxDistance: number): void;
        /** Set source's gain (linear). */
        setGain(gain: number): void;
        /** Set the source's orientation using forward and up vectors. */
        setOrientation(forwardX: number, forwardY: number, forwardZ: number, upX: number, upY: number, upZ: number): void;
        /** Set source's position and orientation using a
         * Three.js modelViewMatrix object */
        setFromMatrix(matrix4: Float32Array): void;
        /** Set the source width (in degrees). Where 0 degrees is a point source and 360
         * degrees is an omnidirectional source */
        setSourceWidth(sourceWidth: number): void;
        /**
         * Set source's directivity pattern (defined by alpha), where 0 is an
         * omnidirectional pattern, 1 is a bidirectional pattern, 0.5 is a cardiod
         * pattern. The sharpness of the pattern is increased exponentially
         * @param alpha
         * Determines directivity pattern (0 to 1).
         * @param sharpness
         * Determines the sharpness of the directivity pattern (1 to Inf).
         */
        setDirectivityPattern(alpha: number, sharpness: number): void;
    }
    namespace Room {
        interface Options {
            /** The listener's initial position (in meters), where origin is the center of
             * the room */
            listenerPosition?: Float32Array;
            /** Room dimensions (in meters) */
            dimensions?: Utils.RoomDimensions;
            /** Named acoustic materials per wall */
            materials?: Utils.RoomMaterials;
            /** (in meters/second) */
            speedOfSound?: number;
        }
    }
    /**
     * Model that manages early and late reflections using acoustic
     * properties and listener position relative to a rectangular room.
     */
    class Room {
        constructor(context: AudioContext, options?: Room.Options);
        /**
         * Set the room's dimensions and wall materials.
         * @param dimensions Room dimensions (in meters)
         * @param materials Named acoustic materials per wall
         */
        setProperties(dimensions: Utils.RoomDimensions, materials: Utils.RoomMaterials): void;
        /**
         * Set the listener's position (in meters), where origin is the center of
         * the room.
         */
        setListenerPosition(x: number, y: number, z: number): void;
        /**
         * Compute distance outside room of provided position (in meters).
         * @return
         * Distance outside room (in meters). Returns 0 if inside room.
         */
        getDistanceOutsideRoom(x: number, y: number, z: number): number;
    }
    namespace Listener {
        interface Options {
            /** Desired ambisonic order */
            ambisonicOrder: number;
            /** Initial position (in meters), where origin is the center of
             * the room */
            position?: Float32Array;
            /** The listener's initial forward vector */
            forward?: Float32Array;
            /** The listener's initial up vector */
            up?: Float32Array;
        }
    }
    /** Listener model to spatialize sources in an environment */
    class Listener {
        /** Position (in meters) */
        position: Float32Array;
        /** Ambisonic (multichannel) input */
        input: AudioNode;
        /** Binaurally-rendered stereo (2-channel) output */
        output: AudioNode;
        /** Ambisonic (multichannel) output */
        ambisonicOutput: AudioNode;
        /**
         * Set the listener's orientation using forward and up vectors.
         */
        setOrientation(forwardX: number, forwardY: number, forwardZ: number, upX: number, upY: number, upZ: number): void;
        /** Set listener's position and orientation using a
         * Three.js modelViewMatrix object */
        setFromMatrix(matrix4: Float32Array): void;
    }
    namespace Utils {
        /** Properties describing the geometry of a room. */
        interface RoomDimensions {
            width: number;
            height: number;
            depth: number;
        }
        /** Properties describing the wall materials */
        interface RoomMaterials {
            left: string;
            right: string;
            front: string;
            back: string;
            down: string;
            up: string;
        }
    }
}
