diff --git a/src/engine/Resources/Sound/AudioInstance.ts b/src/engine/Resources/Sound/AudioInstance.ts index 52075665..122e1eb5 100644 --- a/src/engine/Resources/Sound/AudioInstance.ts +++ b/src/engine/Resources/Sound/AudioInstance.ts @@ -193,7 +193,7 @@ export class WebAudioInstance extends AudioInstance { this._volume = value; - if (this._volumeNode.gain.setTargetAtTime) { + if (this._isPlaying && this._volumeNode.gain.setTargetAtTime) { // https://developer.mozilla.org/en-US/docs/Web/API/AudioParam/setTargetAtTime // After each .1 seconds timestep, the target value will ~63.2% closer to the target value. // This exponential ramp provides a more pleasant trasition in gain diff --git a/src/spec/WebAudioInstanceSpec.ts b/src/spec/WebAudioInstanceSpec.ts index eea46de3..414b3bfd 100644 --- a/src/spec/WebAudioInstanceSpec.ts +++ b/src/spec/WebAudioInstanceSpec.ts @@ -31,6 +31,12 @@ describe('A webaudio instance', () => { setValueAtTime: () => { /*empty*/ } + }, + start: () => { + /*empty*/ + }, + stop: () => { + /*empty*/ } }; @@ -51,8 +57,15 @@ describe('A webaudio instance', () => { expect(webaudio).toBeDefined(); }); - it('should use specific settings for volume', () => { - webaudio.volume = 1; + it('should set volume immediately', () => { + webaudio.volume = 0.5; + expect(mockGainNode.gain.value).toEqual(0.5); + expect(mockGainNode.gain.setTargetAtTime).not.toHaveBeenCalled(); + }); + + it('should ramp volume when set during playback', () => { + webaudio.play(); + webaudio.volume = 0.25; expect(mockGainNode.gain.setTargetAtTime).toHaveBeenCalledWith(webaudio.volume, 0, 0.1); }); });