Mercurial > repos > blastem
changeset 2663:568c1c22f3e3
Allow changing at least some settings in web build without breaking
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 06 Mar 2025 01:33:03 -0800 |
parents | 5e2d41f0d2ba |
children | 36ae207af490 |
files | nuklear_ui/nuklear_sdl_gles2.h render_sdl.c |
diffstat | 2 files changed, 52 insertions(+), 21 deletions(-) [+] |
line wrap: on
line diff
--- a/nuklear_ui/nuklear_sdl_gles2.h Wed Mar 05 22:24:22 2025 -0800 +++ b/nuklear_ui/nuklear_sdl_gles2.h Thu Mar 06 01:33:03 2025 -0800 @@ -296,6 +296,9 @@ offset += cmd->elem_count; } nk_clear(&sdl.ctx); + glDisableVertexAttribArray((GLuint)dev->attrib_pos); + glDisableVertexAttribArray((GLuint)dev->attrib_uv); + glDisableVertexAttribArray((GLuint)dev->attrib_col); } glUseProgram(0);
--- a/render_sdl.c Wed Mar 05 22:24:22 2025 -0800 +++ b/render_sdl.c Thu Mar 06 01:33:03 2025 -0800 @@ -1073,25 +1073,39 @@ static int frame_repeat[60]; static uint32_t sample_rate; -static void init_audio() +typedef struct { + int rate; + int samples; + uint16_t format; +} audio_config; + +static audio_config get_audio_config(void) +{ + audio_config ret; + char * rate_str = tern_find_path(config, "audio\0rate\0", TVAL_PTR).ptrval; + ret.rate = rate_str ? atoi(rate_str) : 0; + if (!ret.rate) { + ret.rate = 48000; + } + char *config_format = tern_find_path_default(config, "audio\0format\0", (tern_val){.ptrval="f32"}, TVAL_PTR).ptrval; + ret.format = !strcmp(config_format, "s16") ? AUDIO_S16SYS : AUDIO_F32SYS; + char * samples_str = tern_find_path(config, "audio\0buffer\0", TVAL_PTR).ptrval; + ret.samples = samples_str ? atoi(samples_str) : 0; + if (!ret.samples) { + ret.samples = 512; + } + return ret; +} + +static audio_config current_audio_config; +static void init_audio(void) { SDL_AudioSpec desired, actual; - char * rate_str = tern_find_path(config, "audio\0rate\0", TVAL_PTR).ptrval; - int rate = rate_str ? atoi(rate_str) : 0; - if (!rate) { - rate = 48000; - } - desired.freq = rate; - char *config_format = tern_find_path_default(config, "audio\0format\0", (tern_val){.ptrval="f32"}, TVAL_PTR).ptrval; - desired.format = !strcmp(config_format, "s16") ? AUDIO_S16SYS : AUDIO_F32SYS; + audio_config ac = get_audio_config(); + desired.freq = ac.rate; + desired.format = ac.format; desired.channels = 2; - char * samples_str = tern_find_path(config, "audio\0buffer\0", TVAL_PTR).ptrval; - int samples = samples_str ? atoi(samples_str) : 0; - if (!samples) { - samples = 512; - } - debug_message("config says: %d\n", samples); - desired.samples = samples*2; + desired.samples = ac.samples * 2; switch (sync_src) { case SYNC_AUDIO: @@ -1108,8 +1122,9 @@ if (SDL_OpenAudio(&desired, &actual) < 0) { fatal_error("Unable to open SDL audio: %s\n", SDL_GetError()); } + current_audio_config = ac; sample_rate = actual.freq; - debug_message("Initialized audio at frequency %d with a %d sample buffer, ", actual.freq, actual.samples); + debug_message("Initialized %d channel audio at frequency %d with a %d sample buffer, ", actual.channels, actual.freq, actual.samples); render_audio_format format = RENDER_AUDIO_UNKNOWN; if (actual.format == AUDIO_S16SYS) { debug_message("signed 16-bit int format\n"); @@ -1442,6 +1457,7 @@ if (on_ui_fb_resized) { on_ui_fb_resized(); } + uint8_t old_sync_src = sync_src; window_setup(); update_aspect(); @@ -1452,10 +1468,20 @@ } #endif - uint8_t was_paused = SDL_GetAudioStatus() == SDL_AUDIO_PAUSED; - render_close_audio(); - quitting = 0; - init_audio(); + + uint8_t was_paused = 1; + uint8_t do_audio_reinit = sync_src != old_sync_src; + if (!do_audio_reinit) { + audio_config ac = get_audio_config(); + do_audio_reinit = ac.rate != current_audio_config.rate || + ac.samples != current_audio_config.samples || ac.format != current_audio_config.format; + } + if (do_audio_reinit) { + was_paused = SDL_GetAudioStatus() == SDL_AUDIO_PAUSED; + render_close_audio(); + quitting = 0; + init_audio(); + } render_set_video_standard(video_standard); drain_events(); @@ -1756,6 +1782,8 @@ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, extra->gl_buffers[1]); glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, (void *)0); + glDisableVertexAttribArray(extra->at_pos); + glDisableVertexAttribArray(extra->at_uv); } #endif