preliminary compressed audio
[carveJwlIkooP6JGAAIwe30JlM.git] / audio.h
1 #include "common.h"
2
3 #ifndef AUDIO_H
4 #define AUDIO_H
5
6 #include "world.h"
7
8 static float audio_occlusion_current = 0.0f,
9 k_audio_occlusion_rate = 1.0f;
10
11 static int k_audio_debug_soundscape = 0;
12
13
14 audio_clip audio_board[] =
15 {
16 {.path="sound/skate.ogg", .source_mode=k_audio_source_mono_compressed },
17 {.path="sound/wheel.ogg", .source_mode=k_audio_source_mono_compressed },
18 {.path="sound/slide.ogg", .source_mode=k_audio_source_mono_compressed },
19 {.path="sound/reverb.ogg",.source_mode=k_audio_source_mono_compressed }
20 };
21
22 audio_player audio_player0 =
23 {
24 .name = "Player0",
25 };
26
27 audio_player audio_player1 =
28 {
29 .name = "Player1",
30 };
31
32 audio_player audio_player2 =
33 {
34 .name = "Player2",
35 };
36
37 audio_player audio_player3 =
38 {
39 .name = "Player3",
40 };
41
42 static void audio_init(void)
43 {
44 audio_clip_loadn( audio_board, vg_list_size(audio_board) );
45
46 audio_lock();
47 u32 flags = AUDIO_FLAG_LOOP|AUDIO_FLAG_SPACIAL_3D;
48
49 audio_player_set_flags( &audio_player0, flags );
50 audio_player_set_flags( &audio_player1, flags );
51 audio_player_set_flags( &audio_player2, flags );
52 audio_player_set_flags( &audio_player3, AUDIO_FLAG_LOOP );
53
54 audio_player_playclip( &audio_player0, &audio_board[0] );
55 audio_player_playclip( &audio_player1, &audio_board[1] );
56 audio_player_playclip( &audio_player2, &audio_board[2] );
57 audio_player_playclip( &audio_player3, &audio_board[3] );
58
59 audio_unlock();
60
61 vg_convar_push( (struct vg_convar){
62 .name = "aud_debug_soundscape",
63 .data = &k_audio_debug_soundscape,
64 .data_type = k_convar_dtype_i32,
65 .opt_i32 = { .min=0, .max=1, .clamp=0 },
66 .persistent = 1
67 });
68
69 vg_convar_push( (struct vg_convar){
70 .name = "aud_occlusion_rate",
71 .data = &k_audio_occlusion_rate,
72 .data_type = k_convar_dtype_f32,
73 .opt_f32 = { .clamp = 0 },
74 .persistent = 1
75 });
76 }
77
78 static void audio_free(void)
79 {
80 }
81
82 static void audio_sample_occlusion( v3f origin )
83 {
84 float d = 0.0f,
85 sample_dist = 880.0f;
86
87 int sample_count = 8;
88
89 for( int i=0; i<sample_count; i++ )
90 {
91 v3f dir;
92 vg_rand_dir( dir );
93
94 ray_hit contact;
95 contact.dist = 15.0f;
96
97 if( ray_world( origin, dir, &contact ) )
98 {
99 d += contact.dist;
100
101 vg_line( origin, contact.pos, 0xff0000ff );
102 vg_line_pt3( contact.pos, 0.1f, 0xff0000ff );
103 }
104 else
105 {
106 v3f p1;
107 v3_muladds( origin, dir, sample_dist, p1 );
108 vg_line( origin, p1, 0xffcccccc );
109
110 d += sample_dist;
111 }
112 }
113
114 float occlusion = 1.0f - (d * (1.0f/(sample_dist*(float)sample_count))),
115 rate = ktimestep * k_audio_occlusion_rate,
116 target = powf( occlusion, 6.0f );
117 audio_occlusion_current = vg_lerpf( audio_occlusion_current, target, rate );
118 }
119
120 static void audio_debug_soundscapes(void)
121 {
122 if( !k_audio_debug_soundscape ) return;
123
124 char buf[64];
125 snprintf( buf, 31, "occlusion: %.5f", audio_occlusion_current );
126
127 ui_global_ctx.cursor[0] = 450;
128 ui_global_ctx.cursor[1] = 10;
129 ui_global_ctx.cursor[2] = audio_occlusion_current * 200.0f;
130 ui_global_ctx.cursor[3] = 20;
131
132 gui_fill_rect( ui_global_ctx.cursor, 0x55cccccc );
133 gui_text( ui_global_ctx.cursor, buf, 1, 0 );
134 }
135
136 #endif /* AUDIO_H */