From b5b6f070c961c2b4a1cfded0e571cff034f4c266 Mon Sep 17 00:00:00 2001 From: hgn Date: Sat, 5 Jul 2025 20:44:45 +0100 Subject: [PATCH] Dont remember --- vg_audio.c | 22 +++++++++++++++++++++- vg_audio.h | 6 +++++- vg_engine.c | 8 +++++--- vg_ui/imgui_impl_opengl.c | 29 ++++++++++------------------- 4 files changed, 41 insertions(+), 24 deletions(-) diff --git a/vg_audio.c b/vg_audio.c index 2734c7d..41f9136 100644 --- a/vg_audio.c +++ b/vg_audio.c @@ -70,6 +70,8 @@ static void vg_audio_assert_lock(void) */ void audio_clip_load( audio_clip *clip, vg_stack_allocator *stack ) { + THREAD_1; + if( stack == NULL ) stack = _vg_audio.permanent_stack; @@ -495,7 +497,12 @@ void vg_audio_fadeout_flagged_audio( u32 flag, f32 length ) { struct audio_channel_controls *controls = get_audio_channel_controls( id ); if( controls->flags & flag ) - vg_audio_crossfade( id, NULL, 1.0f ); + { + if( _vg_audio.working ) + vg_audio_crossfade( id, NULL, 1.0f ); + else + channel->stage = k_channel_stage_none; + } } } } @@ -1448,9 +1455,11 @@ void vg_audio_device_init(void) { SDL_PauseAudioDevice( _vg_audio.sdl_output_device, 0 ); vg_success( "Unpaused device %d.\n", _vg_audio.sdl_output_device ); + _vg_audio.working = 1; } else { + _vg_audio.working = 0; vg_error( "SDL_OpenAudioDevice failed. Your default audio device must support (or transcode from):\n" " Sample rate: 44100 hz\n" @@ -1490,5 +1499,16 @@ void vg_audio_begin(void) void vg_audio_free(void) { SDL_CloseAudioDevice( _vg_audio.sdl_output_device ); + _vg_audio.sdl_output_device = 0; } +void vg_audio_preupdate(void) +{ + bool before_working = _vg_audio.working; + _vg_audio.working = 1; + if( _vg_audio.sdl_output_device == 0 ) + _vg_audio.working = 0; + else + if( SDL_GetAudioDeviceStatus( _vg_audio.sdl_output_device ) == SDL_AUDIO_STOPPED ) + _vg_audio.working = 0; +} diff --git a/vg_audio.h b/vg_audio.h index d7a11db..8be4c69 100644 --- a/vg_audio.h +++ b/vg_audio.h @@ -60,7 +60,8 @@ enum channel_stage { k_channel_stage_none = 0, k_channel_stage_allocation, - k_channel_stage_active + k_channel_stage_active, + k_channel_stage_orphan }; enum channel_activity @@ -213,6 +214,8 @@ struct vg_audio f32 master_volume_ui; i32 dsp_enabled_ui; + + bool working; } extern _vg_audio; @@ -227,6 +230,7 @@ void audio_clip_loadn( audio_clip *arr, int count, vg_stack_allocator *stack ); void vg_audio_lock(void); void vg_audio_unlock(void); +void vg_audio_preupdate(void); /* channel API */ audio_channel_id vg_audio_get_first_idle_channel(void); diff --git a/vg_engine.c b/vg_engine.c index 64b5c96..22e02b7 100644 --- a/vg_engine.c +++ b/vg_engine.c @@ -417,6 +417,7 @@ static void _vg_gameloop(void) continue; vg_changevsync(); + vg_audio_preupdate(); enum engine_status status = SDL_AtomicGet( &vg.engine_status ); if( status == k_engine_status_running ) @@ -697,9 +698,9 @@ void vg_init( int argc, const char *argv[], const char *window_name ) _vg_tower_register_trigger( _vg_tower_mask( vg.sig_client ), vg_on_client_ready ); if( !vg_init_async_queue( &vg.main_tasks ) ) - return; + vg_fatal_error( "Failed to create main task queue\n" ); if( !vg_init_async_queue( &vg.loader_tasks ) ) - return; + vg_fatal_error( "Failed to create loader task queue\n" ); vg_rand_seed( &vg.rand, 461 ); } @@ -1083,6 +1084,7 @@ static void vg_settings_audio_apply(void) { vg_info( "Closing audio device %d\n", _vg_audio.sdl_output_device ); SDL_CloseAudioDevice( _vg_audio.sdl_output_device ); + _vg_audio.sdl_output_device = 0; } vg_strfree( &_vg_audio.device_choice ); @@ -1107,7 +1109,7 @@ static void vg_settings_audio_apply(void) } } - vg_strnull( &_vg_audio.device_choice, NULL, -1 ); + vg_strnull( &_vg_audio.device_choice, NULL, 0 ); vg_strcat( &_vg_audio.device_choice, oi->alias ); } diff --git a/vg_ui/imgui_impl_opengl.c b/vg_ui/imgui_impl_opengl.c index 19fd769..69d1187 100644 --- a/vg_ui/imgui_impl_opengl.c +++ b/vg_ui/imgui_impl_opengl.c @@ -466,9 +466,7 @@ void vg_ui_init(void) vg_compile_shader( &_shader_ui_image_grad ); u32 verts = 30000, indices = 20000; - ui_init( &vg_ui.ctx, - malloc( sizeof(ui_vert)*verts ), verts, - malloc( sizeof(u16)*indices ), indices ); + ui_init( &vg_ui.ctx, malloc( sizeof(ui_vert)*verts ), verts, malloc( sizeof(u16)*indices ), indices ); /* callbacks */ vg_ui.ctx.render_batch = ui_impl_render_batch; @@ -490,33 +488,26 @@ void vg_ui_init(void) glBufferData( GL_ARRAY_BUFFER, verts*sizeof(ui_vert), NULL, GL_DYNAMIC_DRAW ); glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, vg_ui.ebo ); - glBufferData( GL_ELEMENT_ARRAY_BUFFER, - indices*sizeof(u16), NULL, GL_DYNAMIC_DRAW ); + glBufferData( GL_ELEMENT_ARRAY_BUFFER, indices*sizeof(u16), NULL, GL_DYNAMIC_DRAW ); /* Set pointers */ u32 const stride = sizeof(ui_vert); /* XY */ - glVertexAttribPointer( 0, 2, GL_SHORT, GL_FALSE, stride, - (void *)offsetof( ui_vert, co ) ); + glVertexAttribPointer( 0, 2, GL_SHORT, GL_FALSE, stride, (void *)offsetof( ui_vert, co ) ); glEnableVertexAttribArray( 0 ); /* UV */ - glVertexAttribPointer( 1, 2, GL_UNSIGNED_SHORT, GL_FALSE, stride, - (void *)offsetof( ui_vert, uv ) ); + glVertexAttribPointer( 1, 2, GL_UNSIGNED_SHORT, GL_FALSE, stride, (void *)offsetof( ui_vert, uv ) ); glEnableVertexAttribArray( 1 ); /* COLOUR */ - glVertexAttribPointer( 2, 4, GL_UNSIGNED_BYTE, GL_TRUE, stride, - (void *)offsetof( ui_vert, colour ) ); + glVertexAttribPointer( 2, 4, GL_UNSIGNED_BYTE, GL_TRUE, stride, (void *)offsetof( ui_vert, colour ) ); glEnableVertexAttribArray( 2 ); - vg_ui.cursor_map[ k_ui_cursor_default ] = - SDL_CreateSystemCursor( SDL_SYSTEM_CURSOR_ARROW ); - vg_ui.cursor_map[ k_ui_cursor_hand ] = - SDL_CreateSystemCursor( SDL_SYSTEM_CURSOR_HAND ); - vg_ui.cursor_map[ k_ui_cursor_ibeam ] = - SDL_CreateSystemCursor( SDL_SYSTEM_CURSOR_IBEAM ); + vg_ui.cursor_map[ k_ui_cursor_default ] = SDL_CreateSystemCursor( SDL_SYSTEM_CURSOR_ARROW ); + vg_ui.cursor_map[ k_ui_cursor_hand ] = SDL_CreateSystemCursor( SDL_SYSTEM_CURSOR_HAND ); + vg_ui.cursor_map[ k_ui_cursor_ibeam ] = SDL_CreateSystemCursor( SDL_SYSTEM_CURSOR_IBEAM ); /* font * ----------------------------------------------------- @@ -529,6 +520,7 @@ void vg_ui_init(void) total = sheet->w*sheet->h, data = 0; + /* This is fince since its before the load thread even starts */ vg_stack_clear( &vg.scratch ); u8 *image = vg_stack_allocate( &vg.scratch, total, 8, NULL ); @@ -552,8 +544,7 @@ void vg_ui_init(void) glGenTextures( 1, &vg_ui.tex_glyphs ); glBindTexture( GL_TEXTURE_2D, vg_ui.tex_glyphs ); - glTexImage2D( GL_TEXTURE_2D, 0, GL_R8, sheet->w, sheet->h, 0, - GL_RED, GL_UNSIGNED_BYTE, image ); + glTexImage2D( GL_TEXTURE_2D, 0, GL_R8, sheet->w, sheet->h, 0, GL_RED, GL_UNSIGNED_BYTE, image ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); -- 2.25.1