@@ -11,7 +11,7 @@ TARGET_BASE := $(subst .js,,$(TARGET))
1111
1212OS = Emscripten
1313OBJ :=
14- DEFINES := -DRARCH_INTERNAL -DHAVE_MAIN -DEMSCRIPTEN -DNO_CANVAS_RESIZE
14+ DEFINES := -DRARCH_INTERNAL -DHAVE_MAIN -DEMSCRIPTEN
1515DEFINES += -DHAVE_FILTERS_BUILTIN -DHAVE_ONLINE_UPDATER -DHAVE_UPDATE_ASSETS -DHAVE_UPDATE_CORE_INFO
1616
1717HAVE_PATCH = 1
@@ -27,7 +27,7 @@ HAVE_GLSL = 1
2727HAVE_SCREENSHOTS = 1
2828HAVE_REWIND = 1
2929HAVE_AUDIOMIXER = 1
30- HAVE_CC_RESAMPLER = 1
30+ HAVE_CC_RESAMPLER ? = 1
3131HAVE_EGL ?= 0
3232HAVE_OPENGLES = 1
3333HAVE_RJPEG = 0
@@ -54,27 +54,21 @@ HAVE_BSV_MOVIE = 1
5454HAVE_CHD ?= 0
5555HAVE_NETPLAYDISCOVERY ?= 0
5656
57- HAVE_AL ?= 1
58-
5957# enables pthreads, requires special headers on the web server:
6058# see https://web.dev/articles/coop-coep
6159HAVE_THREADS ?= 0
6260
6361# requires HAVE_THREADS
6462HAVE_AUDIOWORKLET ?= 0
6563
66- # WARNING -- READ BEFORE ENABLING
67- # The rwebaudio driver is known to have several audio bugs, such as
68- # minor crackling, or the entire page freezing/crashing.
69- # It works perfectly on chrome, but even firefox has really bad audio quality.
70- # I should also note, the driver on iOS is completely broken (crashes the page).
71- # You have been warned.
72- HAVE_RWEBAUDIO ?= 0
73-
74- # whether the browser thread is allowed to block to wait for audio to play,
75- # may lead to the issues mentioned above.
76- # currently this variable is only used by audioworklet;
77- # rwebaudio will always busywait and openal will never busywait.
64+ # doesn't work on PROXY_TO_PTHREAD
65+ HAVE_RWEBAUDIO ?= 1
66+
67+ # requires ASYNC or PROXY_TO_PTHREAD
68+ HAVE_AL ?= 0
69+
70+ # whether the browser thread is allowed to block to wait for audio to play, not CPU usage-friendly!
71+ # currently this variable is only used by rwebaudio and audioworklet; openal will never busywait.
7872ALLOW_AUDIO_BUSYWAIT ?= 0
7973
8074# minimal asyncify; better performance than full asyncify,
@@ -106,6 +100,9 @@ ASYNC ?= 0
106100LTO ?= 0
107101PTHREAD_POOL_SIZE ?= 4
108102
103+ ASYNCIFY_ADD ?= dynCall_*,emscripten_mainloop
104+ ASYNCIFY_REMOVE ?= threaded_worker
105+
109106STACK_SIZE ?= 4194304
110107INITIAL_HEAP ?= 134217728
111108
@@ -123,7 +120,7 @@ INITIAL_HEAP ?= 134217728
123120
124121OBJDIR := obj-emscripten
125122
126- EXPORTED_FUNCTIONS = _main,_malloc,_free,_cmd_savefiles,_cmd_save_state,_cmd_load_state,_cmd_undo_save_state,_cmd_undo_load_state,_cmd_take_screenshot,\
123+ EXPORTED_FUNCTIONS = _main,_malloc,_free,_cmd_savefiles,_cmd_save_state,_cmd_load_state,_cmd_undo_save_state,_cmd_undo_load_state,_cmd_toggle_fullscreen, _cmd_take_screenshot,\
127124_cmd_toggle_menu,_cmd_reload_config,_cmd_toggle_grab_mouse,_cmd_toggle_game_focus,_cmd_reset,_cmd_toggle_pause,_cmd_pause,_cmd_unpause,\
128125_cmd_set_volume,_cmd_set_shader,_cmd_cheat_set_code,_cmd_cheat_get_code,_cmd_cheat_toggle_index,_cmd_cheat_get_code_state,_cmd_cheat_realloc,\
129126_cmd_cheat_get_size,_cmd_cheat_apply_cheats,EmscriptenSendCommand,EmscriptenReceiveCommandReply
@@ -168,7 +165,7 @@ LDFLAGS := -L. --no-heap-copy -s STACK_SIZE=$(STACK_SIZE) -s INITIAL_MEMORY=$(IN
168165 -s ALLOW_MEMORY_GROWTH=1 -s EXPORTED_FUNCTIONS="$(EXPORTED_FUNCTIONS)" \
169166 -s MODULARIZE=1 -s EXPORT_ES6=1 -s EXPORT_NAME="libretro_$(subst -,_,$(LIBRETRO))" \
170167 -s DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=0 \
171- -s ENVIRONMENT=web,worker \
168+ -s ENVIRONMENT=web,worker -s WASM_BIGINT=1 \
172169 --extern-pre-js emscripten/pre.js \
173170 --js-library emscripten/library_rwebcam.js \
174171 --js-library emscripten/library_platform_emscripten.js
@@ -193,6 +190,9 @@ endif
193190ifeq ($(HAVE_RWEBAUDIO), 1)
194191 LDFLAGS += --js-library emscripten/library_rwebaudio.js
195192 DEFINES += -DHAVE_RWEBAUDIO
193+ ifeq ($(PROXY_TO_PTHREAD), 1)
194+ $(error ERROR: RWEBAUDIO is incompatible with PROXY_TO_PTHREAD)
195+ endif
196196endif
197197
198198ifeq ($(HAVE_AUDIOWORKLET), 1)
@@ -202,18 +202,24 @@ ifeq ($(HAVE_AUDIOWORKLET), 1)
202202 ifeq ($(HAVE_THREADS), 0)
203203 $(error ERROR: AUDIOWORKLET requires HAVE_THREADS)
204204 endif
205- ifeq ($(PROXY_TO_PTHREAD), 1)
206- else ifeq ($(ASYNC), 1)
205+ endif
206+
207+ ifeq ($(HAVE_AL), 1)
208+ LDFLAGS += -lopenal
209+ DEFINES += -DHAVE_AL
210+ endif
211+
212+ ifeq ($(PROXY_TO_PTHREAD), 1)
213+ else ifeq ($(ASYNC), 1)
214+ else
215+ DEFINES += -DEMSCRIPTEN_AUDIO_EXTERNAL_BLOCK
216+ ifeq ($(MIN_ASYNC), 1)
217+ DEFINES += -DEMSCRIPTEN_AUDIO_ASYNC_BLOCK
207218 else
208- DEFINES += -DEMSCRIPTEN_AUDIO_EXTERNAL_BLOCK
209- ifeq ($(MIN_ASYNC), 1)
210- DEFINES += -DEMSCRIPTEN_AUDIO_ASYNC_BLOCK
211- else
212- DEFINES += -DEMSCRIPTEN_AUDIO_FAKE_BLOCK
213- endif
214- ifneq ($(ALLOW_AUDIO_BUSYWAIT), 1)
215- DEFINES += -DEMSCRIPTEN_AUDIO_EXTERNAL_WRITE_BLOCK
216- endif
219+ DEFINES += -DEMSCRIPTEN_AUDIO_FAKE_BLOCK
220+ endif
221+ ifneq ($(ALLOW_AUDIO_BUSYWAIT), 1)
222+ DEFINES += -DEMSCRIPTEN_AUDIO_EXTERNAL_WRITE_BLOCK
217223 endif
218224endif
219225
@@ -224,23 +230,18 @@ endif
224230# explanation of some of these defines:
225231# EMSCRIPTEN_AUDIO_EXTERNAL_BLOCK: audio blocking occurs in the main loop instead of in the audio driver functions.
226232# EMSCRIPTEN_AUDIO_EXTERNAL_WRITE_BLOCK: along with above, enables external blocking in the write function.
227- # ALLOW_AUDIO_BUSYWAIT : write function will busywait. init function may still use an external block.
233+ # EMSCRIPTEN_AUDIO_BUSYWAIT : write function will busywait. init function may still use an external block.
228234# EMSCRIPTEN_AUDIO_ASYNC_BLOCK: external block uses emscripten_sleep (requires MIN_ASYNC).
229235# EMSCRIPTEN_AUDIO_FAKE_BLOCK: external block uses main loop timing (doesn't require asyncify).
230236# when building with either PROXY_TO_PTHREAD or ASYNC (full asyncify), none of the above are required.
231237
232- ifeq ($(HAVE_AL), 1)
233- LDFLAGS += -lopenal
234- DEFINES += -DHAVE_AL
235- endif
236-
237238ifeq ($(HAVE_THREADS), 1)
238239 LDFLAGS += -pthread -s PTHREAD_POOL_SIZE=$(PTHREAD_POOL_SIZE)
239240 CFLAGS += -pthread -s SHARED_MEMORY
240241endif
241242
242243ifeq ($(WASM_WORKERS), 1)
243- LDFLAGS += -s WASM_WORKERS=2
244+ LDFLAGS += -s WASM_WORKERS=1
244245endif
245246
246247ifeq ($(ASYNC), 1)
@@ -251,7 +252,7 @@ ifeq ($(ASYNC), 1)
251252 endif
252253else ifeq ($(MIN_ASYNC), 1)
253254 DEFINES += -DEMSCRIPTEN_ASYNCIFY -DEMSCRIPTEN_MIN_ASYNCIFY
254- LDFLAGS += -s ASYNCIFY=1 -s ASYNCIFY_STACK_SIZE=8192 -s ASYNCIFY_IGNORE_INDIRECT=1 -s ASYNCIFY_ADD='dynCall_*,emscripten_mainloop ' -s ASYNCIFY_REMOVE='threaded_worker '
255+ LDFLAGS += -s ASYNCIFY=1 -s ASYNCIFY_STACK_SIZE=8192 -s ASYNCIFY_IGNORE_INDIRECT=1 -s ASYNCIFY_ADD='$(ASYNCIFY_ADD) ' -s ASYNCIFY_REMOVE='$(ASYNCIFY_REMOVE) '
255256 ifeq ($(DEBUG), 1)
256257 LDFLAGS += -s ASYNCIFY_ADVISE #-s ASYNCIFY_DEBUG=1
257258 endif
@@ -297,21 +298,11 @@ all: $(TARGET)
297298$(libretro_new): ;
298299
299300mv_libretro:
300- mv -f $(libretro) $(libretro_new) || true
301+ $(Q) mv -f $(libretro) $(libretro_new) || true
301302
302- # until emscripten adds something like WASM_WORKERS=2 but for audio worklets, DIY.
303- ifeq ($(HAVE_AUDIOWORKLET), 1)
304303$(TARGET): $(RARCH_OBJ) $(libretro_new) mv_libretro
305304 @$(if $(Q), $(shell echo echo "LD $@ \<obj\> $(libretro_new) $(LIBS) $(LDFLAGS)"),)
306305 $(Q)$(LD) -o $@ $(RARCH_OBJ) $(libretro_new) $(LIBS) $(LDFLAGS)
307- $(Q)tr -d '\n' < "$(TARGET_BASE).aw.js" | sed -e "s/[\/&]/\\\\&/g" -e "s/'/\\\\\\\\&/g" > _audioworklet.js
308- $(Q)sed -i.bak -e "s/\"$(TARGET_BASE)\.aw\.js\"/URL.createObjectURL(new Blob(['$$(cat _audioworklet.js)'],{type:'text\/javascript'}))/" -- "$@"
309- $(Q)rm -f "$(TARGET_BASE).aw.js" _audioworklet.js "$@".bak
310- else
311- $(TARGET): $(RARCH_OBJ) $(libretro_new) mv_libretro
312- @$(if $(Q), $(shell echo echo "LD $@ \<obj\> $(libretro_new) $(LIBS) $(LDFLAGS)"),)
313- $(Q)$(LD) -o $@ $(RARCH_OBJ) $(libretro_new) $(LIBS) $(LDFLAGS)
314- endif
315306
316307$(OBJDIR)/%.o: %.c
317308 @mkdir -p $(dir $@)
0 commit comments