From 9d329f54c0e5dea2ca7864918ab53baf3a42835d Mon Sep 17 00:00:00 2001 From: Fabio Alessandrelli Date: Tue, 10 Dec 2024 14:32:07 +0100 Subject: [PATCH] [Web] Restore ScriptProcessorNode audio driver fallback Godot has a ScriptProcessorNode audio driver implementation for the (deprecated) Web API. As reported by some users, this fallback was not properly re-added during the Godot 4 transition, and was left as "dead code". While the API is deprecated, it is still supported by most browsers, and some WebView may not implement AudioWorklet correctly (the new recommended API). This commit re-adds the ScriptProcessorNode implementation as a fallback if the AudioWorklet driver fails to initialized (and can be forced if desired via project settings as usual). --- platform/web/audio_driver_web.cpp | 4 ++-- platform/web/audio_driver_web.h | 5 ++--- platform/web/js/libs/library_godot_audio.js | 2 +- platform/web/os_web.cpp | 1 + 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/platform/web/audio_driver_web.cpp b/platform/web/audio_driver_web.cpp index 0108f407262..f3d5b5cd1a1 100644 --- a/platform/web/audio_driver_web.cpp +++ b/platform/web/audio_driver_web.cpp @@ -479,6 +479,8 @@ void AudioDriverWorklet::_capture_callback(int p_pos, int p_samples) { driver->_audio_driver_capture(p_pos, p_samples); } +#endif // THREADS_ENABLED + /// ScriptProcessorNode implementation AudioDriverScriptProcessor *AudioDriverScriptProcessor::singleton = nullptr; @@ -497,5 +499,3 @@ Error AudioDriverScriptProcessor::create(int &p_buffer_samples, int p_channels) void AudioDriverScriptProcessor::start(float *p_out_buf, int p_out_buf_size, float *p_in_buf, int p_in_buf_size) { godot_audio_script_start(p_in_buf, p_in_buf_size, p_out_buf, p_out_buf_size, &_process_callback); } - -#endif // THREADS_ENABLED diff --git a/platform/web/audio_driver_web.h b/platform/web/audio_driver_web.h index d352fa46922..c317acfff01 100644 --- a/platform/web/audio_driver_web.h +++ b/platform/web/audio_driver_web.h @@ -169,6 +169,8 @@ public: AudioDriverWorklet() { singleton = this; } }; +#endif // THREADS_ENABLED + class AudioDriverScriptProcessor : public AudioDriverWeb { private: static void _process_callback(); @@ -178,7 +180,6 @@ private: protected: virtual Error create(int &p_buffer_size, int p_output_channels) override; virtual void start(float *p_out_buf, int p_out_buf_size, float *p_in_buf, int p_in_buf_size) override; - virtual void finish_driver() override; public: virtual const char *get_name() const override { return "ScriptProcessor"; } @@ -191,6 +192,4 @@ public: AudioDriverScriptProcessor() { singleton = this; } }; -#endif // THREADS_ENABLED - #endif // AUDIO_DRIVER_WEB_H diff --git a/platform/web/js/libs/library_godot_audio.js b/platform/web/js/libs/library_godot_audio.js index aaf986b9661..f566268e533 100644 --- a/platform/web/js/libs/library_godot_audio.js +++ b/platform/web/js/libs/library_godot_audio.js @@ -2160,7 +2160,7 @@ autoAddDeps(GodotAudioWorklet, '$GodotAudioWorklet'); mergeInto(LibraryManager.library, GodotAudioWorklet); /* - * The ScriptProcessorNode API, used when threads are disabled. + * The ScriptProcessorNode API, used as a fallback if AudioWorklet is not available. */ const GodotAudioScript = { $GodotAudioScript__deps: ['$GodotAudio'], diff --git a/platform/web/os_web.cpp b/platform/web/os_web.cpp index 51facbaa845..c7ca613f4e6 100644 --- a/platform/web/os_web.cpp +++ b/platform/web/os_web.cpp @@ -275,6 +275,7 @@ OS_Web::OS_Web() { if (AudioDriverWeb::is_available()) { audio_drivers.push_back(memnew(AudioDriverWorklet)); + audio_drivers.push_back(memnew(AudioDriverScriptProcessor)); } for (AudioDriverWeb *audio_driver : audio_drivers) { AudioDriverManager::add_driver(audio_driver);