diff --git a/Makefile.common b/Makefile.common index 1286908851..3adbecfab3 100644 --- a/Makefile.common +++ b/Makefile.common @@ -758,8 +758,10 @@ ifeq ($(HAVE_EMSCRIPTEN), 1) OBJ += frontend/drivers/platform_emscripten.o \ input/drivers/rwebinput_input.o \ input/drivers_joypad/rwebpad_joypad.o \ - audio/drivers/rwebaudio.o \ camera/drivers/rwebcam.o + ifeq ($(HAVE_RWEBAUDIO), 1) + OBJ += audio/drivers/rwebaudio.o + endif endif ifeq ($(HAVE_BLUETOOTH), 1) diff --git a/Makefile.emscripten b/Makefile.emscripten index e6c092fcc4..88637560b3 100644 --- a/Makefile.emscripten +++ b/Makefile.emscripten @@ -46,6 +46,16 @@ HAVE_IBXM = 1 HAVE_CORE_INFO_CACHE = 1 HAVE_7ZIP = 1 HAVE_BSV_MOVIE = 1 +HAVE_AL = 1 + + +# WARNING -- READ BEFORE ENABLING +# The rwebaudio driver is known to have several audio bugs, such as +# minor crackling, or the entire page freezing/crashing. +# It works perfectly on chrome, but even firefox has really bad audio quality. +# I should also note, the driver on iOS is completely broken (crashes the page). +# You have been warned. +HAVE_RWEBAUDIO = 0 ASYNC ?= 0 ifeq ($(LIBRETRO), mupen64plus) @@ -70,9 +80,17 @@ OBJDIR := obj-emscripten LIBS := -s USE_ZLIB=1 LDFLAGS := -L. --no-heap-copy -s $(LIBS) -s TOTAL_MEMORY=$(MEMORY) -s NO_EXIT_RUNTIME=0 -s FULL_ES2=1 -s "EXTRA_EXPORTED_RUNTIME_METHODS=['callMain']" \ -s ALLOW_MEMORY_GROWTH=1 -s EXPORTED_FUNCTIONS="['_main', '_malloc', '_cmd_savefiles', '_cmd_save_state', '_cmd_load_state', '_cmd_take_screenshot']" \ - --js-library emscripten/library_rwebaudio.js \ - --js-library emscripten/library_rwebcam.js \ - --js-library emscripten/library_errno_codes.js + --js-library emscripten/library_errno_codes.js \ + --js-library emscripten/library_rwebcam.js + +ifeq ($(HAVE_RWEBAUDIO), 1) + LDFLAGS += --js-library emscripten/library_rwebaudio.js + DEFINES += -DHAVE_RWEBAUDIO +endif +ifeq ($(HAVE_AL), 1) + LDFLAGS += -lopenal + DEFINES += -DHAVE_AL +endif ifneq ($(PTHREAD), 0) LDFLAGS += -s WASM_MEM_MAX=1073741824 -pthread -s PTHREAD_POOL_SIZE=$(PTHREAD) diff --git a/audio/audio_driver.c b/audio/audio_driver.c index ce6e5f7fb9..45262d5425 100644 --- a/audio/audio_driver.c +++ b/audio/audio_driver.c @@ -143,7 +143,7 @@ audio_driver_t *audio_drivers[] = { #ifdef WIIU &audio_ax, #endif -#ifdef EMSCRIPTEN +#if defined(EMSCRIPTEN) && defined(HAVE_RWEBAUDIO) &audio_rwebaudio, #endif #if defined(PSP) || defined(VITA) || defined(ORBIS) diff --git a/audio/drivers/openal.c b/audio/drivers/openal.c index e08e69778e..35610b2f32 100644 --- a/audio/drivers/openal.c +++ b/audio/drivers/openal.c @@ -237,7 +237,11 @@ static bool al_start(void *data, bool is_shutdown) { al_t *al = (al_t*)data; if (al) - al->is_paused = false; +#ifdef EMSCRIPTEN //NEVER EVER BLOCK THE MAIN THREAD!! Emscripten will handle this for us :) + al->nonblock = true; +#else + al->nonblock = state; +#endif return true; } diff --git a/retroarch.c b/retroarch.c index 1ae702a22b..359ca7221c 100644 --- a/retroarch.c +++ b/retroarch.c @@ -4930,7 +4930,9 @@ int rarch_main(int argc, char *argv[], void *data) #if defined(EMSCRIPTEN) #include "gfx/common/gl_common.h" +#ifdef HAVE_RWEBAUDIO void RWebAudioRecalibrateTime(void); +#endif void emscripten_mainloop(void) { @@ -4946,7 +4948,9 @@ void emscripten_mainloop(void) bool runloop_is_slowmotion = runloop_flags & RUNLOOP_FLAG_SLOWMOTION; bool runloop_is_paused = runloop_flags & RUNLOOP_FLAG_PAUSED; +#ifdef HAVE_RWEBAUDIO RWebAudioRecalibrateTime(); +#endif emscripten_frame_count++;