You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-08 12:40:44 +00:00
Use dummy driver when JS AudioContext is unavailable.
This commit is contained in:
@@ -36,6 +36,15 @@
|
|||||||
|
|
||||||
AudioDriverJavaScript *AudioDriverJavaScript::singleton = nullptr;
|
AudioDriverJavaScript *AudioDriverJavaScript::singleton = nullptr;
|
||||||
|
|
||||||
|
bool AudioDriverJavaScript::is_available() {
|
||||||
|
return EM_ASM_INT({
|
||||||
|
if (!(window.AudioContext || window.webkitAudioContext)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
const char *AudioDriverJavaScript::get_name() const {
|
const char *AudioDriverJavaScript::get_name() const {
|
||||||
return "JavaScript";
|
return "JavaScript";
|
||||||
}
|
}
|
||||||
@@ -207,12 +216,14 @@ void AudioDriverJavaScript::finish_async() {
|
|||||||
|
|
||||||
/* clang-format off */
|
/* clang-format off */
|
||||||
EM_ASM({
|
EM_ASM({
|
||||||
var ref = Module.IDHandler.get($0);
|
const id = $0;
|
||||||
|
var ref = Module.IDHandler.get(id);
|
||||||
Module.async_finish.push(new Promise(function(accept, reject) {
|
Module.async_finish.push(new Promise(function(accept, reject) {
|
||||||
if (!ref) {
|
if (!ref) {
|
||||||
console.log("Ref not found!", $0, Module.IDHandler);
|
console.log("Ref not found!", id, Module.IDHandler);
|
||||||
setTimeout(accept, 0);
|
setTimeout(accept, 0);
|
||||||
} else {
|
} else {
|
||||||
|
Module.IDHandler.remove(id);
|
||||||
const context = ref['context'];
|
const context = ref['context'];
|
||||||
// Disconnect script and input.
|
// Disconnect script and input.
|
||||||
ref['script'].disconnect();
|
ref['script'].disconnect();
|
||||||
@@ -226,7 +237,6 @@ void AudioDriverJavaScript::finish_async() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
Module.IDHandler.remove($0);
|
|
||||||
}, id);
|
}, id);
|
||||||
/* clang-format on */
|
/* clang-format on */
|
||||||
}
|
}
|
||||||
@@ -293,9 +303,5 @@ Error AudioDriverJavaScript::capture_stop() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
AudioDriverJavaScript::AudioDriverJavaScript() {
|
AudioDriverJavaScript::AudioDriverJavaScript() {
|
||||||
_driver_id = 0;
|
|
||||||
internal_buffer = nullptr;
|
|
||||||
buffer_length = 0;
|
|
||||||
|
|
||||||
singleton = this;
|
singleton = this;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,12 +34,13 @@
|
|||||||
#include "servers/audio_server.h"
|
#include "servers/audio_server.h"
|
||||||
|
|
||||||
class AudioDriverJavaScript : public AudioDriver {
|
class AudioDriverJavaScript : public AudioDriver {
|
||||||
float *internal_buffer;
|
float *internal_buffer = nullptr;
|
||||||
|
|
||||||
int _driver_id;
|
int _driver_id = 0;
|
||||||
int buffer_length;
|
int buffer_length = 0;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
static bool is_available();
|
||||||
void mix_to_js();
|
void mix_to_js();
|
||||||
void process_capture(float sample);
|
void process_capture(float sample);
|
||||||
|
|
||||||
|
|||||||
@@ -63,10 +63,17 @@ void main_loop_callback() {
|
|||||||
}
|
}
|
||||||
if (os->main_loop_iterate()) {
|
if (os->main_loop_iterate()) {
|
||||||
emscripten_cancel_main_loop(); // Cancel current loop and wait for finalize_async.
|
emscripten_cancel_main_loop(); // Cancel current loop and wait for finalize_async.
|
||||||
|
/* clang-format off */
|
||||||
EM_ASM({
|
EM_ASM({
|
||||||
// This will contain the list of operations that need to complete before cleanup.
|
// This will contain the list of operations that need to complete before cleanup.
|
||||||
Module.async_finish = [];
|
Module.async_finish = [
|
||||||
|
// Always contains at least one async promise, to avoid firing immediately if nothing is added.
|
||||||
|
new Promise(function(accept, reject) {
|
||||||
|
setTimeout(accept, 0);
|
||||||
|
})
|
||||||
|
];
|
||||||
});
|
});
|
||||||
|
/* clang-format on */
|
||||||
os->get_main_loop()->finish();
|
os->get_main_loop()->finish();
|
||||||
os->finalize_async(); // Will add all the async finish functions.
|
os->finalize_async(); // Will add all the async finish functions.
|
||||||
EM_ASM({
|
EM_ASM({
|
||||||
|
|||||||
@@ -77,7 +77,9 @@ void OS_JavaScript::initialize() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void OS_JavaScript::resume_audio() {
|
void OS_JavaScript::resume_audio() {
|
||||||
audio_driver_javascript.resume();
|
if (audio_driver_javascript) {
|
||||||
|
audio_driver_javascript->resume();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OS_JavaScript::set_main_loop(MainLoop *p_main_loop) {
|
void OS_JavaScript::set_main_loop(MainLoop *p_main_loop) {
|
||||||
@@ -125,11 +127,17 @@ void OS_JavaScript::delete_main_loop() {
|
|||||||
|
|
||||||
void OS_JavaScript::finalize_async() {
|
void OS_JavaScript::finalize_async() {
|
||||||
finalizing = true;
|
finalizing = true;
|
||||||
audio_driver_javascript.finish_async();
|
if (audio_driver_javascript) {
|
||||||
|
audio_driver_javascript->finish_async();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OS_JavaScript::finalize() {
|
void OS_JavaScript::finalize() {
|
||||||
delete_main_loop();
|
delete_main_loop();
|
||||||
|
if (audio_driver_javascript) {
|
||||||
|
memdelete(audio_driver_javascript);
|
||||||
|
audio_driver_javascript = nullptr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Miscellaneous
|
// Miscellaneous
|
||||||
@@ -238,7 +246,10 @@ void OS_JavaScript::initialize_joypads() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
OS_JavaScript::OS_JavaScript() {
|
OS_JavaScript::OS_JavaScript() {
|
||||||
AudioDriverManager::add_driver(&audio_driver_javascript);
|
if (AudioDriverJavaScript::is_available()) {
|
||||||
|
audio_driver_javascript = memnew(AudioDriverJavaScript);
|
||||||
|
AudioDriverManager::add_driver(audio_driver_javascript);
|
||||||
|
}
|
||||||
|
|
||||||
Vector<Logger *> loggers;
|
Vector<Logger *> loggers;
|
||||||
loggers.push_back(memnew(StdLogger));
|
loggers.push_back(memnew(StdLogger));
|
||||||
|
|||||||
@@ -40,7 +40,7 @@
|
|||||||
|
|
||||||
class OS_JavaScript : public OS_Unix {
|
class OS_JavaScript : public OS_Unix {
|
||||||
MainLoop *main_loop = nullptr;
|
MainLoop *main_loop = nullptr;
|
||||||
AudioDriverJavaScript audio_driver_javascript;
|
AudioDriverJavaScript *audio_driver_javascript = nullptr;
|
||||||
|
|
||||||
bool finalizing = false;
|
bool finalizing = false;
|
||||||
bool idb_available = false;
|
bool idb_available = false;
|
||||||
|
|||||||
Reference in New Issue
Block a user