Dont remember
authorhgn <hgodden00@gmail.com>
Sat, 5 Jul 2025 19:44:45 +0000 (20:44 +0100)
committerhgn <hgodden00@gmail.com>
Sat, 5 Jul 2025 19:44:45 +0000 (20:44 +0100)
vg_audio.c
vg_audio.h
vg_engine.c
vg_ui/imgui_impl_opengl.c

index 2734c7de5a59609d174d0cc7abb3e43bc5431f62..41f913614d31d9ca6f20345baf17b4c5ecccfdb6 100644 (file)
@@ -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;
+}
index d7a11db92464caf821ff5a70ac7ab086ca4ce752..8be4c690c0e38d0fb695c6e96aa85ff05cc8187c 100644 (file)
@@ -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);
index 64b5c96992b9b15bb530877076e0ad5e2fbc37ed..22e02b796e380940f29d014b654e75f534c18356 100644 (file)
@@ -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 );
       }
 
index 19fd7694853a3de69ab8338db8fd9c6bc3f7217a..69d1187fa5c30db6acc0d6b90191d09c34069a7f 100644 (file)
@@ -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 );