bad char
[vg.git] / vg_audio.h
1 /* Copyright (C) 2021-2024 Harry Godden (hgn) - All Rights Reserved */
2
3 #pragma once
4
5 #include "vg_platform.h"
6 #include "vg_engine.h"
7 #include "vg_string.h"
8 #include "vg_vorbis.h"
9
10 #define AUDIO_FRAME_SIZE 512
11 #define AUDIO_MIX_FRAME_SIZE 256
12
13 #define AUDIO_CHANNELS 32
14 #define AUDIO_LFOS 8
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
22
23 enum audio_format
24 {
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,
33
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,
42 };
43
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
47
48 typedef struct audio_clip audio_clip;
49 typedef struct audio_channel audio_channel;
50 typedef struct audio_lfo audio_lfo;
51
52 struct audio_clip
53 {
54 union { /* TODO oof.. */
55 u64 _p64_;
56 const char *path;
57 void *func;
58 };
59
60 u32 flags;
61 u32 size;
62
63 union{
64 u64 _p64;
65 void *data;
66 };
67 };
68
69 struct vg_audio_system
70 {
71 SDL_AudioDeviceID sdl_output_device;
72 vg_str device_choice; /* buffer is null? use default from OS */
73
74 bool always_keep_compressed;
75
76 void *audio_pool,
77 *decode_buffer;
78 u32 samples_last;
79
80 /* synchro */
81 int sync_locked;
82
83 SDL_SpinLock sl_checker,
84 sl_sync;
85
86 struct audio_lfo{
87 u32 time, time_startframe;
88 float sqrt_polynomial_coefficient;
89
90 struct{
91 enum lfo_wave_type{
92 k_lfo_triangle,
93 k_lfo_square,
94 k_lfo_saw,
95 k_lfo_polynomial_bipolar
96 }
97 wave_type;
98
99 u32 period;
100 float polynomial_coefficient;
101 }
102 _, editable_state;
103 u32 editble_state_write_mask;
104 }
105 oscillators[ AUDIO_LFOS ];
106
107 struct audio_channel{
108 int allocated;
109 u16 group;
110 u8 world_id;
111
112 char name[32]; /* only editable while allocated == 0 */
113 audio_clip *source; /* ... */
114 u32 flags; /* ... */
115 u32 colour; /* ... */
116
117 /* internal non-readable state
118 * -----------------------------*/
119 u32 cursor, source_length;
120
121 float volume_movement_start,
122 pan_movement_start;
123
124 u32 volume_movement,
125 pan_movement;
126
127 union{
128 struct synth_bird *bird;
129 stb_vorbis *vorbis;
130 }
131 handle;
132
133 stb_vorbis_alloc vorbis_alloc;
134
135 enum channel_activity{
136 k_channel_activity_reset, /* will advance if allocated==1, to wake */
137 k_channel_activity_wake, /* will advance to either of next two */
138 k_channel_activity_alive,
139 k_channel_activity_end,
140 k_channel_activity_error
141 }
142 activity,
143 readable_activity;
144
145 /*
146 * editable structure, can be modified inside _lock and _unlock
147 * the edit mask tells which to copy into internal _, or to discard
148 * ----------------------------------------------------------------------
149 */
150 struct channel_state{
151 int relinquished;
152
153 float volume, /* current volume */
154 volume_target, /* target volume */
155 pan,
156 pan_target,
157 sampling_rate;
158
159 u32 volume_rate,
160 pan_rate;
161
162 v4f spacial_falloff; /* xyz, range */
163
164 audio_lfo *lfo;
165 float lfo_amount;
166 }
167 _, editable_state;
168 u32 editble_state_write_mask;
169 }
170 channels[ AUDIO_CHANNELS ];
171
172 int debug_ui, debug_ui_3d, debug_dsp, dsp_enabled;
173
174 v3f internal_listener_pos,
175 internal_listener_ears,
176 internal_listener_velocity,
177
178 external_listener_pos,
179 external_listener_ears,
180 external_lister_velocity;
181
182 float internal_global_volume,
183 external_global_volume;
184 }
185 extern vg_audio;
186
187 void audio_clip_load( audio_clip *clip, void *lin_alloc );
188 void audio_clip_loadn( audio_clip *arr, int count, void *lin_alloc );
189
190 void vg_audio_register(void);
191 void vg_audio_device_init(void);
192 void vg_audio_init(void);
193 void vg_audio_free(void);
194
195 void audio_lock(void);
196 void audio_unlock(void);
197
198 void audio_channel_init( audio_channel *ch, audio_clip *clip, u32 flags );
199 void audio_channel_group( audio_channel *ch, u16 group );
200 void audio_channel_world( audio_channel *ch, u8 world_id );
201 audio_channel *audio_get_first_idle_channel(void);
202 audio_channel *audio_get_group_idle_channel( u16 group, u32 max_count );
203 audio_channel *audio_get_group_first_active_channel( u16 group );
204 int audio_channel_finished( audio_channel *ch );
205 audio_channel *audio_relinquish_channel( audio_channel *ch );
206 void audio_channel_slope_volume( audio_channel *ch, f32 length, f32 new_vol );
207 void audio_channel_set_sampling_rate( audio_channel *ch, float rate );
208 void audio_channel_edit_volume( audio_channel *ch, f32 new_vol, int instant );
209 audio_channel *audio_channel_fadeout( audio_channel *ch, float length );
210 void audio_channel_fadein( audio_channel *ch, float length );
211 audio_channel *audio_channel_crossfade( audio_channel *ch,
212 audio_clip *new_clip,
213 float length, u32 flags );
214 void audio_channel_sidechain_lfo( audio_channel *ch, int lfo_id, f32 amount );
215 void audio_channel_set_spacial( audio_channel *ch, v3f co, float range );
216 int audio_oneshot_3d( audio_clip *clip, v3f position, f32 range, f32 volume );
217 int audio_oneshot( audio_clip *clip, f32 volume, f32 pan );
218 void audio_set_lfo_wave( int id, enum lfo_wave_type type, f32 coefficient );
219 void audio_set_lfo_frequency( int id, float freq );
220 int audio_channel_load_source( audio_channel *ch );
221
222 void audio_debug_ui(
223
224 #ifdef VG_3D
225 m4x4f
226 #else
227 m3x3f
228 #endif
229 mtx_pv );