diff --git a/src/audio/Audio.js b/src/audio/Audio.js index 42c598f584a1b2a05ade1a85a9f7bd5ee49e4492..dae3adf64100365c227a975b02d75cb4fe99fdda 100644 --- a/src/audio/Audio.js +++ b/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(); diff --git a/src/audio/AudioListener.js b/src/audio/AudioListener.js index 78173eeb69a10d8a88ca712cd1b37cbe7a9ec7ec..c777d5be1587c78a71a26e4d0b25ad73237f2de9 100644 --- a/src/audio/AudioListener.js +++ b/src/audio/AudioListener.js @@ -4,6 +4,7 @@ import { Vector3 } from '../math/Vector3.js'; import { Quaternion } from '../math/Quaternion.js'; +import { Clock } from '../core/Clock.js'; import { Object3D } from '../core/Object3D.js'; import { AudioContext } from './AudioContext.js'; @@ -20,6 +21,8 @@ function AudioListener() { this.filter = null; + this.timeDelta = 0; + } AudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), { @@ -95,6 +98,7 @@ AudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), { var scale = new Vector3(); var orientation = new Vector3(); + var clock = new Clock(); return function updateMatrixWorld( force ) { @@ -103,21 +107,27 @@ 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 ); if ( listener.positionX ) { - listener.positionX.setValueAtTime( position.x, this.context.currentTime ); - listener.positionY.setValueAtTime( position.y, this.context.currentTime ); - listener.positionZ.setValueAtTime( position.z, this.context.currentTime ); - listener.forwardX.setValueAtTime( orientation.x, this.context.currentTime ); - listener.forwardY.setValueAtTime( orientation.y, this.context.currentTime ); - listener.forwardZ.setValueAtTime( orientation.z, this.context.currentTime ); - listener.upX.setValueAtTime( up.x, this.context.currentTime ); - listener.upY.setValueAtTime( up.y, this.context.currentTime ); - listener.upZ.setValueAtTime( up.z, this.context.currentTime ); + // code path for Chrome (see #14393) + + var endTime = this.context.currentTime + this.timeDelta; + + listener.positionX.linearRampToValueAtTime( position.x, endTime ); + listener.positionY.linearRampToValueAtTime( position.y, endTime ); + listener.positionZ.linearRampToValueAtTime( position.z, endTime ); + listener.forwardX.linearRampToValueAtTime( orientation.x, endTime ); + listener.forwardY.linearRampToValueAtTime( orientation.y, endTime ); + listener.forwardZ.linearRampToValueAtTime( orientation.z, endTime ); + listener.upX.linearRampToValueAtTime( up.x, endTime ); + listener.upY.linearRampToValueAtTime( up.y, endTime ); + listener.upZ.linearRampToValueAtTime( up.z, endTime ); } else { diff --git a/src/audio/PositionalAudio.js b/src/audio/PositionalAudio.js index c37c75fc2a900b569931c2725575887fc2445deb..833436940dc895f82baddc9978898562cf5f2ded 100644 --- a/src/audio/PositionalAudio.js +++ b/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 ); + + } };