From cdb6fc7f7419d5881194c35b42c3a0b53602032f Mon Sep 17 00:00:00 2001 From: Adam Scott Date: Tue, 11 Feb 2025 10:43:34 -0500 Subject: [PATCH] [Web] Remove position pool system and return false when done instead --- .../web/js/libs/audio.position.worklet.js | 12 ++++++--- platform/web/js/libs/library_godot_audio.js | 25 ++++++++----------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/platform/web/js/libs/audio.position.worklet.js b/platform/web/js/libs/audio.position.worklet.js index 7dbeb8a0add..155d4e6e876 100644 --- a/platform/web/js/libs/audio.position.worklet.js +++ b/platform/web/js/libs/audio.position.worklet.js @@ -35,16 +35,20 @@ class GodotPositionReportingProcessor extends AudioWorkletProcessor { super(...args); this.lastPostTime = currentTime; this.position = 0; + this.ended = false; this.port.onmessage = (event) => { - if (event?.data?.type === 'clear') { - this.lastPostTime = currentTime; - this.position = 0; + if (event?.data?.type === 'ended') { + this.ended = true; } }; } process(inputs, _outputs, _parameters) { + if (this.ended) { + return false; + } + if (inputs.length > 0) { const input = inputs[0]; if (input.length > 0) { @@ -55,7 +59,7 @@ class GodotPositionReportingProcessor extends AudioWorkletProcessor { // Posting messages is expensive. Let's limit the number of posts. if (currentTime - this.lastPostTime > POST_THRESHOLD_S) { this.lastPostTime = currentTime; - this.port.postMessage({ 'type': 'position', 'data': this.position }); + this.port.postMessage({ type: 'position', data: this.position }); } return true; diff --git a/platform/web/js/libs/library_godot_audio.js b/platform/web/js/libs/library_godot_audio.js index c5fa7d5f0fa..d0486279530 100644 --- a/platform/web/js/libs/library_godot_audio.js +++ b/platform/web/js/libs/library_godot_audio.js @@ -621,28 +621,24 @@ class SampleNode { if (this.isCanceled) { return; } - this.getPositionWorklet(); - this._source.connect(this._positionWorklet); + this._source.connect(this.getPositionWorklet()); if (start) { this.start(); } } /** - * Get a AudioWorkletProcessor from the pool, or create one if no processor is available. + * Get a AudioWorkletProcessor + * @returns {AudioWorkletNode} */ getPositionWorklet() { if (this._positionWorklet != null) { - return; - } - if (GodotAudio.audioPositionWorkletPool.length == 0) { - this._positionWorklet = new AudioWorkletNode( - GodotAudio.ctx, - 'godot-position-reporting-processor' - ); - } else { - this._positionWorklet = GodotAudio.audioPositionWorkletPool.pop(); + return this._positionWorklet; } + this._positionWorklet = new AudioWorkletNode( + GodotAudio.ctx, + 'godot-position-reporting-processor' + ); this._positionWorklet.port.onmessage = (event) => { switch (event.data['type']) { case 'position': @@ -652,6 +648,7 @@ class SampleNode { // Do nothing. } }; + return this._positionWorklet; } /** @@ -681,8 +678,7 @@ class SampleNode { if (this._positionWorklet) { this._positionWorklet.disconnect(); this._positionWorklet.port.onmessage = null; - this._positionWorklet.port.postMessage({ type: 'clear' }); - GodotAudio.audioPositionWorkletPool.push(this._positionWorklet); + this._positionWorklet.port.postMessage({ type: 'ended' }); this._positionWorklet = null; } @@ -1199,7 +1195,6 @@ const _GodotAudio = { /** @type {Promise} */ audioPositionWorkletPromise: null, - audioPositionWorkletPool: [], /** * Converts linear volume to Db.