Browse Source

Merge pull request #102715 from adamscott/remove-pool-return-false

[Web] Remove position pool system and return false when done instead
Rémi Verschelde 6 months ago
parent
commit
66d66807ab

+ 8 - 4
platform/web/js/libs/audio.position.worklet.js

@@ -35,16 +35,20 @@ class GodotPositionReportingProcessor extends AudioWorkletProcessor {
 		super(...args);
 		super(...args);
 		this.lastPostTime = currentTime;
 		this.lastPostTime = currentTime;
 		this.position = 0;
 		this.position = 0;
+		this.ended = false;
 
 
 		this.port.onmessage = (event) => {
 		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) {
 	process(inputs, _outputs, _parameters) {
+		if (this.ended) {
+			return false;
+		}
+
 		if (inputs.length > 0) {
 		if (inputs.length > 0) {
 			const input = inputs[0];
 			const input = inputs[0];
 			if (input.length > 0) {
 			if (input.length > 0) {
@@ -55,7 +59,7 @@ class GodotPositionReportingProcessor extends AudioWorkletProcessor {
 		// Posting messages is expensive. Let's limit the number of posts.
 		// Posting messages is expensive. Let's limit the number of posts.
 		if (currentTime - this.lastPostTime > POST_THRESHOLD_S) {
 		if (currentTime - this.lastPostTime > POST_THRESHOLD_S) {
 			this.lastPostTime = currentTime;
 			this.lastPostTime = currentTime;
-			this.port.postMessage({ 'type': 'position', 'data': this.position });
+			this.port.postMessage({ type: 'position', data: this.position });
 		}
 		}
 
 
 		return true;
 		return true;

+ 10 - 15
platform/web/js/libs/library_godot_audio.js

@@ -621,28 +621,24 @@ class SampleNode {
 		if (this.isCanceled) {
 		if (this.isCanceled) {
 			return;
 			return;
 		}
 		}
-		this.getPositionWorklet();
-		this._source.connect(this._positionWorklet);
+		this._source.connect(this.getPositionWorklet());
 		if (start) {
 		if (start) {
 			this.start();
 			this.start();
 		}
 		}
 	}
 	}
 
 
 	/**
 	/**
-	 * Get a AudioWorkletProcessor from the pool, or create one if no processor is available.
+	 * Get a AudioWorkletProcessor
+	 * @returns {AudioWorkletNode}
 	 */
 	 */
 	getPositionWorklet() {
 	getPositionWorklet() {
 		if (this._positionWorklet != null) {
 		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) => {
 		this._positionWorklet.port.onmessage = (event) => {
 			switch (event.data['type']) {
 			switch (event.data['type']) {
 			case 'position':
 			case 'position':
@@ -652,6 +648,7 @@ class SampleNode {
 				// Do nothing.
 				// Do nothing.
 			}
 			}
 		};
 		};
+		return this._positionWorklet;
 	}
 	}
 
 
 	/**
 	/**
@@ -681,8 +678,7 @@ class SampleNode {
 		if (this._positionWorklet) {
 		if (this._positionWorklet) {
 			this._positionWorklet.disconnect();
 			this._positionWorklet.disconnect();
 			this._positionWorklet.port.onmessage = null;
 			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;
 			this._positionWorklet = null;
 		}
 		}
 
 
@@ -1199,7 +1195,6 @@ const _GodotAudio = {
 
 
 		/** @type {Promise} */
 		/** @type {Promise} */
 		audioPositionWorkletPromise: null,
 		audioPositionWorkletPromise: null,
-		audioPositionWorkletPool: [],
 
 
 		/**
 		/**
 		 * Converts linear volume to Db.
 		 * Converts linear volume to Db.