Rev 18 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1 | pmbaty | 1 | #include "sound.h" |
2 | |||
3 | #include <stdlib.h> |
||
4 | #include <string.h> |
||
5 | |||
20 | pmbaty | 6 | #include "brender/brender.h" |
1 | pmbaty | 7 | #include "controls.h" |
8 | #include "globvars.h" |
||
9 | #include "graphics.h" |
||
10 | #include "harness/trace.h" |
||
11 | #include "opponent.h" |
||
12 | #include "pd/sys.h" |
||
13 | #include "piping.h" |
||
14 | #include "replay.h" |
||
15 | #include "s3/s3.h" |
||
16 | #include "s3/s3_brender.h" |
||
17 | #include "utility.h" |
||
18 | |||
19 | int gSound_detail_level; |
||
20 | int gVirgin_pass = 1; |
||
21 | int gOld_sound_detail_level = -1; |
||
22 | int gLast_tune; |
||
23 | int gRandom_MIDI_tunes[3]; |
||
24 | int gRandom_Rockin_MIDI_tunes[3]; |
||
25 | int gRandom_CDA_tunes[7]; |
||
26 | int gCDA_is_playing; |
||
27 | int gServicing_sound; |
||
28 | int gSong_repeat_count; |
||
29 | int gSound_sources_inited; |
||
30 | int gMusic_available; |
||
31 | tS3_sound_tag gCDA_tag; |
||
32 | int gCD_fully_installed; |
||
33 | tS3_outlet_ptr gEffects_outlet; |
||
34 | tS3_outlet_ptr gCar_outlet; |
||
35 | tS3_outlet_ptr gEngine_outlet; |
||
36 | tS3_outlet_ptr gDriver_outlet; |
||
37 | tS3_outlet_ptr gPedestrians_outlet; |
||
38 | tS3_outlet_ptr gMusic_outlet; |
||
39 | tS3_sound_id gMIDI_id; |
||
40 | tS3_outlet_ptr gIndexed_outlets[6]; |
||
41 | tU32 gLast_sound_service; |
||
42 | int gCD_is_disabled; |
||
43 | br_vector3 gCamera_left; |
||
44 | br_vector3 gCamera_position; |
||
45 | br_vector3 gOld_camera_position; |
||
46 | br_vector3 gCamera_velocity; |
||
47 | |||
48 | // IDA: void __cdecl UsePathFileToDetermineIfFullInstallation() |
||
49 | void UsePathFileToDetermineIfFullInstallation(void) { |
||
50 | // changed by dethrace for compatibility |
||
51 | // char line1[80]; |
||
52 | // char line2[80]; |
||
53 | // char line3[80]; |
||
54 | // char path_file[80]; |
||
55 | char line1[MAX_PATH_LENGTH]; |
||
56 | char line2[MAX_PATH_LENGTH]; |
||
57 | char line3[MAX_PATH_LENGTH]; |
||
58 | char path_file[MAX_PATH_LENGTH]; |
||
59 | FILE* fp; |
||
60 | |||
61 | strcpy(path_file, gApplication_path); |
||
62 | strcat(path_file, gDir_separator); |
||
63 | strcat(path_file, "PATHS.TXT"); |
||
64 | if (PDCheckDriveExists(path_file) != 0) { |
||
65 | fp = fopen(path_file, "rt"); |
||
66 | if (fp) { |
||
67 | line1[0] = 0; |
||
68 | line2[0] = 0; |
||
69 | line3[0] = 0; |
||
70 | GetALineWithNoPossibleService(fp, (unsigned char*)line1); |
||
71 | GetALineWithNoPossibleService(fp, (unsigned char*)line2); |
||
72 | GetALineWithNoPossibleService(fp, (unsigned char*)line3); |
||
73 | fclose(fp); |
||
74 | if (strcmp(line3, "Full") == 0) { |
||
75 | gCD_fully_installed = 1; |
||
76 | } |
||
77 | } |
||
78 | } else { |
||
79 | gCD_fully_installed = 1; |
||
80 | } |
||
81 | } |
||
82 | |||
83 | // IDA: void __cdecl InitSound() |
||
84 | void InitSound(void) { |
||
85 | tPath_name the_path; |
||
86 | //tS3_sound_tag tag; // Pierre-Marie Baty -- unused variable |
||
87 | int engine_channel_count; |
||
88 | int car_channel_count; |
||
89 | int ped_channel_count; |
||
90 | |||
91 | if (gVirgin_pass) { |
||
92 | PathCat(the_path, gApplication_path, "SOUND"); |
||
93 | if (gProgram_state.sausage_eater_mode) { |
||
94 | PathCat(the_path, the_path, "KSOUND.TXT"); |
||
95 | } else { |
||
96 | PathCat(the_path, the_path, "SOUND.TXT"); |
||
97 | } |
||
98 | if (gSound_override) { |
||
99 | gSound_enabled = 0; |
||
100 | gSound_available = 0; |
||
101 | } else { |
||
102 | gSound_enabled = S3Init(the_path, gAusterity_mode) == 0; |
||
103 | gSound_available = gSound_enabled; |
||
104 | } |
||
20 | pmbaty | 105 | S3Set3DSoundEnvironment(0.14492753f, -1.0f, -1.0f); // Pierre-Marie Baty -- added type casts |
1 | pmbaty | 106 | gVirgin_pass = 0; |
107 | gCD_is_disabled = 0; |
||
108 | UsePathFileToDetermineIfFullInstallation(); |
||
109 | } |
||
110 | if (gSound_available == 0) { |
||
111 | return; |
||
112 | } |
||
113 | switch (gSound_detail_level) { |
||
114 | case 0: |
||
115 | engine_channel_count = 2; |
||
116 | car_channel_count = 2; |
||
117 | ped_channel_count = 3; |
||
118 | break; |
||
119 | case 1: |
||
120 | engine_channel_count = 2; |
||
121 | car_channel_count = 3; |
||
122 | ped_channel_count = 4; |
||
123 | break; |
||
124 | case 2: |
||
125 | engine_channel_count = 6; |
||
126 | car_channel_count = 4; |
||
127 | ped_channel_count = 5; |
||
128 | break; |
||
129 | default: |
||
130 | TELL_ME_IF_WE_PASS_THIS_WAY(); |
||
131 | } |
||
132 | if (gDriver_outlet == NULL) { |
||
133 | gDriver_outlet = S3CreateOutlet(1, 1); |
||
134 | gIndexed_outlets[0] = gDriver_outlet; |
||
135 | if (gDriver_outlet == NULL) { |
||
136 | gSound_available = 0; |
||
137 | return; |
||
138 | } |
||
139 | } |
||
140 | if (!gMusic_outlet) { |
||
141 | gMusic_outlet = S3CreateOutlet(1, 1); |
||
142 | gIndexed_outlets[2] = gMusic_outlet; |
||
143 | gMusic_available = gMusic_outlet != 0; |
||
144 | DRS3SetOutletVolume(gMusic_outlet, 42 * gProgram_state.music_volume); |
||
145 | } |
||
146 | if (gSound_detail_level != gOld_sound_detail_level) { |
||
147 | if (gCar_outlet) { |
||
148 | S3ReleaseOutlet(gCar_outlet); |
||
149 | gCar_outlet = 0; |
||
150 | } |
||
151 | if (gPedestrians_outlet) { |
||
152 | S3ReleaseOutlet(gPedestrians_outlet); |
||
153 | gPedestrians_outlet = 0; |
||
154 | } |
||
155 | if (gEngine_outlet) { |
||
156 | S3ReleaseOutlet(gEngine_outlet); |
||
157 | gEngine_outlet = 0; |
||
158 | } |
||
159 | if (gEngine_outlet == NULL) { |
||
160 | gEngine_outlet = S3CreateOutlet(engine_channel_count, engine_channel_count); |
||
161 | gIndexed_outlets[1] = gEngine_outlet; |
||
162 | if (!gEngine_outlet) { |
||
163 | gSound_available = 0; |
||
164 | return; |
||
165 | } |
||
166 | DRS3SetOutletVolume(gEngine_outlet, 42 * gProgram_state.effects_volume); |
||
167 | } |
||
168 | if (gCar_outlet == NULL) { |
||
169 | gCar_outlet = S3CreateOutlet(car_channel_count, car_channel_count); |
||
170 | gIndexed_outlets[3] = gCar_outlet; |
||
171 | if (!gCar_outlet) { |
||
172 | gSound_available = 0; |
||
173 | return; |
||
174 | } |
||
175 | DRS3SetOutletVolume(gCar_outlet, 42 * gProgram_state.effects_volume); |
||
176 | } |
||
177 | if (gPedestrians_outlet == NULL) { |
||
178 | gPedestrians_outlet = S3CreateOutlet(ped_channel_count, ped_channel_count); |
||
179 | gIndexed_outlets[4] = gPedestrians_outlet; |
||
180 | if (!gPedestrians_outlet) { |
||
181 | gSound_available = 0; |
||
182 | return; |
||
183 | } |
||
184 | DRS3SetOutletVolume(gPedestrians_outlet, 42 * gProgram_state.effects_volume); |
||
185 | } |
||
186 | } |
||
187 | if (gEffects_outlet == NULL) { |
||
188 | gEffects_outlet = S3CreateOutlet(2, 2); |
||
189 | gIndexed_outlets[5] = gEffects_outlet; |
||
190 | if (!gEffects_outlet) { |
||
191 | gSound_available = 0; |
||
192 | return; |
||
193 | } |
||
194 | DRS3SetOutletVolume(gEffects_outlet, 42 * gProgram_state.effects_volume); |
||
195 | } |
||
196 | gOld_sound_detail_level = gSound_detail_level; |
||
197 | SetSoundVolumes(); |
||
198 | } |
||
199 | |||
200 | // IDA: tS3_sound_tag __usercall DRS3StartSound@<EAX>(tS3_outlet_ptr pOutlet@<EAX>, tS3_sound_id pSound@<EDX>) |
||
201 | tS3_sound_tag DRS3StartSound(tS3_outlet_ptr pOutlet, tS3_sound_id pSound) { |
||
202 | if (!gSound_enabled) { |
||
203 | return 0; |
||
204 | } |
||
205 | if (pSound != 1000 && (pSound < 3000 || pSound > 3007) && (pSound < 5300 || pSound > 5320)) { |
||
206 | PipeSingleSound(pOutlet, pSound, 0, 0, -1, 0); |
||
207 | } |
||
208 | return S3StartSound(pOutlet, pSound); |
||
209 | } |
||
210 | |||
211 | // IDA: tS3_sound_tag __usercall DRS3StartSoundNoPiping@<EAX>(tS3_outlet_ptr pOutlet@<EAX>, tS3_sound_id pSound@<EDX>) |
||
212 | tS3_sound_tag DRS3StartSoundNoPiping(tS3_outlet_ptr pOutlet, tS3_sound_id pSound) { |
||
213 | if (!gSound_enabled) { |
||
214 | return 0; |
||
215 | } |
||
216 | return S3StartSound(pOutlet, pSound); |
||
217 | } |
||
218 | |||
219 | // IDA: tS3_sound_tag __usercall DRS3StartSound2@<EAX>(tS3_outlet_ptr pOutlet@<EAX>, tS3_sound_id pSound@<EDX>, tS3_repeats pRepeats@<EBX>, tS3_volume pLVolume@<ECX>, tS3_volume pRVolume, tS3_pitch pPitch, tS3_speed pSpeed) |
||
220 | tS3_sound_tag DRS3StartSound2(tS3_outlet_ptr pOutlet, tS3_sound_id pSound, tS3_repeats pRepeats, tS3_volume pLVolume, tS3_volume pRVolume, tS3_pitch pPitch, tS3_speed pSpeed) { |
||
221 | LOG_TRACE("(%d, %d, %d, %d, %d, %d, %d)", pOutlet, pSound, pRepeats, pLVolume, pRVolume, pPitch, pSpeed); |
||
222 | |||
223 | if (!gSound_enabled) { |
||
224 | return 0; |
||
225 | } |
||
226 | if (pOutlet != gMusic_outlet |
||
227 | && pSound != 1000 |
||
228 | && (pSound < 3000 || pSound > 3007) |
||
229 | && (pSound < 5300 || pSound > 5320) |
||
230 | && (pLVolume || pRVolume)) { |
||
231 | PipeSingleSound(pOutlet, pSound, pLVolume, pRVolume, pPitch, 0); |
||
232 | } |
||
233 | return S3StartSound2(pOutlet, pSound, pRepeats, pLVolume, pRVolume, pPitch, pSpeed); |
||
234 | } |
||
235 | |||
236 | // IDA: int __usercall DRS3ChangeVolume@<EAX>(tS3_sound_tag pSound_tag@<EAX>, tS3_volume pNew_volume@<EDX>) |
||
237 | int DRS3ChangeVolume(tS3_sound_tag pSound_tag, tS3_volume pNew_volume) { |
||
238 | LOG_TRACE("(%d, %d)", pSound_tag, pNew_volume); |
||
239 | |||
240 | if (gSound_enabled == 0) { |
||
241 | return 0; |
||
242 | } |
||
243 | return S3ChangeVolume(pSound_tag, pNew_volume); |
||
244 | } |
||
245 | |||
246 | // IDA: int __usercall DRS3ChangeLRVolume@<EAX>(tS3_sound_tag pSound_tag@<EAX>, tS3_volume pNew_Lvolume@<EDX>, tS3_volume pNew_Rvolume@<EBX>) |
||
247 | int DRS3ChangeLRVolume(tS3_sound_tag pSound_tag, tS3_volume pNew_Lvolume, tS3_volume pNew_Rvolume) { |
||
248 | LOG_TRACE("(%d, %d, %d)", pSound_tag, pNew_Lvolume, pNew_Rvolume); |
||
249 | NOT_IMPLEMENTED(); |
||
250 | } |
||
251 | |||
252 | // IDA: int __usercall DRS3ChangePitch@<EAX>(tS3_sound_tag pTag@<EAX>, tS3_pitch pNew_pitch@<EDX>) |
||
253 | int DRS3ChangePitch(tS3_sound_tag pTag, tS3_pitch pNew_pitch) { |
||
254 | LOG_TRACE("(%d, %d)", pTag, pNew_pitch); |
||
255 | NOT_IMPLEMENTED(); |
||
256 | } |
||
257 | |||
258 | // IDA: int __usercall DRS3ChangeSpeed@<EAX>(tS3_sound_tag pTag@<EAX>, tS3_pitch pNew_speed@<EDX>) |
||
259 | int DRS3ChangeSpeed(tS3_sound_tag pTag, tS3_pitch pNew_speed) { |
||
260 | LOG_TRACE("(%d, %d)", pTag, pNew_speed); |
||
261 | NOT_IMPLEMENTED(); |
||
262 | return 0; |
||
263 | } |
||
264 | |||
265 | // IDA: int __usercall DRS3ChangePitchSpeed@<EAX>(tS3_sound_tag pTag@<EAX>, tS3_pitch pNew_pitch@<EDX>) |
||
266 | int DRS3ChangePitchSpeed(tS3_sound_tag pTag, tS3_pitch pNew_pitch) { |
||
267 | LOG_TRACE("(%d, %d)", pTag, pNew_pitch); |
||
268 | |||
269 | if (!gSound_enabled) { |
||
270 | return 0; |
||
271 | } |
||
272 | return S3ChangePitchSpeed(pTag, pNew_pitch); |
||
273 | } |
||
274 | |||
275 | // IDA: int __usercall DRS3StopSound@<EAX>(tS3_sound_tag pSound_tag@<EAX>) |
||
276 | int DRS3StopSound(tS3_sound_tag pSound_tag) { |
||
277 | LOG_TRACE("(%d)", pSound_tag); |
||
278 | |||
279 | if (!gSound_enabled) { |
||
280 | return 0; |
||
281 | } |
||
282 | return S3StopSound(pSound_tag); |
||
283 | } |
||
284 | |||
285 | // IDA: int __usercall DRS3LoadSound@<EAX>(tS3_sound_id pThe_sound@<EAX>) |
||
286 | int DRS3LoadSound(tS3_sound_id pThe_sound) { |
||
287 | LOG_TRACE("(%d)", pThe_sound); |
||
288 | |||
289 | if (!gSound_enabled) { |
||
290 | return 0; |
||
291 | } |
||
292 | return S3LoadSample(pThe_sound); |
||
293 | } |
||
294 | |||
295 | // IDA: int __usercall DRS3ReleaseSound@<EAX>(tS3_sound_id pThe_sound@<EAX>) |
||
296 | int DRS3ReleaseSound(tS3_sound_id pThe_sound) { |
||
297 | LOG_TRACE("(%d)", pThe_sound); |
||
298 | |||
299 | if (gSound_enabled == 0) { |
||
300 | return 0; |
||
301 | } |
||
302 | return S3ReleaseSound(pThe_sound); |
||
303 | } |
||
304 | |||
305 | // IDA: void __cdecl DRS3Service() |
||
306 | void DRS3Service(void) { |
||
307 | LOG_TRACE("()"); |
||
308 | |||
309 | if (gSound_enabled) { |
||
310 | if (gProgram_state.cockpit_on && gProgram_state.cockpit_image_index >= 0) { |
||
311 | S3Service(1, 1); |
||
312 | } else { |
||
313 | S3Service(0, 1); |
||
314 | } |
||
315 | } |
||
316 | } |
||
317 | |||
318 | // IDA: int __usercall DRS3OutletSoundsPlaying@<EAX>(tS3_outlet_ptr pOutlet@<EAX>) |
||
319 | int DRS3OutletSoundsPlaying(tS3_outlet_ptr pOutlet) { |
||
320 | LOG_TRACE("(%d)", pOutlet); |
||
321 | NOT_IMPLEMENTED(); |
||
322 | } |
||
323 | |||
324 | // IDA: int __usercall DRS3SoundStillPlaying@<EAX>(tS3_sound_tag pSound_tag@<EAX>) |
||
325 | int DRS3SoundStillPlaying(tS3_sound_tag pSound_tag) { |
||
326 | LOG_TRACE("(%d)", pSound_tag); |
||
327 | |||
328 | return gSound_enabled && S3SoundStillPlaying(pSound_tag); |
||
329 | } |
||
330 | |||
331 | // IDA: void __cdecl DRS3ShutDown() |
||
332 | void DRS3ShutDown(void) { |
||
333 | LOG_TRACE("()"); |
||
334 | |||
335 | if (gSound_enabled) { |
||
336 | gSound_enabled = 0; |
||
337 | S3Shutdown(); |
||
338 | } |
||
339 | } |
||
340 | |||
341 | // IDA: int __usercall DRS3SetOutletVolume@<EAX>(tS3_outlet_ptr pOutlet@<EAX>, tS3_volume pVolume@<EDX>) |
||
342 | int DRS3SetOutletVolume(tS3_outlet_ptr pOutlet, tS3_volume pVolume) { |
||
343 | LOG_TRACE("(%d, %d)", pOutlet, pVolume); |
||
344 | |||
345 | if (!gSound_enabled) { |
||
346 | return 0; |
||
347 | } |
||
348 | return S3SetOutletVolume(pOutlet, pVolume); |
||
349 | } |
||
350 | |||
351 | // IDA: int __usercall DRS3OverallVolume@<EAX>(tS3_volume pVolume@<EAX>) |
||
352 | int DRS3OverallVolume(tS3_volume pVolume) { |
||
353 | LOG_TRACE("(%d)", pVolume); |
||
354 | NOT_IMPLEMENTED(); |
||
355 | } |
||
356 | |||
357 | // IDA: int __usercall DRS3StopOutletSound@<EAX>(tS3_outlet_ptr pOutlet@<EAX>) |
||
358 | int DRS3StopOutletSound(tS3_outlet_ptr pOutlet) { |
||
359 | if (!gSound_enabled) { |
||
360 | return 0; |
||
361 | } |
||
362 | return S3StopOutletSound(pOutlet); |
||
363 | } |
||
364 | |||
365 | // IDA: int __cdecl DRS3StopAllOutletSounds() |
||
366 | int DRS3StopAllOutletSounds(void) { |
||
367 | LOG_TRACE("()"); |
||
368 | |||
369 | if (gSound_enabled) { |
||
370 | S3StopAllOutletSounds(); |
||
371 | } |
||
372 | return 0; |
||
373 | } |
||
374 | |||
375 | // IDA: void __cdecl ToggleSoundEnable() |
||
376 | void ToggleSoundEnable(void) { |
||
377 | LOG_TRACE("()"); |
||
378 | |||
379 | if (gSound_enabled) { |
||
380 | S3StopAllOutletSounds(); |
||
381 | S3Disable(); |
||
382 | gSound_enabled = 0; |
||
383 | } else { |
||
384 | S3Enable(); |
||
385 | gSound_enabled = 1; |
||
386 | } |
||
387 | } |
||
388 | |||
389 | // IDA: void __cdecl SoundService() |
||
390 | void SoundService(void) { |
||
391 | //br_matrix34 mat; // Pierre-Marie Baty -- unused variable |
||
392 | |||
393 | if (gSound_enabled && !gServicing_sound) { |
||
394 | gServicing_sound = 1; |
||
395 | gLast_sound_service = PDGetTotalTime(); |
||
396 | if (gCDA_tag) { |
||
397 | if (!S3IsCDAPlaying2()) { |
||
398 | StopMusic(); |
||
399 | StartMusic(); |
||
400 | } |
||
401 | } |
||
402 | DRS3Service(); |
||
403 | gServicing_sound = 0; |
||
404 | } |
||
405 | } |
||
406 | |||
407 | // IDA: void __cdecl InitSoundSources() |
||
408 | void InitSoundSources(void) { |
||
409 | int cat; |
||
410 | int car_count; |
||
411 | int i; |
||
412 | int toggle; |
||
413 | tCar_spec* the_car; |
||
414 | LOG_TRACE("()"); |
||
415 | |||
416 | toggle = 0; |
||
417 | if (!gSound_available) { |
||
418 | return; |
||
419 | } |
||
420 | if (!gSound_enabled) { |
||
421 | ToggleSoundEnable(); |
||
422 | toggle = 1; |
||
423 | } |
||
424 | gCamera_position = *(br_vector3*)&gCamera_to_world.m[3][0]; |
||
425 | gCamera_left.v[0] = gCamera_to_world.m[0][0] * -1.0; |
||
426 | gCamera_left.v[1] = gCamera_to_world.m[0][1] * -1.0; |
||
427 | gCamera_left.v[2] = gCamera_to_world.m[0][2] * -1.0; |
||
428 | S3BindListenerPositionBRender(&gCamera_position); |
||
429 | S3BindListenerVelocityBRender(&gCamera_velocity); |
||
430 | S3BindListenerLeftBRender(&gCamera_left); |
||
431 | if (!gSound_sources_inited) { |
||
432 | for (cat = eVehicle_self; cat <= eVehicle_rozzer; ++cat) { |
||
433 | if (cat) { |
||
434 | car_count = GetCarCount(cat); |
||
435 | } else { |
||
436 | car_count = 1; |
||
437 | } |
||
438 | for (i = 0; i < car_count; i++) { |
||
439 | PossibleService(); |
||
440 | if (cat) { |
||
441 | the_car = GetCarSpec(cat, i); |
||
442 | } else { |
||
443 | the_car = &gProgram_state.current_car; |
||
444 | } |
||
445 | if (the_car->driver == eDriver_local_human || gSound_detail_level == 2 || cat == eVehicle_rozzer) { |
||
446 | the_car->sound_source = S3CreateSoundSourceBR(&the_car->pos, &the_car->velocity_bu_per_sec, gEngine_outlet); |
||
447 | if (the_car->sound_source) { |
||
448 | if (cat == eVehicle_rozzer) { |
||
449 | S3BindAmbientSoundToOutlet(gEngine_outlet, 5350, the_car->sound_source, 250.0, 0, 0, 0, 0x10000, 0x10000); |
||
450 | } else { |
||
451 | S3BindAmbientSoundToOutlet(gEngine_outlet, the_car->engine_noises[0], the_car->sound_source, 250.0, 0, 0, 0, 0x10000, 0x10000); |
||
452 | } |
||
453 | } |
||
454 | } |
||
455 | } |
||
456 | } |
||
457 | gSound_sources_inited = 1; |
||
458 | } |
||
459 | if (toggle) { |
||
460 | ToggleSoundEnable(); |
||
461 | } |
||
462 | } |
||
463 | |||
464 | // IDA: void __cdecl DisposeSoundSources() |
||
465 | void DisposeSoundSources(void) { |
||
466 | int cat; |
||
467 | int car_count; |
||
468 | int i; |
||
469 | int toggle; |
||
470 | tCar_spec* the_car; |
||
471 | LOG_TRACE("()"); |
||
472 | |||
473 | toggle = 0; |
||
474 | if (gSound_available == 0) { |
||
475 | return; |
||
476 | } |
||
477 | if (!gSound_enabled) { |
||
478 | ToggleSoundEnable(); |
||
479 | toggle = 1; |
||
480 | } |
||
481 | if (gSound_sources_inited) { |
||
482 | DRS3StopOutletSound(gEngine_outlet); |
||
483 | if (gProgram_state.cockpit_on && gProgram_state.cockpit_image_index >= 0) { |
||
484 | S3Service(1, 0); |
||
485 | } else { |
||
486 | S3Service(0, 0); |
||
487 | } |
||
488 | for (cat = eVehicle_self; cat <= eVehicle_rozzer; cat++) { |
||
489 | if (cat) { |
||
490 | car_count = GetCarCount(cat); |
||
491 | } else { |
||
492 | car_count = 1; |
||
493 | } |
||
494 | for (i = 0; i < car_count; ++i) { |
||
495 | if (cat) { |
||
496 | the_car = GetCarSpec(cat, i); |
||
497 | } else { |
||
498 | the_car = &gProgram_state.current_car; |
||
499 | } |
||
500 | if (the_car->driver == eDriver_local_human || gSound_detail_level == 2 || cat == eVehicle_rozzer) { |
||
501 | if (the_car->sound_source) { |
||
502 | S3UpdateSoundSource(gEngine_outlet, -1, the_car->sound_source, 0.0f, 0, 0, 0, 0x10000, 0x10000); |
||
503 | S3ReleaseSoundSource(the_car->sound_source); |
||
504 | } |
||
505 | the_car->sound_source = NULL; |
||
506 | } |
||
507 | } |
||
508 | } |
||
509 | gSound_sources_inited = 0; |
||
510 | } |
||
511 | if (toggle) { |
||
512 | ToggleSoundEnable(); |
||
513 | } |
||
514 | } |
||
515 | |||
516 | // IDA: tS3_sound_tag __usercall DRS3StartSound3D@<EAX>(tS3_outlet_ptr pOutlet@<EAX>, tS3_sound_id pSound@<EDX>, br_vector3 *pInitial_position@<EBX>, br_vector3 *pInitial_velocity@<ECX>, tS3_repeats pRepeats, tS3_volume pVolume, tS3_pitch pPitch, tS3_speed pSpeed) |
||
517 | tS3_sound_tag DRS3StartSound3D(tS3_outlet_ptr pOutlet, tS3_sound_id pSound, br_vector3* pInitial_position, br_vector3* pInitial_velocity, tS3_repeats pRepeats, tS3_volume pVolume, tS3_pitch pPitch, tS3_speed pSpeed) { |
||
518 | //tS3_sound_tag tag; // Pierre-Marie Baty -- unused variable |
||
519 | LOG_TRACE("(%d, %d, %p, %p, %d, %d, %d, %d)", pOutlet, pSound, pInitial_position, pInitial_velocity, pRepeats, pVolume, pPitch, pSpeed); |
||
520 | |||
521 | if (!gSound_enabled) { |
||
522 | return 0; |
||
523 | } |
||
524 | if (pVolume && pSound != 1000 && (pSound < 3000 || pSound > 3007) && (pSound < 5300 || pSound > 5320)) { |
||
525 | PipeSingleSound(pOutlet, pSound, pVolume, 0, pPitch, pInitial_position); |
||
526 | } |
||
527 | return S3StartSound3D(pOutlet, pSound, (tS3_vector3*)pInitial_position, (tS3_vector3*)pInitial_velocity, pRepeats, pVolume, pPitch, pSpeed); |
||
528 | } |
||
529 | |||
530 | // IDA: tS3_sound_tag __usercall DRS3StartSoundFromSource3@<EAX>(tS3_sound_source_ptr pSource@<EAX>, tS3_sound_id pSound@<EDX>, tS3_repeats pRepeats@<EBX>, tS3_volume pVolume@<ECX>, tS3_pitch pPitch, tS3_speed pSpeed) |
||
531 | tS3_sound_tag DRS3StartSoundFromSource3(tS3_sound_source_ptr pSource, tS3_sound_id pSound, tS3_repeats pRepeats, tS3_volume pVolume, tS3_pitch pPitch, tS3_speed pSpeed) { |
||
532 | //tS3_sound_tag tag; // Pierre-Marie Baty -- unused variable |
||
533 | LOG_TRACE("(%d, %d, %d, %d, %d, %d)", pSource, pSound, pRepeats, pVolume, pPitch, pSpeed); |
||
534 | NOT_IMPLEMENTED(); |
||
535 | } |
||
536 | |||
537 | // IDA: tS3_sound_tag __usercall DRS3StartSoundFromSource@<EAX>(tS3_sound_source_ptr pSource@<EAX>, tS3_sound_id pSound@<EDX>) |
||
538 | tS3_sound_tag DRS3StartSoundFromSource(tS3_sound_source_ptr pSource, tS3_sound_id pSound) { |
||
539 | //tS3_sound_tag tag; // Pierre-Marie Baty -- unused variable |
||
540 | LOG_TRACE("(%d, %d)", pSource, pSound); |
||
541 | NOT_IMPLEMENTED(); |
||
542 | } |
||
543 | |||
544 | // IDA: void __cdecl MungeEngineNoise() |
||
545 | void MungeEngineNoise(void) { |
||
546 | tCar_spec* the_car; |
||
547 | tU32 pitch; |
||
548 | int vol; |
||
549 | int cat; |
||
550 | int car_count; |
||
551 | int i; |
||
552 | int stop_all; |
||
553 | int type_of_engine_noise; |
||
554 | //tS3_sound_id engine_noise; // Pierre-Marie Baty -- unused variable |
||
555 | |||
556 | // added by dethrace |
||
557 | tU32 frame_period; |
||
558 | frame_period = gFrame_period; |
||
559 | |||
560 | #ifdef DETHRACE_FIX_BUGS |
||
561 | // At framerates higher than 30, `gCamera_velocity` is not stable enough and causes the player car audio to stumble |
||
562 | // as the pitch shifts up and down while applying doppler effect in `S3Calculate3D`. |
||
563 | // We avoid the issue by only updating the engine sounds every MUNGE_ENGINE_INTERVAL ms |
||
564 | static tU32 dethrace_last_executed = 0; |
||
565 | |||
566 | tU32 now = GetTotalTime(); |
||
567 | if (now - dethrace_last_executed < MUNGE_ENGINE_INTERVAL) { |
||
568 | return; |
||
569 | } |
||
570 | frame_period = now - dethrace_last_executed; |
||
571 | dethrace_last_executed = now; |
||
572 | #endif |
||
573 | |||
574 | type_of_engine_noise = 0; |
||
575 | if (gSound_available == 0 || gProgram_state.racing == 0) { |
||
576 | return; |
||
577 | } |
||
578 | |||
579 | BrVector3Copy(&gCamera_position, (br_vector3*)&gCamera_to_world.m[3][0]); |
||
580 | BrVector3Negate(&gCamera_left, (br_vector3*)&gCamera_to_world.m[0][0]); |
||
581 | BrVector3Sub(&gCamera_velocity, &gCamera_position, &gOld_camera_position); |
||
582 | if (frame_period) { |
||
583 | BrVector3InvScale(&gCamera_velocity, &gCamera_velocity, ((float)frame_period / 1000.0f)); |
||
584 | } else { |
||
585 | BrVector3Set(&gCamera_velocity, 0.0f, 0.0f, 0.0f); |
||
586 | } |
||
587 | BrVector3Copy(&gOld_camera_position, &gCamera_position); |
||
588 | stop_all = (gAction_replay_mode && (fabsf(GetReplayRate()) > 1.0f || GetReplayRate() == 0.0f)) || gFaded_palette || gPalette_fade_time; |
||
589 | for (cat = eVehicle_self; cat <= eVehicle_rozzer; cat++) { |
||
590 | if (cat) { |
||
591 | car_count = GetCarCount(cat); |
||
592 | } else { |
||
593 | car_count = 1; |
||
594 | } |
||
595 | for (i = 0; i < car_count; i++) { |
||
596 | if (cat) { |
||
597 | the_car = GetCarSpec(cat, i); |
||
598 | } else { |
||
599 | the_car = &gProgram_state.current_car; |
||
600 | } |
||
601 | if (the_car->driver == eDriver_local_human || gSound_detail_level == 2 || cat == eVehicle_rozzer) { |
||
602 | if (stop_all || !the_car->active || the_car->knackered || (cat == eVehicle_rozzer && BrVector3LengthSquared(&the_car->v) < 0.0001f)) { |
||
603 | vol = 0; |
||
604 | pitch = 0x10000; |
||
605 | } else { |
||
606 | BrVector3InvScale(&the_car->velocity_bu_per_sec, &the_car->v, WORLD_SCALE); |
||
607 | if (cat == eVehicle_rozzer) { |
||
608 | vol = 255; |
||
609 | pitch = 0x10000; |
||
610 | } else { |
||
611 | if (the_car->last_special_volume) { |
||
612 | type_of_engine_noise = the_car->last_special_volume->engine_noise_index; |
||
613 | } |
||
614 | pitch = the_car->revs * 10.0f + 40960.0f; |
||
615 | if (gAction_replay_mode) { |
||
616 | pitch = fabsf(GetReplayRate()) * pitch; |
||
617 | } |
||
618 | if (type_of_engine_noise == 1) { |
||
619 | pitch = pitch * 0.75f; |
||
620 | } else if (type_of_engine_noise == 2) { |
||
621 | pitch = pitch * 0.55f; |
||
622 | } |
||
623 | |||
624 | pitch = MAX(pitch, 4096); |
||
625 | pitch = MIN(pitch, 131072); |
||
626 | |||
627 | vol = the_car->revs * 0.001f + 64.0f; |
||
628 | if (type_of_engine_noise == 1) { |
||
629 | vol = vol * 5.0f; |
||
630 | } else if (type_of_engine_noise == 2) { |
||
631 | vol = vol * 2.0f; |
||
632 | } else { |
||
633 | vol = vol * 2.5f; |
||
634 | } |
||
635 | vol = MIN(vol, 255); |
||
636 | } |
||
637 | } |
||
638 | S3UpdateSoundSource(gEngine_outlet, -1, the_car->sound_source, gAction_replay_mode == 0 ? 250.0f : 300.0f, 0, 0, vol, pitch, 0x10000); |
||
639 | } |
||
640 | } |
||
641 | } |
||
642 | SoundService(); |
||
643 | } |
||
644 | |||
645 | // IDA: void __cdecl SetSoundVolumes() |
||
646 | void SetSoundVolumes(void) { |
||
647 | |||
648 | if (!gSound_enabled) { |
||
649 | return; |
||
650 | } |
||
651 | if (gEffects_outlet != NULL) { |
||
652 | DRS3SetOutletVolume(gEffects_outlet, 42 * gProgram_state.effects_volume); |
||
653 | } |
||
654 | DRS3SetOutletVolume(gCar_outlet, 42 * gProgram_state.effects_volume); |
||
655 | DRS3SetOutletVolume(gEngine_outlet, 42 * gProgram_state.effects_volume); |
||
656 | DRS3SetOutletVolume(gDriver_outlet, 42 * gProgram_state.effects_volume); |
||
657 | DRS3SetOutletVolume(gPedestrians_outlet, 42 * gProgram_state.effects_volume); |
||
658 | DRS3SetOutletVolume(gMusic_outlet, 42 * gProgram_state.music_volume); |
||
659 | } |
||
660 | |||
661 | // IDA: tS3_outlet_ptr __usercall GetOutletFromIndex@<EAX>(int pIndex@<EAX>) |
||
662 | tS3_outlet_ptr GetOutletFromIndex(int pIndex) { |
||
663 | LOG_TRACE("(%d)", pIndex); |
||
664 | |||
665 | return gIndexed_outlets[pIndex]; |
||
666 | } |
||
667 | |||
668 | // IDA: int __usercall GetIndexFromOutlet@<EAX>(tS3_outlet_ptr pOutlet@<EAX>) |
||
669 | int GetIndexFromOutlet(tS3_outlet_ptr pOutlet) { |
||
670 | int i; |
||
671 | LOG_TRACE("(%d)", pOutlet); |
||
672 | |||
673 | for (i = 0; i < COUNT_OF(gIndexed_outlets); i++) { |
||
674 | if (gIndexed_outlets[i] == pOutlet) { |
||
675 | return i; |
||
676 | } |
||
677 | } |
||
678 | return 0; |
||
679 | } |
||
680 | |||
681 | // IDA: int __usercall DRS3StartCDA@<EAX>(tS3_sound_id pCDA_id@<EAX>) |
||
682 | int DRS3StartCDA(tS3_sound_id pCDA_id) { |
||
683 | LOG_TRACE("(%d)", pCDA_id); |
||
684 | NOT_IMPLEMENTED(); |
||
685 | } |
||
686 | |||
687 | // IDA: int __cdecl DRS3StopCDA() |
||
688 | int DRS3StopCDA(void) { |
||
689 | LOG_TRACE("()"); |
||
690 | NOT_IMPLEMENTED(); |
||
691 | } |
||
692 | |||
693 | // IDA: void __cdecl StartMusic() |
||
694 | void StartMusic(void) { |
||
695 | } |
||
696 | |||
697 | // IDA: void __cdecl StopMusic() |
||
698 | void StopMusic(void) { |
||
699 | } |