File: //var/www/aspa/three/audio/PositionalAudio.js
import { Vector3 } from '../math/Vector3.js';
import { Quaternion } from '../math/Quaternion.js';
import { Audio } from './Audio.js';
const _position = /*@__PURE__*/ new Vector3();
const _quaternion = /*@__PURE__*/ new Quaternion();
const _scale = /*@__PURE__*/ new Vector3();
const _orientation = /*@__PURE__*/ new Vector3();
class PositionalAudio extends Audio {
	constructor( listener ) {
		super( listener );
		this.panner = this.context.createPanner();
		this.panner.panningModel = 'HRTF';
		this.panner.connect( this.gain );
	}
	connect() {
		super.connect();
		this.panner.connect( this.gain );
	}
	disconnect() {
		super.disconnect();
		this.panner.disconnect( this.gain );
	}
	getOutput() {
		return this.panner;
	}
	getRefDistance() {
		return this.panner.refDistance;
	}
	setRefDistance( value ) {
		this.panner.refDistance = value;
		return this;
	}
	getRolloffFactor() {
		return this.panner.rolloffFactor;
	}
	setRolloffFactor( value ) {
		this.panner.rolloffFactor = value;
		return this;
	}
	getDistanceModel() {
		return this.panner.distanceModel;
	}
	setDistanceModel( value ) {
		this.panner.distanceModel = value;
		return this;
	}
	getMaxDistance() {
		return this.panner.maxDistance;
	}
	setMaxDistance( value ) {
		this.panner.maxDistance = value;
		return this;
	}
	setDirectionalCone( coneInnerAngle, coneOuterAngle, coneOuterGain ) {
		this.panner.coneInnerAngle = coneInnerAngle;
		this.panner.coneOuterAngle = coneOuterAngle;
		this.panner.coneOuterGain = coneOuterGain;
		return this;
	}
	updateMatrixWorld( force ) {
		super.updateMatrixWorld( force );
		if ( this.hasPlaybackControl === true && this.isPlaying === false ) return;
		this.matrixWorld.decompose( _position, _quaternion, _scale );
		_orientation.set( 0, 0, 1 ).applyQuaternion( _quaternion );
		const panner = this.panner;
		if ( panner.positionX ) {
			// code path for Chrome and Firefox (see #14393)
			const endTime = this.context.currentTime + this.listener.timeDelta;
			panner.positionX.linearRampToValueAtTime( _position.x, endTime );
			panner.positionY.linearRampToValueAtTime( _position.y, endTime );
			panner.positionZ.linearRampToValueAtTime( _position.z, endTime );
			panner.orientationX.linearRampToValueAtTime( _orientation.x, endTime );
			panner.orientationY.linearRampToValueAtTime( _orientation.y, endTime );
			panner.orientationZ.linearRampToValueAtTime( _orientation.z, endTime );
		} else {
			panner.setPosition( _position.x, _position.y, _position.z );
			panner.setOrientation( _orientation.x, _orientation.y, _orientation.z );
		}
	}
}
export { PositionalAudio };