1 /* Copyright (C) 2021-2024 Harry Godden (hgn) - All Rights Reserved */
5 #include "vg_platform.h"
10 #define AUDIO_FRAME_SIZE 512
11 #define AUDIO_MIX_FRAME_SIZE 256
13 #define AUDIO_CHANNELS 32
15 #define AUDIO_FILTERS 16
16 #define AUDIO_FLAG_LOOP 0x1
17 #define AUDIO_FLAG_NO_DOPPLER 0x2
18 #define AUDIO_FLAG_SPACIAL_3D 0x4
19 #define AUDIO_FLAG_AUTO_START 0x8
20 #define AUDIO_FLAG_NO_DSP 0x10
21 #define AUDIO_FLAG_FORMAT 0x1E00
25 k_audio_format_mono
= 0x000u
,
26 k_audio_format_stereo
= 0x200u
,
27 k_audio_format_vorbis
= 0x400u
,
28 k_audio_format_none0
= 0x600u
,
29 k_audio_format_none1
= 0x800u
,
30 k_audio_format_none2
= 0xA00u
,
31 k_audio_format_none3
= 0xC00u
,
32 k_audio_format_none4
= 0xE00u
,
34 k_audio_format_bird
= 0x1000u
,
35 k_audio_format_gen
= 0x1200u
,
36 k_audio_format_none6
= 0x1400u
,
37 k_audio_format_none7
= 0x1600u
,
38 k_audio_format_none8
= 0x1800u
,
39 k_audio_format_none9
= 0x1A00u
,
40 k_audio_format_none10
= 0x1C00u
,
41 k_audio_format_none11
= 0x1E00u
,
44 #define AUDIO_DECODE_SIZE (1024*256) /* 256 kb decoding buffers */
45 #define AUDIO_MUTE_VOLUME 0.0f
46 #define AUDIO_BASE_VOLUME 1.0f
48 typedef struct audio_clip audio_clip
;
49 typedef struct audio_channel audio_channel
;
50 typedef struct audio_lfo audio_lfo
;
59 u64 _p64_
; /* force width to be 64 because we save this structure on
60 disk in Skaterift yay */
74 struct vg_audio_system
76 SDL_AudioDeviceID sdl_output_device
;
77 vg_str device_choice
; /* buffer is null? use default from OS */
79 bool always_keep_compressed
;
88 SDL_SpinLock sl_checker
,
92 u32 time
, time_startframe
;
93 float sqrt_polynomial_coefficient
;
100 k_lfo_polynomial_bipolar
105 float polynomial_coefficient
;
108 u32 editble_state_write_mask
;
110 oscillators
[ AUDIO_LFOS
];
112 struct audio_channel
{
117 char name
[32]; /* only editable while allocated == 0 */
118 audio_clip
*source
; /* ... */
120 u32 colour
; /* ... */
122 /* internal non-readable state
123 * -----------------------------*/
124 u32 cursor
, source_length
;
126 float volume_movement_start
,
133 struct synth_bird
*bird
;
138 stb_vorbis_alloc vorbis_alloc
;
140 enum channel_activity
{
141 k_channel_activity_reset
, /* will advance if allocated==1, to wake */
142 k_channel_activity_wake
, /* will advance to either of next two */
143 k_channel_activity_alive
,
144 k_channel_activity_end
,
145 k_channel_activity_error
151 * editable structure, can be modified inside _lock and _unlock
152 * the edit mask tells which to copy into internal _, or to discard
153 * ----------------------------------------------------------------------
155 struct channel_state
{
158 float volume
, /* current volume */
159 volume_target
, /* target volume */
167 v4f spacial_falloff
; /* xyz, range */
173 u32 editble_state_write_mask
;
175 channels
[ AUDIO_CHANNELS
];
180 v3f internal_listener_pos
,
181 internal_listener_ears
,
182 internal_listener_velocity
,
184 external_listener_pos
,
185 external_listener_ears
,
186 external_lister_velocity
;
188 float internal_global_volume
,
189 external_global_volume
;
193 void audio_clip_load( audio_clip
*clip
, void *lin_alloc
);
194 void audio_clip_loadn( audio_clip
*arr
, int count
, void *lin_alloc
);
196 void vg_audio_register(void);
197 void vg_audio_device_init(void);
198 void vg_audio_init(void);
199 void vg_audio_free(void);
201 void audio_lock(void);
202 void audio_unlock(void);
204 void audio_channel_init( audio_channel
*ch
, audio_clip
*clip
, u32 flags
);
205 void audio_channel_group( audio_channel
*ch
, u16 group
);
206 void audio_channel_world( audio_channel
*ch
, u8 world_id
);
207 audio_channel
*audio_get_first_idle_channel(void);
208 audio_channel
*audio_get_group_idle_channel( u16 group
, u32 max_count
);
209 audio_channel
*audio_get_group_first_active_channel( u16 group
);
210 int audio_channel_finished( audio_channel
*ch
);
211 audio_channel
*audio_relinquish_channel( audio_channel
*ch
);
212 void audio_channel_slope_volume( audio_channel
*ch
, f32 length
, f32 new_vol
);
213 void audio_channel_set_sampling_rate( audio_channel
*ch
, float rate
);
214 void audio_channel_edit_volume( audio_channel
*ch
, f32 new_vol
, int instant
);
215 audio_channel
*audio_channel_fadeout( audio_channel
*ch
, float length
);
216 void audio_channel_fadein( audio_channel
*ch
, float length
);
217 audio_channel
*audio_channel_crossfade( audio_channel
*ch
,
218 audio_clip
*new_clip
,
219 float length
, u32 flags
);
220 void audio_channel_sidechain_lfo( audio_channel
*ch
, int lfo_id
, f32 amount
);
221 void audio_channel_set_spacial( audio_channel
*ch
, v3f co
, float range
);
222 int audio_oneshot_3d( audio_clip
*clip
, v3f position
, f32 range
, f32 volume
);
223 int audio_oneshot( audio_clip
*clip
, f32 volume
, f32 pan
);
224 void audio_set_lfo_wave( int id
, enum lfo_wave_type type
, f32 coefficient
);
225 void audio_set_lfo_frequency( int id
, float freq
);
226 int audio_channel_load_source( audio_channel
*ch
);