/** * @author mrdoob / http://mrdoob.com/ */ THREE.Audio = function ( listener ) { THREE.Object3D.call( this ); this.type = 'Audio'; this.context = listener.context; this.source = this.context.createBufferSource(); this.gain = this.context.createGain(); this.gain.connect( this.context.destination ); this.panner = this.context.createPanner(); this.panner.connect( this.gain ); }; THREE.Audio.prototype = Object.create( THREE.Object3D.prototype ); THREE.Audio.prototype.constructor = THREE.Audio; THREE.Audio.prototype.load = function ( file ) { var scope = this; var request = new XMLHttpRequest(); request.open( 'GET', file, true ); request.responseType = 'arraybuffer'; request.onload = function ( e ) { scope.context.decodeAudioData( this.response, function ( buffer ) { scope.source.buffer = buffer; scope.source.connect( scope.panner ); scope.source.start( 0 ); } ); }; request.send(); return this; }; THREE.Audio.prototype.setLoop = function ( value ) { this.source.loop = value; }; THREE.Audio.prototype.setRefDistance = function ( value ) { this.panner.refDistance = value; }; THREE.Audio.prototype.setRolloffFactor = function ( value ) { this.panner.rolloffFactor = value; }; THREE.Audio.prototype.updateMatrixWorld = ( function () { var position = new THREE.Vector3(); return function ( force ) { THREE.Object3D.prototype.updateMatrixWorld.call( this, force ); position.setFromMatrixPosition( this.matrixWorld ); this.panner.setPosition( position.x, position.y, position.z ); }; } )();