123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- /**
- * @author mrdoob / http://mrdoob.com/
- */
- THREE.Audio = function ( listener, autoplay ) {
- THREE.Object3D.call( this );
- this.type = 'Audio';
- this.autoplay = autoplay || false;
- 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 );
- 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 ) {
- var source = this.context.createBufferSource();
- source.buffer = this.source.buffer;
- source.loop = this.source.loop;
- source.connect( this.panner );
- source.start( 0, this.startTime );
- this.isPlaying = true;
- this.source = source;
- }
- else {
- console.warn("Audio is already playing.")
- }
- };
- THREE.Audio.prototype.pause = function () {
- this.source.stop();
- this.startTime = this.context.currentTime;
- this.isPlaying = false;
- };
- THREE.Audio.prototype.stop = function () {
- this.source.stop();
- this.startTime = 0;
- 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 );
- };
- } )();
|