content/hifi-content/dave/walk-tools/walkTools/libraries/three.js/extras/audio/Audio.js
2022-02-13 22:49:05 +01:00

136 lines
2.4 KiB
JavaScript

/**
* @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.source.onended = this.onEnded.bind(this);
this.gain = this.context.createGain();
this.gain.connect( this.context.destination );
this.panner = this.context.createPanner();
this.panner.connect( this.gain );
this.autoplay = false;
this.startTime = 0;
this.isPlaying = false;
};
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;
if( scope.autoplay ) scope.play();
} );
};
request.send();
return this;
};
THREE.Audio.prototype.play = function () {
if ( this.isPlaying === true ) {
THREE.warn( 'THREE.Audio: Audio is already playing.' );
return;
}
var source = this.context.createBufferSource();
source.buffer = this.source.buffer;
source.loop = this.source.loop;
source.onended = this.source.onended;
source.connect( this.panner );
source.start( 0, this.startTime );
this.isPlaying = true;
this.source = source;
};
THREE.Audio.prototype.pause = function () {
this.source.stop();
this.startTime = this.context.currentTime;
};
THREE.Audio.prototype.stop = function () {
this.source.stop();
this.startTime = 0;
};
THREE.Audio.prototype.onEnded = function() {
this.isPlaying = false;
};
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.setVolume = function ( value ) {
this.gain.gain.value = 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 );
};
} )();