X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=vg_audio.h;h=0290e85fb9777a3151239f8eef38d6896997b01c;hb=fce86711735b15bff37de0f70716808410fcf269;hp=cef461787ab0a44754e95f6f5ba97e3c6ca8a4c5;hpb=de04c42142cd3fc01817f7e1913cf6d6c8050e57;p=vg.git diff --git a/vg_audio.h b/vg_audio.h index cef4617..0290e85 100644 --- a/vg_audio.h +++ b/vg_audio.h @@ -61,7 +61,7 @@ enum audio_format k_audio_format_none4 = 0xE00u, k_audio_format_bird = 0x1000u, - k_audio_format_none5 = 0x1200u, + k_audio_format_gen = 0x1200u, k_audio_format_none6 = 0x1400u, k_audio_format_none7 = 0x1600u, k_audio_format_none8 = 0x1800u, @@ -82,6 +82,7 @@ struct audio_clip{ union { /* TODO oof.. */ u64 _p64_; const char *path; + void *func; }; u32 flags; @@ -95,6 +96,7 @@ struct audio_clip{ struct vg_audio_system{ SDL_AudioDeviceID sdl_output_device; + vg_str device_choice; /* buffer is null? use default from OS */ void *audio_pool, *decode_buffer; @@ -191,7 +193,7 @@ struct vg_audio_system{ } channels[ AUDIO_CHANNELS ]; - int debug_ui, debug_ui_3d, debug_dsp; + int debug_ui, debug_ui_3d, debug_dsp, dsp_enabled; v3f internal_listener_pos, internal_listener_ears, @@ -204,7 +206,7 @@ struct vg_audio_system{ float internal_global_volume, external_global_volume; } -static vg_audio = { .external_global_volume = 1.0f }; +static vg_audio = { .external_global_volume = 1.0f, .dsp_enabled = 1 }; #include "vg/vg_audio_dsp.h" @@ -259,30 +261,9 @@ static void audio_unlock(void) audio_lock_checker_store(0); SDL_AtomicUnlock( &vg_audio.sl_sync ); } - static void audio_mixer_callback( void *user, u8 *stream, int frame_count ); -static void vg_audio_init(void) -{ - /* TODO: Move here? */ - vg_console_reg_var( "debug_audio", &vg_audio.debug_ui, - k_var_dtype_i32, VG_VAR_CHEAT ); - vg_console_reg_var( "debug_dsp", &vg_audio.debug_dsp, - k_var_dtype_i32, VG_VAR_CHEAT ); - vg_console_reg_var( "volume", &vg_audio.external_global_volume, - k_var_dtype_f32, VG_VAR_PERSISTENT ); - - /* allocate memory */ - /* 32mb fixed */ - vg_audio.audio_pool = - vg_create_linear_allocator( vg_mem.rtmemory, 1024*1024*32, - VG_MEMORY_SYSTEM ); - - /* fixed */ - u32 decode_size = AUDIO_DECODE_SIZE * AUDIO_CHANNELS; - vg_audio.decode_buffer = vg_linear_alloc( vg_mem.rtmemory, decode_size ); - - vg_dsp_init(); +static void vg_audio_device_init(void){ SDL_AudioSpec spec_desired, spec_got; spec_desired.callback = audio_mixer_callback; spec_desired.channels = 2; @@ -295,13 +276,20 @@ static void vg_audio_init(void) spec_desired.userdata = NULL; vg_audio.sdl_output_device = - SDL_OpenAudioDevice( NULL, 0, &spec_desired, &spec_got,0 ); + SDL_OpenAudioDevice( vg_audio.device_choice.buffer, 0, + &spec_desired, &spec_got,0 ); + + vg_info( "Start audio device (%u, F32, %u) @%s\n", + spec_desired.freq, + AUDIO_FRAME_SIZE, + vg_audio.device_choice.buffer ); if( vg_audio.sdl_output_device ){ SDL_PauseAudioDevice( vg_audio.sdl_output_device, 0 ); + vg_success( "Unpaused device %d.\n", vg_audio.sdl_output_device ); } else{ - vg_fatal_error( + vg_error( "SDL_OpenAudioDevice failed. Your default audio device must support:\n" " Frequency: 44100 hz\n" " Buffer size: 512\n" @@ -310,6 +298,34 @@ static void vg_audio_init(void) } } +static void vg_audio_register(void){ + vg_console_reg_var( "debug_audio", &vg_audio.debug_ui, + k_var_dtype_i32, VG_VAR_CHEAT ); + vg_console_reg_var( "debug_dsp", &vg_audio.debug_dsp, + k_var_dtype_i32, VG_VAR_CHEAT ); + vg_console_reg_var( "volume", &vg_audio.external_global_volume, + k_var_dtype_f32, VG_VAR_PERSISTENT ); + vg_console_reg_var( "vg_audio_device", &vg_audio.device_choice, + k_var_dtype_str, VG_VAR_PERSISTENT ); + vg_console_reg_var( "vg_dsp", &vg_audio.dsp_enabled, + k_var_dtype_i32, VG_VAR_PERSISTENT ); +} + +static void vg_audio_init(void){ + /* allocate memory */ + /* 32mb fixed */ + vg_audio.audio_pool = + vg_create_linear_allocator( vg_mem.rtmemory, 1024*1024*32, + VG_MEMORY_SYSTEM ); + + /* fixed */ + u32 decode_size = AUDIO_DECODE_SIZE * AUDIO_CHANNELS; + vg_audio.decode_buffer = vg_linear_alloc( vg_mem.rtmemory, decode_size ); + + vg_dsp_init(); + vg_audio_device_init(); +} + static void vg_audio_free(void) { vg_dsp_free(); @@ -329,8 +345,8 @@ static void vg_audio_free(void) #define AUDIO_EDIT_OWNERSHIP 0x40 #define AUDIO_EDIT_SAMPLING_RATE 0x80 -static void audio_channel_init( audio_channel *ch, audio_clip *clip, u32 flags ) -{ +static void audio_channel_init( audio_channel *ch, audio_clip *clip, + u32 flags ){ audio_require_lock(); ch->group = 0; ch->world_id = 0; @@ -340,6 +356,8 @@ static void audio_channel_init( audio_channel *ch, audio_clip *clip, u32 flags ) if( (ch->source->flags & AUDIO_FLAG_FORMAT) == k_audio_format_bird ) strcpy( ch->name, "[array]" ); + else if( (ch->source->flags & AUDIO_FLAG_FORMAT) == k_audio_format_gen ) + strcpy( ch->name, "[program]" ); else vg_strncpy( clip->path, ch->name, 32, k_strncpy_always_add_null ); @@ -636,6 +654,9 @@ static int audio_channel_load_source( audio_channel *ch ) else if( format == k_audio_format_stereo ){ ch->source_length = ch->source->size / 2; } + else if( format == k_audio_format_gen ){ + ch->source_length = 0xffffffff; + } else{ ch->source_length = ch->source->size; } @@ -798,6 +819,10 @@ static void audio_channel_get_samples( audio_channel *ch, else if( format == k_audio_format_bird ){ synth_bird_generate_samples( ch->bird_handle, dst, samples_this_run ); } + else if( format == k_audio_format_gen ){ + void (*fn)( void *data, f32 *buf, u32 count ) = ch->source->func; + fn( ch->source->data, dst, samples_this_run ); + } else{ i16 *src_buffer = ch->source->data, *src = &src_buffer[ch->cursor]; @@ -955,12 +980,12 @@ static void audio_channel_mix( audio_channel *ch, float *buffer ) vg_profile_end( &_vg_prof_audio_mix ); } -static void audio_mixer_callback( void *user, u8 *stream, int byte_count ) -{ +static void audio_mixer_callback( void *user, u8 *stream, int byte_count ){ /* * Copy data and move edit flags to commit flags * ------------------------------------------------------------- */ audio_lock(); + int use_dsp = vg_audio.dsp_enabled; v3_copy( vg_audio.external_listener_pos, vg_audio.internal_listener_pos ); v3_copy( vg_audio.external_listener_ears, vg_audio.internal_listener_ears ); @@ -1140,12 +1165,12 @@ static void audio_mixer_callback( void *user, u8 *stream, int byte_count ) } } - vg_profile_begin( &_vg_prof_dsp ); - - for( int i=0; iflags & AUDIO_FLAG_FORMAT) != k_audio_format_bird ){ + clip->flags &= ~AUDIO_FLAG_FORMAT; + clip->flags |= k_audio_format_vorbis; + } + +#endif + /* load in directly */ u32 format = clip->flags & AUDIO_FLAG_FORMAT; @@ -1293,8 +1327,15 @@ static void audio_require_clip_loaded( audio_clip *clip ) * Debugging */ -static void audio_debug_ui( m4x4f mtx_pv ) -{ +static void audio_debug_ui( + +#ifdef VG_3D + m4x4f +#else + m3x3f +#endif + mtx_pv ){ + if( !vg_audio.debug_ui ) return; @@ -1315,7 +1356,7 @@ static void audio_debug_ui( m4x4f mtx_pv ) &vg_prof_audio_mix, &vg_prof_audio_dsp}, 3, budget, (ui_rect){ 4, VG_PROFILE_SAMPLE_COUNT*2 + 8, - 512, 0 }, 3 ); + 512, 0 }, 0, 0 ); char perf[128]; @@ -1393,6 +1434,7 @@ static void audio_debug_ui( m4x4f mtx_pv ) ui_fill( row, 0xa0000000 | ch->colour ); ui_text( row, perf, 1, k_ui_align_middle_left, 0 ); +#ifdef VG_3D if( AUDIO_FLAG_SPACIAL_3D ){ v4f wpos; v3_copy( ch->editable_state.spacial_falloff, wpos ); @@ -1432,6 +1474,7 @@ static void audio_debug_ui( m4x4f mtx_pv ) rect_copy( wr, overlap_buffer[ overlap_length ++ ] ); } } +#endif } audio_unlock();