瀏覽代碼

PositionalAudio: Use linearRampToValueAtTime()

Mugen87 7 年之前
父節點
當前提交
ec56aeb20c
共有 3 個文件被更改,包括 25 次插入5 次删除
  1. 1 0
      src/audio/Audio.js
  2. 5 3
      src/audio/AudioListener.js
  3. 19 2
      src/audio/PositionalAudio.js

+ 1 - 0
src/audio/Audio.js

@@ -11,6 +11,7 @@ function Audio( listener ) {
 
 	this.type = 'Audio';
 
+	this.listener = listener;
 	this.context = listener.context;
 
 	this.gain = this.context.createGain();

+ 5 - 3
src/audio/AudioListener.js

@@ -21,6 +21,8 @@ function AudioListener() {
 
 	this.filter = null;
 
+	this.timeDelta = 0;
+
 }
 
 AudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {
@@ -105,6 +107,8 @@ AudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {
 			var listener = this.context.listener;
 			var up = this.up;
 
+			this.timeDelta = clock.getDelta();
+
 			this.matrixWorld.decompose( position, quaternion, scale );
 
 			orientation.set( 0, 0, - 1 ).applyQuaternion( quaternion );
@@ -112,10 +116,8 @@ AudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {
 			if ( listener.positionX ) {
 
 				// code path for Chrome (see #14393)
-				// right now, it is the only browser that supports AudioParam in AudioListener
 
-				var delta = clock.getDelta();
-				var endTime = this.context.currentTime + delta;
+				var endTime = this.context.currentTime + this.timeDelta;
 
 				listener.positionX.linearRampToValueAtTime( position.x, endTime );
 				listener.positionY.linearRampToValueAtTime( position.y, endTime );

+ 19 - 2
src/audio/PositionalAudio.js

@@ -109,8 +109,25 @@ PositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), {
 
 			orientation.set( 0, 0, 1 ).applyQuaternion( quaternion );
 
-			panner.setPosition( position.x, position.y, position.z );
-			panner.setOrientation( orientation.x, orientation.y, orientation.z );
+			if ( panner.positionX ) {
+
+				// code path for Chrome and Firefox (see #14393)
+
+				var 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 );
+
+			}
 
 		};