1 #include "system.h"
2 
3 #include "core/dir.h"
4 #include "game/settings.h"
5 #include "sound/channel.h"
6 #include "sound/city.h"
7 #include "sound/device.h"
8 #include "sound/effect.h"
9 #include "sound/music.h"
10 #include "sound/speech.h"
11 
12 #include <string.h>
13 
14 static char channel_filenames[SOUND_CHANNEL_MAX][CHANNEL_FILENAME_MAX] = {
15     "", // speech channel
16     "wavs/panel1.wav",
17     "wavs/panel3.wav",
18     "wavs/icon1.wav",
19     "wavs/build1.wav",
20     "wavs/explod1.wav",
21     "wavs/fanfare.wav",
22     "wavs/fanfare2.wav",
23     "wavs/arrow.wav",
24     "wavs/arrow_hit.wav",
25     "wavs/axe.wav",
26     "wavs/ballista.wav",
27     "wavs/ballista_hit_ground.wav",
28     "wavs/ballista_hit_person.wav",
29     "wavs/club.wav",
30     "wavs/camel1.wav",
31     "wavs/elephant.wav",
32     "wavs/elephant_hit.wav",
33     "wavs/elephant_die.wav",
34     "wavs/horse.wav",
35     "wavs/horse2.wav",
36     "wavs/horse_mov.wav",
37     "wavs/javelin.wav",
38     "wavs/lion_attack.wav",
39     "wavs/lion_die.wav",
40     "wavs/marching.wav",
41     "wavs/sword.wav",
42     "wavs/sword_swing.wav",
43     "wavs/sword_light.wav",
44     "wavs/spear_attack.wav",
45     "wavs/wolf_attack.wav",
46     "wavs/wolf_die.wav",
47     "wavs/die1.wav",
48     "wavs/die2.wav",
49     "wavs/die4.wav",
50     "wavs/die10.wav",
51     "wavs/die3.wav",
52     "wavs/die5.wav",
53     "wavs/die8.wav",
54     "wavs/die9.wav",
55     "wavs/die7.wav",
56     "wavs/die11.wav",
57     "wavs/die6.wav",
58     "wavs/sheep_die.wav",
59     "wavs/zebra_die.wav",
60     "wavs/wolf_howl.wav",
61     "wavs/fire_splash.wav",
62     "wavs/formation_shield.wav",
63     // city sounds
64     "wavs/house_slum1.wav",
65     "",
66     "",
67     "",
68     "wavs/house_poor1.wav",
69     "",
70     "",
71     "",
72     "wavs/house_mid1.wav",
73     "",
74     "",
75     "",
76     "wavs/house_good1.wav",
77     "",
78     "",
79     "",
80     "wavs/house_posh1.wav",
81     "",
82     "",
83     "",
84     "wavs/ampitheatre.wav",
85     "wavs/theatre.wav",
86     "wavs/hippodrome.wav",
87     "wavs/colloseum.wav",
88     "wavs/glad_pit.wav",
89     "wavs/lion_pit.wav",
90     "wavs/art_pit.wav",
91     "wavs/char_pit.wav",
92     "wavs/gardens1.wav",
93     "",
94     "",
95     "",
96     "wavs/clinic.wav",
97     "wavs/hospital.wav",
98     "wavs/baths.wav",
99     "wavs/barber.wav",
100     "wavs/school.wav",
101     "wavs/academy.wav",
102     "wavs/library.wav",
103     "wavs/prefecture.wav",
104     "wavs/fort1.wav",
105     "",
106     "",
107     "",
108     "wavs/tower1.wav",
109     "",
110     "",
111     "",
112     "wavs/temp_farm.wav",
113     "wavs/temp_ship.wav",
114     "wavs/temp_comm.wav",
115     "wavs/temp_war.wav",
116     "wavs/temp_love.wav",
117     "wavs/market1.wav",
118     "",
119     "",
120     "",
121     "wavs/granary1.wav",
122     "",
123     "wavs/warehouse1.wav",
124     "",
125     "wavs/shipyard1.wav",
126     "",
127     "wavs/dock1.wav",
128     "",
129     "wavs/wharf1.wav",
130     "",
131     "wavs/palace.wav",
132     "wavs/eng_post.wav",
133     "wavs/senate.wav",
134     "wavs/forum.wav",
135     "wavs/resevoir.wav",
136     "wavs/fountain1.wav",
137     "",
138     "",
139     "",
140     "wavs/well1.wav",
141     "",
142     "",
143     "",
144     "wavs/mil_acad.wav",
145     "wavs/oracle.wav",
146     "wavs/burning_ruin.wav",
147     "wavs/wheat_farm.wav",
148     "wavs/veg_farm.wav",
149     "wavs/figs_farm.wav",
150     "wavs/olives_farm.wav",
151     "wavs/vines_farm.wav",
152     "wavs/meat_farm.wav",
153     "wavs/quarry.wav",
154     "wavs/mine.wav",
155     "wavs/lumber_mill.wav",
156     "wavs/clay_pit.wav",
157     "wavs/wine_workshop.wav",
158     "wavs/oil_workshop.wav",
159     "wavs/weap_workshop.wav",
160     "wavs/furn_workshop.wav",
161     "wavs/pott_workshop.wav",
162     "wavs/empty_land1.wav",
163     "",
164     "",
165     "",
166     "wavs/river.wav",
167     "wavs/mission.wav",
168     "wavs/tower4.wav"
169 };
170 
correct_channel_filenames(void)171 static void correct_channel_filenames(void)
172 {
173     for (int i = 1; i < SOUND_CHANNEL_MAX; i++) {
174         if (!channel_filenames[i][0]) {
175             continue;
176         }
177 
178         char *original = channel_filenames[i];
179         const char *corrected = dir_get_file(original, MAY_BE_LOCALIZED);
180         if (!corrected) {
181             channel_filenames[i][0] = 0;
182         } else if (corrected != original) {
183             strncpy(original, corrected, CHANNEL_FILENAME_MAX);
184         }
185     }
186 }
187 
sound_system_init(void)188 void sound_system_init(void)
189 {
190     correct_channel_filenames();
191 
192     sound_device_open();
193     sound_device_init_channels(SOUND_CHANNEL_MAX, channel_filenames);
194 
195     sound_city_set_volume(setting_sound(SOUND_CITY)->volume);
196     sound_effect_set_volume(setting_sound(SOUND_EFFECTS)->volume);
197     sound_music_set_volume(setting_sound(SOUND_MUSIC)->volume);
198     sound_speech_set_volume(setting_sound(SOUND_SPEECH)->volume);
199 }
200 
sound_system_shutdown(void)201 void sound_system_shutdown(void)
202 {
203     sound_device_close();
204 }
205