[HTML5] Refactor audio drivers. Implement AudioWorklet w/o threads.

Performances are not great in general, bad on Firefox, on Chrome, well,
it's an improvement compared to the way they broke ScriptProcessorNode.

I'm actually surprised this works, it involves so many allocations, but
there's no way around it when SharedArrayBuffer is not available :(.
This commit is contained in:
Fabio Alessandrelli 2021-09-12 19:23:30 +02:00
parent da8cd3d7a7
commit 2024200182
7 changed files with 345 additions and 157 deletions

View file

@ -751,11 +751,14 @@ const char *OS_JavaScript::get_video_driver_name(int p_driver) const {
// Audio
int OS_JavaScript::get_audio_driver_count() const {
return 1;
return audio_drivers.size();
}
const char *OS_JavaScript::get_audio_driver_name(int p_driver) const {
return "JavaScript";
if (audio_drivers.size() <= p_driver) {
return "Unknown";
}
return audio_drivers[p_driver]->get_name();
}
// Clipboard
@ -961,9 +964,7 @@ MainLoop *OS_JavaScript::get_main_loop() const {
}
void OS_JavaScript::resume_audio() {
if (audio_driver_javascript) {
audio_driver_javascript->resume();
}
AudioDriverJavaScript::resume();
}
void OS_JavaScript::fs_sync_callback() {
@ -1021,9 +1022,10 @@ void OS_JavaScript::finalize() {
emscripten_webgl_commit_frame();
memdelete(visual_server);
emscripten_webgl_destroy_context(webgl_ctx);
if (audio_driver_javascript) {
memdelete(audio_driver_javascript);
for (int i = 0; i < audio_drivers.size(); i++) {
memdelete(audio_drivers[i]);
}
audio_drivers.clear();
}
// Miscellaneous
@ -1217,7 +1219,6 @@ OS_JavaScript::OS_JavaScript() {
main_loop = NULL;
visual_server = NULL;
audio_driver_javascript = NULL;
swap_ok_cancel = false;
idb_available = godot_js_os_fs_is_persistent() != 0;
@ -1225,8 +1226,13 @@ OS_JavaScript::OS_JavaScript() {
idb_is_syncing = false;
if (AudioDriverJavaScript::is_available()) {
audio_driver_javascript = memnew(AudioDriverJavaScript);
AudioDriverManager::add_driver(audio_driver_javascript);
#ifdef NO_THREADS
audio_drivers.push_back(memnew(AudioDriverScriptProcessor));
#endif
audio_drivers.push_back(memnew(AudioDriverWorklet));
}
for (int i = 0; i < audio_drivers.size(); i++) {
AudioDriverManager::add_driver(audio_drivers[i]);
}
Vector<Logger *> loggers;