emscripten: revise compiler settings and add a pre-js file with audio autoplay workaround

This commit is contained in:
Sebastian Krzyszkowiak 2019-01-07 00:37:34 +01:00
parent f357d75591
commit 5fb99a97f8
No known key found for this signature in database
GPG key ID: E8F235CF3BDBC3FF
4 changed files with 21 additions and 7 deletions

View file

@ -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()

14
src/emscripten-pre-js.js Normal file
View file

@ -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) {}
}
);

View file

@ -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();
}

View file

@ -62,7 +62,7 @@ struct GamestateResources;
#elif defined(ALLEGRO_IPHONE)
#include <allegro5/allegro_iphone.h>
#elif defined(__EMSCRIPTEN__)
#include <emscripten.h>
#include <emscripten/emscripten.h>
#endif
#include "character.h"