1
0
Fork 0

[Web] Remove position pool system and return false when done instead

This commit is contained in:
Adam Scott 2025-02-11 10:43:34 -05:00
parent 172fc62c80
commit cdb6fc7f74
No known key found for this signature in database
GPG Key ID: F6BA2A0302E21A77
2 changed files with 18 additions and 19 deletions

View File

@ -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;

View File

@ -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.