From 5fb99a97f8802af9a22a6713009e1432042347e4 Mon Sep 17 00:00:00 2001 From: Sebastian Krzyszkowiak Date: Mon, 7 Jan 2019 00:37:34 +0100 Subject: [PATCH] emscripten: revise compiler settings and add a pre-js file with audio autoplay workaround --- cmake/libsuperderpy.cmake | 11 ++++++----- src/emscripten-pre-js.js | 14 ++++++++++++++ src/libsuperderpy.c | 1 - src/libsuperderpy.h | 2 +- 4 files changed, 21 insertions(+), 7 deletions(-) create mode 100644 src/emscripten-pre-js.js diff --git a/cmake/libsuperderpy.cmake b/cmake/libsuperderpy.cmake index d23c96a..b7f1387 100644 --- a/cmake/libsuperderpy.cmake +++ b/cmake/libsuperderpy.cmake @@ -193,19 +193,20 @@ if (NOT LIBSUPERDERPY_CONFIG_INCLUDED) if(EMSCRIPTEN) set(CMAKE_EXECUTABLE_SUFFIX ".bc") set(CMAKE_SHARED_LIBRARY_SUFFIX ".so") - set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -s SIDE_MODULE=1 -s EXPORT_ALL=1") - set(EMSCRIPTEN_FLAGS -s FULL_ES2=1 -s ERROR_ON_UNDEFINED_SYMBOLS=1 -s EMTERPRETIFY=1 -s EMTERPRETIFY_ASYNC=1 -s EMTERPRETIFY_WHITELIST=[\"_libsuperderpy_emscripten_mainloop\",\"_libsuperderpy_mainloop\",\"_MainloopTick\",\"_GamestateLoadingThread\"] -s PRECISE_F32=1 -s EXPORT_ALL=1 -s EXTRA_EXPORTED_RUNTIME_METHODS=[\"Pointer_stringify\"]) + + set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -s SIDE_MODULE=2 -s EXPORTED_FUNCTIONS=[\"_Gamestate_ProgressCount\",\"_Gamestate_Draw\",\"_Gamestate_Logic\",\"_Gamestate_Tick\",\"_Gamestate_Load\",\"_Gamestate_PostLoad\",\"_Gamestate_Start\",\"_Gamestate_Pause\",\"_Gamestate_Resume\",\"_Gamestate_Stop\",\"_Gamestate_Unload\",\"_Gamestate_ProcessEvent\",\"_Gamestate_Reload\"]") + set(EMSCRIPTEN_FLAGS --llvm-lto 1 --use-preload-plugins --pre-js "${LIBSUPERDERPY_DIR}/src/emscripten-pre-js.js" -s FULL_ES2=1 -s STRICT=1 -s EMTERPRETIFY=1 -s EMTERPRETIFY_ASYNC=1 -s EMTERPRETIFY_WHITELIST=[\"_libsuperderpy_emscripten_mainloop\",\"_libsuperderpy_mainloop\",\"_MainloopTick\",\"_GamestateLoadingThread\"] -s EXPORT_ALL=1 -s EXTRA_EXPORTED_RUNTIME_METHODS=[\"Pointer_stringify\"]) set(LIBSUPERDERPY_EMSCRIPTEN_MODE "asm.js" CACHE STRING "Emscripten compilation mode (JavaScript or WebAssembly)") set_property(CACHE LIBSUPERDERPY_EMSCRIPTEN_MODE PROPERTY STRINGS "asm.js;wasm") if("${LIBSUPERDERPY_EMSCRIPTEN_MODE}" STREQUAL "wasm") - set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -s WASM=1 -s BINARYEN_METHOD=native-wasm") - set(EMSCRIPTEN_FLAGS ${EMSCRIPTEN_FLAGS} -s WASM=1 -s BINARYEN_METHOD=native-wasm) + set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -s WASM=1") + set(EMSCRIPTEN_FLAGS ${EMSCRIPTEN_FLAGS} -s WASM=1 -s ALLOW_MEMORY_GROWTH=1 --no-heap-copy) set(CMAKE_SHARED_MODULE_SUFFIX ".wasm") add_definitions(-DLIBSUPERDERPY_WASM=1) else() set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -s WASM=0") - set(EMSCRIPTEN_FLAGS ${EMSCRIPTEN_FLAGS} -s WASM=0) + set(EMSCRIPTEN_FLAGS ${EMSCRIPTEN_FLAGS} -s WASM=0 -s PRECISE_F32=1) set(CMAKE_SHARED_MODULE_SUFFIX ".js") endif() diff --git a/src/emscripten-pre-js.js b/src/emscripten-pre-js.js new file mode 100644 index 0000000..d4e60f9 --- /dev/null +++ b/src/emscripten-pre-js.js @@ -0,0 +1,14 @@ +var Module; +if (!Module) Module = (typeof Module !== 'undefined' ? Module : null) || {}; +// Disable image and audio decoding +Module.noImageDecoding = true; +Module.noAudioDecoding = true; + +// autoplay workaround +document.addEventListener("click", function() { + try { + if (!SDL2 || !SDL2.audioContext || !SDL2.audioContext.resume) return; + SDL2.audioContext.resume(); + } catch (err) {} + } +); diff --git a/src/libsuperderpy.c b/src/libsuperderpy.c index 72654f6..91edef2 100644 --- a/src/libsuperderpy.c +++ b/src/libsuperderpy.c @@ -386,7 +386,6 @@ SYMBOL_EXPORT int libsuperderpy_start(struct Game* game) { SYMBOL_INTERNAL void libsuperderpy_emscripten_mainloop(void* game) { if (!libsuperderpy_mainloop(game)) { libsuperderpy_destroy(game); - free(game); printf("Halted.\n"); emscripten_cancel_main_loop(); } diff --git a/src/libsuperderpy.h b/src/libsuperderpy.h index aa714ab..6ced11c 100644 --- a/src/libsuperderpy.h +++ b/src/libsuperderpy.h @@ -62,7 +62,7 @@ struct GamestateResources; #elif defined(ALLEGRO_IPHONE) #include #elif defined(__EMSCRIPTEN__) -#include +#include #endif #include "character.h"