declare namespace pc {

    /**
     * @name pc.SoundManager
     * @class The SoundManager is used to load and play audio. As well as apply system-wide settings
     * like global volume, suspend and resume.
     * @description Creates a new sound manager.
     * @param {Object} [options]
     * @param {Boolean} [options.forceWebAudioApi] Always use the Web Audio API even check indicates that it if not available
     * @property {pc.Listener} listener Gets / sets the audio listener
     * @property {Number} volume Global volume for the manager. All {@link pc.SoundInstance}s will scale their volume with this volume. Valid between [0, 1].
     */
    class SoundManager {
        constructor(options: { forceWebAudioApi: boolean })

        listener: pc.Listener;
        volume: number;

        /**
         * @private
         * @function
         * @name pc.SoundManager.hasAudio
         * @description Reports whether this device supports the HTML5 Audio tag API
         * @returns true if HTML5 Audio tag API is supported and false otherwise
         */
        private hasAudio(): boolean;

        /**
         * @private
         * @function
         * @name pc.SoundManager.hasAudioContext
         * @description Reports whether this device supports the Web Audio API
         * @returns true if Web Audio is supported and false otherwise
         */
        private hasAudioContext(): boolean;

        /**
        * @private
        * @function
        * @name pc.SoundManager#playSound
        * @description Create a new pc.Channel and begin playback of the sound.
        * @param {pc.Sound} sound The Sound object to play.
        * @param {Object} options
        * @param {Number} [options.volume] The volume to playback at, between 0 and 1.
        * @param {Boolean} [options.loop] Whether to loop the sound when it reaches the end.
        */
        private playSound(sound: pc.Sound, options: { volume: number, loop: boolean }): pc.Channel;

        /**
        * @private
        * @function
        * @name pc.SoundManager#playSound3d
        * @description Create a new pc.Channel3d and begin playback of the sound at the position specified
        * @param {pc.Sound} sound The Sound object to play.
        * @param {pc.Vec3} position The position of the sound in 3D space.
        * @param {Object} options
        * @param {Number} [options.volume] The volume to playback at, between 0 and 1.
        * @param {Boolean} [options.loop] Whether to loop the sound when it reaches the end.
        */
        private playSound3d(sound: pc.Sound, position: pc.Vec3, options: { volume: number, loop: boolean }): pc.Channel3d;
    }
}