+ vg_convar_push( (struct vg_convar){
+ .name = "debug_audio",
+ .data = &vg_audio.debug_ui,
+ .data_type = k_convar_dtype_i32,
+ .opt_i32 = { .min=0, .max=1, .clamp=1 },
+ .persistent = 1
+ });
+
+ u32 decode_region = AUDIO_DECODE_SIZE * SFX_MAX_SYSTEMS;
+ vg_audio.mem_total = 1024*1024*32;
+ vg_audio.mem_current = 0;
+ vg_audio.mem = malloc( vg_audio.mem_total + decode_region );
+ vg_audio.decode_mem = &((u8 *)vg_audio.mem)[vg_audio.mem_total];
+
+ /* setup pool */
+ vg_audio.active_pool_info.base = vg_audio.active_players;
+ vg_audio.active_pool_info.offset = offsetof(struct active_audio_player,
+ pool_node );
+ vg_audio.active_pool_info.stride = sizeof(struct active_audio_player);
+ vg_audio.active_pool_info.p_cmp = NULL;
+ aatree_init_pool( &vg_audio.active_pool_info, SFX_MAX_SYSTEMS );
+
+ ma_device_config *dconf = &vg_audio.miniaudio_dconfig;
+ ma_device *device = &vg_audio.miniaudio_device;
+
+ *dconf = ma_device_config_init( ma_device_type_playback );
+ dconf->playback.format = ma_format_f32;
+ dconf->playback.channels = 2;
+ dconf->sampleRate = 44100;
+ dconf->dataCallback = audio_mixer_callback;
+
+ dconf->pUserData = NULL;
+
+ vg_info( "Starting audio engine\n" );
+
+ if( ma_device_init( NULL, dconf, device) != MA_SUCCESS )
+ {
+ vg_error( "ma_device failed to initialize" );
+ return 0;
+ }
+ else
+ {
+ if( ma_device_start( device ) != MA_SUCCESS )
+ {
+ ma_device_uninit( device );
+ vg_error( "ma_device failed to start" );
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+static void vg_audio_free(void)
+{
+ ma_device *device = &vg_audio.miniaudio_device;
+ ma_device_uninit( device );
+
+ free( vg_audio.mem );