From 5a8477565103a89dbba734a6c4e8834d0924e481 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Portas=20L=C3=B3pez?= <81629707+TeenBiscuits@users.noreply.github.com> Date: Fri, 16 Feb 2024 23:24:13 +0100 Subject: [PATCH] Los archivos hacen falta --- build/web/index.apple-touch-icon.png | Bin 0 -> 12190 bytes build/web/index.audio.worklet.js | 213 + build/web/index.html | 2 +- build/web/index.icon.png | Bin 0 -> 5578 bytes build/web/index.js | 14477 +++++++++++++++++++++++++ build/web/index.pck | Bin 0 -> 2274160 bytes build/web/index.png | Bin 0 -> 21443 bytes build/web/index.wasm | Bin 0 -> 35649444 bytes build/web/index.worker.js | 161 + 9 files changed, 14852 insertions(+), 1 deletion(-) create mode 100644 build/web/index.apple-touch-icon.png create mode 100644 build/web/index.audio.worklet.js create mode 100644 build/web/index.icon.png create mode 100644 build/web/index.js create mode 100644 build/web/index.pck create mode 100644 build/web/index.png create mode 100644 build/web/index.wasm create mode 100644 build/web/index.worker.js diff --git a/build/web/index.apple-touch-icon.png b/build/web/index.apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1feb92fe6cc55fb13e81f6f52cdad4b11ec2d941 GIT binary patch literal 12190 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 QfqS@bUzMdRB#i_A4_97NVE_OC literal 0 HcmV?d00001 diff --git a/build/web/index.audio.worklet.js b/build/web/index.audio.worklet.js new file mode 100644 index 0000000..89b581b --- /dev/null +++ b/build/web/index.audio.worklet.js @@ -0,0 +1,213 @@ +/**************************************************************************/ +/* audio.worklet.js */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +class RingBuffer { + constructor(p_buffer, p_state, p_threads) { + this.buffer = p_buffer; + this.avail = p_state; + this.threads = p_threads; + this.rpos = 0; + this.wpos = 0; + } + + data_left() { + return this.threads ? Atomics.load(this.avail, 0) : this.avail; + } + + space_left() { + return this.buffer.length - this.data_left(); + } + + read(output) { + const size = this.buffer.length; + let from = 0; + let to_write = output.length; + if (this.rpos + to_write > size) { + const high = size - this.rpos; + output.set(this.buffer.subarray(this.rpos, size)); + from = high; + to_write -= high; + this.rpos = 0; + } + if (to_write) { + output.set(this.buffer.subarray(this.rpos, this.rpos + to_write), from); + } + this.rpos += to_write; + if (this.threads) { + Atomics.add(this.avail, 0, -output.length); + Atomics.notify(this.avail, 0); + } else { + this.avail -= output.length; + } + } + + write(p_buffer) { + const to_write = p_buffer.length; + const mw = this.buffer.length - this.wpos; + if (mw >= to_write) { + this.buffer.set(p_buffer, this.wpos); + this.wpos += to_write; + if (mw === to_write) { + this.wpos = 0; + } + } else { + const high = p_buffer.subarray(0, mw); + const low = p_buffer.subarray(mw); + this.buffer.set(high, this.wpos); + this.buffer.set(low); + this.wpos = low.length; + } + if (this.threads) { + Atomics.add(this.avail, 0, to_write); + Atomics.notify(this.avail, 0); + } else { + this.avail += to_write; + } + } +} + +class GodotProcessor extends AudioWorkletProcessor { + constructor() { + super(); + this.threads = false; + this.running = true; + this.lock = null; + this.notifier = null; + this.output = null; + this.output_buffer = new Float32Array(); + this.input = null; + this.input_buffer = new Float32Array(); + this.port.onmessage = (event) => { + const cmd = event.data['cmd']; + const data = event.data['data']; + this.parse_message(cmd, data); + }; + } + + process_notify() { + if (this.notifier) { + Atomics.add(this.notifier, 0, 1); + Atomics.notify(this.notifier, 0); + } + } + + parse_message(p_cmd, p_data) { + if (p_cmd === 'start' && p_data) { + const state = p_data[0]; + let idx = 0; + this.threads = true; + this.lock = state.subarray(idx, ++idx); + this.notifier = state.subarray(idx, ++idx); + const avail_in = state.subarray(idx, ++idx); + const avail_out = state.subarray(idx, ++idx); + this.input = new RingBuffer(p_data[1], avail_in, true); + this.output = new RingBuffer(p_data[2], avail_out, true); + } else if (p_cmd === 'stop') { + this.running = false; + this.output = null; + this.input = null; + this.lock = null; + this.notifier = null; + } else if (p_cmd === 'start_nothreads') { + this.output = new RingBuffer(p_data[0], p_data[0].length, false); + } else if (p_cmd === 'chunk') { + this.output.write(p_data); + } + } + + static array_has_data(arr) { + return arr.length && arr[0].length && arr[0][0].length; + } + + process(inputs, outputs, parameters) { + if (!this.running) { + return false; // Stop processing. + } + if (this.output === null) { + return true; // Not ready yet, keep processing. + } + const process_input = GodotProcessor.array_has_data(inputs); + if (process_input) { + const input = inputs[0]; + const chunk = input[0].length * input.length; + if (this.input_buffer.length !== chunk) { + this.input_buffer = new Float32Array(chunk); + } + if (!this.threads) { + GodotProcessor.write_input(this.input_buffer, input); + this.port.postMessage({ 'cmd': 'input', 'data': this.input_buffer }); + } else if (this.input.space_left() >= chunk) { + GodotProcessor.write_input(this.input_buffer, input); + this.input.write(this.input_buffer); + } else { + this.port.postMessage('Input buffer is full! Skipping input frame.'); + } + } + const process_output = GodotProcessor.array_has_data(outputs); + if (process_output) { + const output = outputs[0]; + const chunk = output[0].length * output.length; + if (this.output_buffer.length !== chunk) { + this.output_buffer = new Float32Array(chunk); + } + if (this.output.data_left() >= chunk) { + this.output.read(this.output_buffer); + GodotProcessor.write_output(output, this.output_buffer); + if (!this.threads) { + this.port.postMessage({ 'cmd': 'read', 'data': chunk }); + } + } else { + this.port.postMessage('Output buffer has not enough frames! Skipping output frame.'); + } + } + this.process_notify(); + return true; + } + + static write_output(dest, source) { + const channels = dest.length; + for (let ch = 0; ch < channels; ch++) { + for (let sample = 0; sample < dest[ch].length; sample++) { + dest[ch][sample] = source[sample * channels + ch]; + } + } + } + + static write_input(dest, source) { + const channels = source.length; + for (let ch = 0; ch < channels; ch++) { + for (let sample = 0; sample < source[ch].length; sample++) { + dest[sample * channels + ch] = source[ch][sample]; + } + } + } +} + +registerProcessor('godot-processor', GodotProcessor); diff --git a/build/web/index.html b/build/web/index.html index 5605725..03995c6 100644 --- a/build/web/index.html +++ b/build/web/index.html @@ -137,7 +137,7 @@