X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=vg_audio.h;h=0290e85fb9777a3151239f8eef38d6896997b01c;hb=fce86711735b15bff37de0f70716808410fcf269;hp=39f494ffa0b843e501c28aaab94db4cfa7dd443e;hpb=76d234b7dc5e6500e8a54009b367e7620f11ef97;p=vg.git diff --git a/vg_audio.h b/vg_audio.h index 39f494f..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,9 @@ 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; ch->source = clip; @@ -339,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 ); @@ -360,17 +379,20 @@ static void audio_channel_init( audio_channel *ch, audio_clip *clip, u32 flags ) static void audio_channel_group( audio_channel *ch, u16 group ) { + audio_require_lock(); ch->group = group; ch->colour = (((u32)group * 29986577) & 0x00ffffff) | 0xff000000; } static void audio_channel_world( audio_channel *ch, u8 world_id ) { + audio_require_lock(); ch->world_id = world_id; } static audio_channel *audio_get_first_idle_channel(void) { + audio_require_lock(); for( int i=0; iallocated && (ch->group == group) ) @@ -420,6 +444,7 @@ static audio_channel *audio_get_group_first_active_channel( u16 group ) static int audio_channel_finished( audio_channel *ch ) { + audio_require_lock(); if( ch->readable_activity == k_channel_activity_end ) return 1; else @@ -428,6 +453,7 @@ static int audio_channel_finished( audio_channel *ch ) static audio_channel *audio_relinquish_channel( audio_channel *ch ) { + audio_require_lock(); ch->editable_state.relinquished = 1; ch->editble_state_write_mask |= AUDIO_EDIT_OWNERSHIP; return NULL; @@ -436,6 +462,7 @@ static audio_channel *audio_relinquish_channel( audio_channel *ch ) static void audio_channel_slope_volume( audio_channel *ch, float length, float new_volume ) { + audio_require_lock(); ch->editable_state.volume_target = new_volume; ch->editable_state.volume_rate = length * 44100.0f; ch->editble_state_write_mask |= AUDIO_EDIT_VOLUME_SLOPE; @@ -443,6 +470,7 @@ static void audio_channel_slope_volume( audio_channel *ch, float length, static void audio_channel_set_sampling_rate( audio_channel *ch, float rate ) { + audio_require_lock(); ch->editable_state.sampling_rate = rate; ch->editble_state_write_mask |= AUDIO_EDIT_SAMPLING_RATE; } @@ -450,6 +478,7 @@ static void audio_channel_set_sampling_rate( audio_channel *ch, float rate ) static void audio_channel_edit_volume( audio_channel *ch, float new_volume, int instant ) { + audio_require_lock(); if( instant ){ ch->editable_state.volume = new_volume; ch->editble_state_write_mask |= AUDIO_EDIT_VOLUME; @@ -461,12 +490,14 @@ static void audio_channel_edit_volume( audio_channel *ch, static audio_channel *audio_channel_fadeout( audio_channel *ch, float length ) { + audio_require_lock(); audio_channel_slope_volume( ch, length, 0.0f ); return audio_relinquish_channel( ch ); } static void audio_channel_fadein( audio_channel *ch, float length ) { + audio_require_lock(); audio_channel_edit_volume( ch, 0.0f, 1 ); audio_channel_slope_volume( ch, length, 1.0f ); } @@ -475,6 +506,7 @@ static audio_channel *audio_channel_crossfade( audio_channel *ch, audio_clip *new_clip, float length, u32 flags ) { + audio_require_lock(); u32 cursor = 0; if( ch ) @@ -493,6 +525,7 @@ static audio_channel *audio_channel_crossfade( audio_channel *ch, static void audio_channel_sidechain_lfo( audio_channel *ch, int lfo_id, float amount ) { + audio_require_lock(); ch->editable_state.lfo = &vg_audio.oscillators[ lfo_id ]; ch->editable_state.lfo_amount = amount; ch->editble_state_write_mask |= AUDIO_EDIT_LFO_ATTACHMENT; @@ -500,6 +533,7 @@ static void audio_channel_sidechain_lfo( audio_channel *ch, int lfo_id, static void audio_channel_set_spacial( audio_channel *ch, v3f co, float range ) { + audio_require_lock(); if( ch->flags & AUDIO_FLAG_SPACIAL_3D ){ v3_copy( co, ch->editable_state.spacial_falloff ); @@ -519,6 +553,7 @@ static void audio_channel_set_spacial( audio_channel *ch, v3f co, float range ) static int audio_oneshot_3d( audio_clip *clip, v3f position, float range, float volume ) { + audio_require_lock(); audio_channel *ch = audio_get_first_idle_channel(); if( ch ){ @@ -535,6 +570,7 @@ static int audio_oneshot_3d( audio_clip *clip, v3f position, static int audio_oneshot( audio_clip *clip, float volume, float pan ) { + audio_require_lock(); audio_channel *ch = audio_get_first_idle_channel(); if( ch ){ @@ -551,6 +587,7 @@ static int audio_oneshot( audio_clip *clip, float volume, float pan ) static void audio_set_lfo_wave( int id, enum lfo_wave_type type, float coefficient ) { + audio_require_lock(); audio_lfo *lfo = &vg_audio.oscillators[ id ]; lfo->editable_state.polynomial_coefficient = coefficient; lfo->editable_state.wave_type = type; @@ -560,6 +597,7 @@ static void audio_set_lfo_wave( int id, enum lfo_wave_type type, static void audio_set_lfo_frequency( int id, float freq ) { + audio_require_lock(); audio_lfo *lfo = &vg_audio.oscillators[ id ]; lfo->editable_state.period = 44100.0f / freq; lfo->editble_state_write_mask |= AUDIO_EDIT_LFO_PERIOD; @@ -616,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; } @@ -778,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]; @@ -935,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 ); @@ -1120,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; @@ -1273,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; @@ -1295,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]; @@ -1373,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 ); @@ -1412,6 +1474,7 @@ static void audio_debug_ui( m4x4f mtx_pv ) rect_copy( wr, overlap_buffer[ overlap_length ++ ] ); } } +#endif } audio_unlock();