Mercurial > repos > blastem
diff render_sdl.c @ 2640:c30e5548154f
Get sync to audio working in emscripten
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 26 Feb 2025 22:55:42 -0800 |
parents | f5603b4ee14d |
children | c5c9498ff279 |
line wrap: on
line diff
--- a/render_sdl.c Wed Feb 26 20:46:00 2025 -0800 +++ b/render_sdl.c Wed Feb 26 22:55:42 2025 -0800 @@ -26,6 +26,9 @@ #include <GL/glew.h> #endif #endif +#ifdef __EMSCRIPTEN__ +#include <emscripten.h> +#endif #define MAX_EVENT_POLL_PER_FRAME 2 @@ -123,12 +126,20 @@ { SDL_LockMutex(audio_mutex); uint8_t all_ready; +#ifdef __EMSCRIPTEN__ + if (!all_sources_ready()) { + memset(byte_stream, 0, len); + SDL_UnlockMutex(audio_mutex); + return; + } +#else do { all_ready = all_sources_ready(); if (!quitting && !all_ready) { SDL_CondWait(audio_ready, audio_mutex); } } while(!quitting && !all_ready); +#endif if (!quitting) { mix_and_convert(byte_stream, len, NULL); } @@ -255,6 +266,12 @@ uint8_t audio_deadlock_hack(void); +static ui_render_fun audio_full_cb; +void render_set_audio_full_fun(ui_render_fun cb) +{ + audio_full_cb = cb; +} + void render_do_audio_ready(audio_source *src) { if (sync_src == SYNC_AUDIO_THREAD) { @@ -268,7 +285,9 @@ system_request_exit(current_system, 0); } } else if (sync_src == SYNC_AUDIO) { + uint8_t all_ready = 0; SDL_LockMutex(audio_mutex); +#ifndef __EMSCRIPTEN__ if (src->front_populated) { if (audio_deadlock_hack()) { SDL_CondSignal(audio_ready); @@ -277,13 +296,18 @@ while (src->front_populated) { SDL_CondWait(src->opaque, audio_mutex); } +#endif int16_t *tmp = src->front; src->front = src->back; src->back = tmp; src->front_populated = 1; src->buffer_pos = 0; + all_ready = all_sources_ready(); SDL_CondSignal(audio_ready); SDL_UnlockMutex(audio_mutex); + if (all_ready && audio_full_cb) { + audio_full_cb(); + } } else { uint32_t num_buffered; SDL_LockAudio(); @@ -1070,6 +1094,12 @@ debug_message("unsupported format %X\n", actual.format); warning("Unsupported audio sample format: %X\n", actual.format); } +#ifdef __EMSCRIPTEN__ + if (sync_src == SYNC_AUDIO) { + printf("emscripten_set_main_loop_timing %d\n", actual.samples * 500 / actual.freq); + emscripten_set_main_loop_timing(EM_TIMING_SETTIMEOUT, actual.samples * 500 / actual.freq); + } +#endif render_audio_initialized(format, actual.freq, actual.channels, actual.samples, SDL_AUDIO_BITSIZE(actual.format) / 8); }