/*
 * Copyright (C) 2010, Google Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1.  Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2.  Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

[
    Conditional=WEB_AUDIO,
    JSGenerateToJSObject,
    EnabledBySetting=WebAudioEnabled,
    Exposed=Window
] interface PannerNode : AudioNode {
    constructor (BaseAudioContext context, optional PannerOptions options);

    // Default model for stereo is equalpower
    [ImplementedAs=panningModelForBindings] attribute PanningModelType panningModel;

    // Uses a 3D cartesian coordinate system 
    undefined setPosition(float x, float y, float z);
    undefined setOrientation(float x, float y, float z);
    
    // Default distance model is inverse
    [ImplementedAs=distanceModelForBindings] attribute DistanceModelType distanceModel;

    [ImplementedAs=refDistanceForBindings] attribute double refDistance;
    [ImplementedAs=maxDistanceForBindings] attribute double maxDistance;
    [ImplementedAs=rolloffFactorForBindings] attribute double rolloffFactor;

    // Directional sound cone
    [ImplementedAs=coneInnerAngleForBindings] attribute double coneInnerAngle;
    [ImplementedAs=coneOuterAngleForBindings] attribute double coneOuterAngle;
    [ImplementedAs=coneOuterGainForBindings] attribute double coneOuterGain;
    
    // Position of audio source in 3D Cartesian system
    readonly attribute AudioParam positionX;
    readonly attribute AudioParam positionY;
    readonly attribute AudioParam positionZ;
    
    // Vector of direction of audio source in 3D cartesian system
    readonly attribute AudioParam orientationX;
    readonly attribute AudioParam orientationY;
    readonly attribute AudioParam orientationZ;
};
