11 "",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
12 "",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
14 "",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
16 "Sounds\\Weather\\c2thun1a.wav",
17 "Sounds\\Weather\\c2thun1b.wav",
18 "Sounds\\Weather\\c2thun1c.wav",
19 "Sounds\\Weather\\c2thun2a.wav",
20 "Sounds\\Weather\\c2thun2b.wav",
21 "Sounds\\Weather\\c2thun2c.wav",
22 "Sounds\\Weather\\c2thun3a.wav",
23 "Sounds\\Weather\\c2thun3b.wav",
24 "Sounds\\Weather\\c2thun3c.wav",
25 "Sounds\\Weather\\c2thun4a.wav",
26 "Sounds\\Weather\\c2thun4b.wav",
27 "Sounds\\Weather\\c2thun4c.wav",
28 "Sounds\\Weather\\c2thun5a.wav",
29 "Sounds\\Weather\\c2thun5b.wav",
30 "Sounds\\Weather\\c2thun5c.wav",
31 "Sounds\\Weather\\c2prec0.wav",
32 "Sounds\\Weather\\c2prec1.wav",
33 "Sounds\\Weather\\c2prec2.wav",
34 "Sounds\\Weather\\c2prec3.wav",
35 "Sounds\\Weather\\c2prec4.wav",
36 "Sounds\\Weather\\c5wind3.wav",
37 "Sounds\\Weather\\speakerpop.wav",
39 "Sounds\\GUI\\mouseover.wav",
40 "Sounds\\GUI\\mouseclick.wav",
41 "Sounds\\GUI\\snapshot.wav",
42 "Sounds\\GUI\\chat.wav",
43 "Sounds\\GUI\\logon.wav",
44 "Sounds\\GUI\\logoff.wav",
45 "Sounds\\GUI\\newmsg.wav",
46 "Sounds\\GUI\\repair.wav",
47 "Sounds\\GUI\\cha-ching.wav",
48 "Sounds\\GUI\\information.wav",
49 "Sounds\\GUI\\construction.mp3",
50 "Sounds\\GUI\\success.mp3",
51 "Sounds\\GUI\\taxi.wav",
52 "Sounds\\GUI\\scanning.wav",
53 "Sounds\\GUI\\newsflash.mp3",
54 "Sounds\\Holidays\\christmas1.wav",
55 "Sounds\\Holidays\\halloween3.mp3",
57 "Sounds\\Instruments\\coupleraltitude.wav",
58 "Sounds\\Instruments\\ky100 hi low tone.wav",
59 "Sounds\\Instruments\\napdisco.wav",
60 "Sounds\\Instruments\\naltcap.wav",
61 "Sounds\\Instruments\\cycletarget.wav",
62 "Sounds\\Instruments\\midway.wav",
63 "Sounds\\Instruments\\proximity.wav",
64 "Sounds\\Instruments\\outer-marker.wav",
65 "Sounds\\Instruments\\middle-marker.wav",
66 "Sounds\\Instruments\\inner-marker.wav",
67 "Sounds\\warning.wav",
68 "Sounds\\caution.wav",
70 "Sounds\\Docks\\TURGRND0.wav",
71 "Sounds\\Docks\\TURGRND1.wav",
72 "Sounds\\Docks\\TURGRND2.wav",
73 "Sounds\\Docks\\TURGRND3.wav",
74 "Sounds\\Docks\\TURGRND4.wav",
75 "Sounds\\Docks\\TURGRND5.wav",
76 "Sounds\\Docks\\TURGRND6.wav",
77 "Sounds\\Docks\\TURGRND7.wav",
78 "Sounds\\Docks\\TURGRND8.wav",
79 "Sounds\\Docks\\TURGRND9.wav",
80 "Sounds\\Docks\\TURGRNDA.wav",
81 "Sounds\\Docks\\TURGRNDB.wav",
82 "Sounds\\Docks\\TURGEVAC.wav",
83 "Sounds\\Docks\\CHIME_A.wav",
85 "Sounds\\Docks\\CPOC\\cpoc2.wav",
86 "Sounds\\Docks\\CPOC\\cpoc3.wav",
87 "Sounds\\Docks\\CPOC\\cpoc4.wav",
88 "Sounds\\Docks\\CPOC\\cpoc5.wav",
89 "Sounds\\Docks\\CPOC\\cpoc6.wav",
90 "Sounds\\Docks\\CPOC\\cpoc7.wav",
91 "Sounds\\Docks\\CPOC\\cpoc8.wav",
92 "Sounds\\Docks\\CPOC\\cpoc9.wav",
93 "Sounds\\Docks\\CPOC\\cpoc10.wav",
94 "Sounds\\Docks\\CPOC\\cpoc14.wav",
95 "Sounds\\Docks\\CPOC\\cpoc15.wav",
96 "Sounds\\Docks\\CPOC\\cpoc16.wav",
97 "Sounds\\Docks\\CPOC\\evac.wav",
98 "Sounds\\Docks\\CPOC\\chime.wav",
101 "Sounds\\RELEASE.wav",
104 "Sounds\\flap motor.wav",
106 "Sounds\\cargo-open.wav",
108 "Sounds\\cargo-close.wav",
110 "Sounds\\GEARUP.wav",
112 "Sounds\\GEARDOWN.wav",
114 "Sounds\\Ambient\\mining.wav",
115 "Sounds\\Ambient\\waveloop.wav",
116 "Sounds\\Ambient\\AlgaeFarmPumps.wav",
117 "Sounds\\Ambient\\IndustrialDistrict.wav",
118 "Sounds\\Fireworks\\launch1.wav",
119 "Sounds\\Fireworks\\launch2.wav",
120 "Sounds\\Fireworks\\launch3.wav",
121 "Sounds\\Fireworks\\explode1.wav",
122 "Sounds\\Fireworks\\explode2.wav",
123 "Sounds\\Fireworks\\explode3.wav",
124 "Sounds\\sonicboom.wav",
125 "Sounds\\bnsplas1.wav",
126 "Sounds\\bnsplas2.wav",
127 "Sounds\\bncrash1.wav",
128 "Sounds\\bncrash2.wav",
129 "Sounds\\int_wingbreak01.wav",
130 "Sounds\\int_wingbreak02.wav",
131 "Sounds\\int_tailbreak01.wav",
132 "Sounds\\int_tailbreak02.wav",
133 "Sounds\\collision.wav",
134 "Sounds\\smallcollide.wav",
135 "Sounds\\tireskid.wav",
136 "Sounds\\gearshift.wav",
137 "Sounds\\geargrind.wav",
138 "Sounds\\jsplash1.wav",
139 "Sounds\\jsplash2.wav",
140 "Sounds\\GEARAERO.wav",
141 "Sounds\\flap aero.wav",
142 "Sounds\\doppler.wav",
143 "Sounds\\doppler2.wav",
146 "Sounds\\MammothHorn.wav",
147 "Sounds\\steerhead_horn.wav",
148 "Sounds\\steerhead_reverse.wav",
149 "Sounds\\steerhead_brakeon.wav",
150 "Sounds\\steerhead_brakeoff.wav",
151 "Sounds\\MammothBackup.wav",
152 "Sounds\\MammothBrakeOn.wav",
153 "Sounds\\MammothBrakeOff.wav",
154 "Sounds\\police-chirp.wav",
155 "Sounds\\rumble1.wav",
156 "Sounds\\ground-scrape-loop.wav",
157 "Sounds\\ground-scrape-stop.wav",
158 "Sounds\\road-noise-loop.wav",
160 "Sounds\\People\\bodyhit.wav",
163 "Sounds\\Holidays\\halloween1.wav",
164 "Sounds\\Holidays\\halloween2.wav",
166 "Sounds\\Explosions\\fuzerhit.wav",
167 "Sounds\\Explosions\\sinkerhit.wav",
168 "Sounds\\Explosions\\explode_planet_ground1.wav",
169 "Sounds\\Explosions\\explode_planet_ground2.wav",
170 "Sounds\\Explosions\\explode_planet_ground3.wav",
171 "Sounds\\Explosions\\Sputter.wav",
172 "Sounds\\Explosions\\sinkerint.wav",
173 "Sounds\\Explosions\\encrash1.wav",
174 "Sounds\\Explosions\\8000.wav",
175 "Sounds\\Explosions\\shockwave.mp3",
177 "Sounds\\Weapons\\fuzerfire.wav",
178 "Sounds\\Weapons\\sinkerLaunch.wav",
179 "Sounds\\Weapons\\missile_launch2.wav",
181 "Sounds\\Radio\\radiocut1.wav",
182 "Sounds\\Radio\\radiocut2.wav",
183 "Sounds\\Radio\\radiocut3.wav",
184 "Sounds\\Radio\\radiocut4.wav",
185 "Sounds\\Radio\\radiocut5.wav",
186 "Sounds\\Radio\\radiocut6.wav",
188 "Sounds\\Radio\\carrier0.mp3",
189 "Sounds\\Radio\\carrier1.mp3",
190 "Sounds\\Radio\\carrier2.mp3",
191 "Sounds\\Radio\\carrier3.mp3",
192 "Sounds\\Radio\\carrier4.mp3",
193 "Sounds\\Radio\\carrier5.mp3",
194 "Sounds\\Radio\\carrier6.mp3",
195 "Sounds\\Radio\\carrier7.mp3",
196 "Sounds\\Radio\\carrier8.mp3",
197 "Sounds\\Radio\\carrier9.mp3",
198 "Sounds\\Radio\\carrier10.mp3",
199 "Sounds\\Radio\\carrier11.mp3",
201 "Sounds\\Radio\\stationid2.mp3" 208 if (HIWORD(BASS_FX_GetVersion()) != BASSVERSION)
211 sprintf_s(msg, 99,
"FX version does not match BASS version: %i", BASSVERSION);
212 Trace(msg, Logger::Level::Error);
223 BASS_DEVICEINFO info;
224 while (BASS_GetDeviceInfo(count, &info))
226 if (info.flags & BASS_DEVICE_ENABLED)
234 swprintf_s(guidText, 64, L
"%S", &info.driver[17]);
236 if (CLSIDFromString(guidText, &clsid) == NOERROR)
264 Trace(
"Loading legacy sound driver...");
266 Trace(
"Loading comms sound driver...");
268 Trace(
"Loading VMU sound driver...");
270 Trace(
"Loading radio sound driver...");
293 StringFromGUID2(deviceConfig->
guid, guidText, 64);
295 sprintf_s(msg, 99,
"Could not locate previous configuration: %S", guidText);
296 Trace(msg, Logger::Level::Error);
301 MessageBox(DXUTGetHWND(), L
"Could not find one of your sound devices!", L
"Initialize Sound Device", MB_ICONWARNING | MB_OK);
311 if (!BASS_Init(deviceConfig->
bassDevice, 44100, 0, DXUTGetHWND(),
nullptr))
313 if (BASS_ErrorGetCode() != BASS_ERROR_ALREADY)
316 sprintf_s(msg, 199,
"BASS_Init failed (%i) on device: %s", BASS_ErrorGetCode(),
deviceNames.at(deviceConfig->
bassDevice).c_str());
317 Trace(msg, Logger::Level::Error);
319 sprintf_s(msg, 199,
"Could not initialize your sound device: %s",
deviceNames.at(deviceConfig->
bassDevice).c_str());
321 MessageBoxA(DXUTGetHWND(), msg,
"Sound Device Failed", MB_ICONWARNING | MB_OK);
331 deviceConfig->
bassDevice =
static_cast<char>(BASS_GetDevice());
334 Trace(
"Could not find a default sound device!", Logger::Level::Debug);
337 MessageBox(DXUTGetHWND(), L
"Could not find a default sound device!", L
"Initialize Sound Device", MB_ICONWARNING | MB_OK);
377 Trace(
"Shutting down BASS...");
382 if (!BASS_Free() && BASS_ErrorGetCode() != BASS_ERROR_INIT)
385 sprintf_s(msg, 99,
"BASS_Free(%i): %i", i, BASS_ErrorGetCode());
386 Trace(msg, Logger::Level::Error);
398 sprintf_s(newmsg, 999,
"SOUND: %s", msg);
413 comms = BASS_StreamCreateFile(
true, static_cast<const void*>(data), 0, length, 0);
417 sprintf_s(msg, 99,
"BASS_StreamCreateFile: %i", BASS_ErrorGetCode());
418 Trace(msg, Logger::Level::Error);
427 Trace(msg, Logger::Level::Error);
432 #pragma region Digital Signal Processing 433 const HFX setFx1 = BASS_ChannelSetFX(
comms, BASS_FX_BFX_BQF, 1);
437 sprintf_s(msg, 99,
"BASS_ChannelSetFX1 error: %i", BASS_ErrorGetCode());
438 Trace(msg, Logger::Level::Error);
441 BASS_BFX_BQF highPass;
442 highPass.lFilter = BASS_BFX_BQF_HIGHPASS;
443 highPass.fCenter = 400;
445 highPass.fBandwidth = 1;
448 highPass.lChannel = BASS_BFX_CHANALL;
449 if (!BASS_FXSetParameters(setFx1, &highPass))
452 sprintf_s(msg, 99,
"BASS_FXSetParameters1 error: %i", BASS_ErrorGetCode());
453 Trace(msg, Logger::Level::Error);
456 HFX setFx2 = BASS_ChannelSetFX(
comms, BASS_FX_BFX_BQF, 2);
460 sprintf_s(msg, 99,
"BASS_ChannelSetFX2 error: %i", BASS_ErrorGetCode());
461 Trace(msg, Logger::Level::Error);
464 BASS_BFX_BQF lowPass;
465 lowPass.lFilter = BASS_BFX_BQF_LOWPASS;
466 lowPass.fCenter = 2000;
467 lowPass.lChannel = BASS_BFX_CHANALL;
469 lowPass.fBandwidth = 1;
472 if (!BASS_FXSetParameters(setFx2, &lowPass))
475 sprintf_s(msg, 99,
"BASS_FXSetParameters2 error: %i", BASS_ErrorGetCode());
476 Trace(msg, Logger::Level::Error);
481 if (!BASS_ChannelPlay(
comms,
true))
484 sprintf_s(msg, 99,
"PlayAudioData BASS_ChannelPlay error: %i", BASS_ErrorGetCode());
485 Trace(msg, Logger::Level::Error);
489 void Sound::GlobalAttenuate(
float prmGaTimeToFadeOut,
float prmGaTimeToHold,
float prmGaTimeToFadeIn,
int soundEnum,
float prmExTimeToFadeIn,
float prmExTimeToHold,
float prmExTimeToFadeOut,
float volumeAdj)
521 Trace(msg, Logger::Level::Error);
532 Trace(msg, Logger::Level::Error);
543 Trace(msg, Logger::Level::Error);
555 if (!BASS_ChannelSetAttribute(
sound_channel[soundEnum], BASS_ATTRIB_VOL, volume))
558 sprintf_s(msg, 99,
"ChangeVolume BASS_ChannelSetAttribute(%i) vol %.1f failed: %i", soundEnum, volume, BASS_ErrorGetCode());
559 Trace(msg, Logger::Level::Error);
585 Trace(
"Sound::Reset");
606 void Sound::PlayEx(
int soundEnum,
bool loop,
float volume,
float frequencyMod,
float pan,
bool restart)
617 sprintf_s(msg,
sizeof msg,
"PlayEx BASS_SetDevice(%i): %i", soundEnum, BASS_ErrorGetCode());
618 Trace(msg, Logger::Level::Error);
628 sprintf_s(msg,
sizeof msg,
"PlayEx BASS_SampleGetChannel(%i) failed: %i", soundEnum, BASS_ErrorGetCode());
629 Trace(msg, Logger::Level::Error);
632 const QWORD length = BASS_ChannelGetLength(
sound_channel[soundEnum], BASS_POS_BYTE);
638 if (BASS_ChannelFlags(
sound_channel[soundEnum], BASS_SAMPLE_LOOP, BASS_SAMPLE_LOOP) == -1)
640 sprintf_s(msg,
sizeof msg,
"PlayEx BASS_ChannelFlags(%i) failed: %i", soundEnum, BASS_ErrorGetCode());
641 Trace(msg, Logger::Level::Error);
646 #pragma region Volume 649 sprintf_s(msg,
sizeof msg,
"PlayEx BASS_ChannelSetAttribute(%i) clamped volume: %.1f", soundEnum, volume);
650 Trace(msg, Logger::Level::Warn);
653 else if (volume < 0.0f)
655 sprintf_s(msg,
sizeof msg,
"PlayEx BASS_ChannelSetAttribute(%i) clamped volume: %.1f", soundEnum, volume);
656 Trace(msg, Logger::Level::Warn);
666 sprintf_s(msg,
sizeof msg,
"PlayEx sound_config[%i]->volume clamped volume: %.1f", soundEnum,
sound_config[soundEnum]->volume);
667 Trace(msg, Logger::Level::Warn);
672 sprintf_s(msg,
sizeof msg,
"PlayEx globalAttenuate clamped volume: %.1f",
globalAttenuate);
673 Trace(msg, Logger::Level::Warn);
684 if (!BASS_ChannelSetAttribute(
sound_channel[soundEnum], BASS_ATTRIB_VOL, volume))
686 sprintf_s(msg,
sizeof msg,
"PlayEx BASS_ChannelSetAttribute(%i) vol %.1f soundConfigVol %.1f globalAtt %.1f failed: %i", soundEnum, volume,
sound_config[soundEnum]->volume,
globalAttenuate, BASS_ErrorGetCode());
688 Trace(msg, Logger::Level::Error);
693 #pragma region Frequency 694 if (frequencyMod != 1.0f)
697 if (!BASS_ChannelSetAttribute(
sound_channel[soundEnum], BASS_ATTRIB_FREQ, frequency))
699 sprintf_s(msg,
sizeof msg,
"PlayEx BASS_ChannelSetAttribute(%i) freq %.1f failed: %i", soundEnum, frequency, BASS_ErrorGetCode());
700 Trace(msg, Logger::Level::Error);
701 sprintf_s(msg,
sizeof msg,
"--- minrate %.1f original %.1f maxrate %.1f mod %.1f",
minrate,
sound_rate[soundEnum],
maxrate, frequencyMod);
702 Trace(msg, Logger::Level::Debug);
708 if (!BASS_ChannelSetAttribute(
sound_channel[soundEnum], BASS_ATTRIB_FREQ, 0))
710 sprintf_s(msg,
sizeof msg,
"PlayEx BASS_ChannelSetAttribute(%i) freq ORIG failed: %i", soundEnum, BASS_ErrorGetCode());
711 Trace(msg, Logger::Level::Error);
713 Trace(msg, Logger::Level::Debug);
723 else if (pan < -1.0f)
726 if (!BASS_ChannelSetAttribute(
sound_channel[soundEnum], BASS_ATTRIB_PAN, pan))
728 sprintf_s(msg,
sizeof msg,
"PlayEx BASS_ChannelSetAttribute(%i) pan %.1f failed: %i", soundEnum, pan, BASS_ErrorGetCode());
729 Trace(msg, Logger::Level::Error);
734 if (!BASS_ChannelPlay(
sound_channel[soundEnum], !loop && restart))
736 const int error = BASS_ErrorGetCode();
737 sprintf_s(msg,
sizeof msg,
"PlayEx BASS_ChannelPlay (%i) error %i!", soundEnum, error);
738 Trace(msg, Logger::Level::Error);
739 if (error == BASS_ERROR_UNKNOWN || error == BASS_ERROR_BUFLOST)
743 Trace(
"Resetting...", Logger::Level::Error);
745 Trace(
"Playing again...", Logger::Level::Error);
746 PlayEx(soundEnum, loop, volume, frequencyMod, pan, restart);
748 else if (error == BASS_ERROR_START)
751 BASS_ChannelPlay(
sound_channel[soundEnum], !loop && restart);
760 s->
Trace(
"Sound::MetaData received!");
765 strcpy_s(icy, 999, BASS_ChannelGetTags(s->
radio, BASS_TAG_META));
772 sscanf_s(s->
metadata,
"StreamTitle='%[^']", msg,
sizeof(msg));
773 if (strlen(msg) > 76)
775 msg[74] = msg[75] = msg[76] =
'.';
811 sprintf_s(msg, 99,
"Sound::AdvanceStage BASS_ChannelSetPos %i: %i", s->
musicstage, BASS_ErrorGetCode());
819 sprintf_s(msg, 99,
"Sound::AdvanceStage BASS_ChannelSetPos %i: %i", s->
musicstage, BASS_ErrorGetCode());
827 sprintf_s(msg, 99,
"Sound::AdvanceStage BASS_ChannelSetPos %i: %i", s->
musicstage, BASS_ErrorGetCode());
835 sprintf_s(msg, 99,
"Sound::AdvanceStage BASS_ChannelRemoveSync %i: %i", s->
musicstage, BASS_ErrorGetCode());
841 sprintf_s(msg, 99,
"Sound::AdvanceStage BASS_StreamFree %i: %i", s->
musicstage, BASS_ErrorGetCode());
854 sprintf_s(msg,
sizeof(msg),
"BASS_ChannelRemoveSync %i: %i", s->
musicstage, BASS_ErrorGetCode());
864 sprintf_s(msg, 99,
"Sound::AdvanceStage BASS_StreamFree %i: %i", s->
musicstage, BASS_ErrorGetCode());
883 BASS_SYNC_POS | BASS_SYNC_MIXTIME,
890 BASS_SYNC_POS | BASS_SYNC_MIXTIME,
905 sprintf_s(msg,
sizeof(msg),
"BASS_ChannelSetSync %i: %i", s->
musicstage, BASS_ErrorGetCode());
913 if (newDevice ==
nullptr)
930 BASS_SetDevice(oldsounddevice);
938 sprintf_s(msg, 99,
"BASS_SampleFree(%i): %i", soundEnum, BASS_ErrorGetCode());
939 Trace(msg, Logger::Level::Error);
958 sprintf_s(msg, 99,
"BASS_SampleLoad(%i), \"%s\"): %i", soundEnum,
sound_path[soundEnum], BASS_ErrorGetCode());
959 Trace(msg, Logger::Level::Error);
965 WCHAR wstr[MAX_PATH];
966 swprintf_s(wstr, MAX_PATH, L
"%S",
sound_path[soundEnum]);
972 sound_rate[soundEnum] =
static_cast<float>(info.freq);
977 sprintf_s(msg, 99,
"BASS_SampleGetInfo(%i), \"%s\"): %i", soundEnum,
sound_path[soundEnum], BASS_ErrorGetCode());
978 Trace(msg, Logger::Level::Error);
985 if (device ==
nullptr)
997 if (
sound_device[soundEnum] == oldsounddevice && path !=
nullptr && !force)
1002 BASS_SetDevice(oldsounddevice);
1010 sprintf_s(msg, 99,
"BASS_SampleFree(%i): %i", soundEnum, BASS_ErrorGetCode());
1011 Trace(msg, Logger::Level::Error);
1026 sound_sample[soundEnum] = BASS_SampleLoad(
false, path, 0L, 0L, 1, 0L);
1030 sprintf_s(msg, 99,
"BASS_SampleLoad(%i), \"%s\"): %i", soundEnum, path, BASS_ErrorGetCode());
1031 Trace(msg, Logger::Level::Error);
1035 WCHAR wstr[MAX_PATH];
1036 swprintf_s(wstr, MAX_PATH, L
"%S", path);
1040 if (BASS_SampleGetInfo(
sound_sample[soundEnum], &info))
1042 sound_rate[soundEnum] =
static_cast<float>(info.freq);
1047 sprintf_s(msg, 99,
"BASS_SampleGetInfo(%i), \"%s\"): %i", soundEnum,
sound_path[soundEnum], BASS_ErrorGetCode());
1048 Trace(msg, Logger::Level::Error);
1064 if (game->viewscreen->outside)
1067 return game->viewscreen->ptrPropulsion->staticDensity;
1080 Trace(
"BASS_SetDevice failed on LoadSounds() legacy device", Logger::Level::Error);
1085 g_pSoundIntro = BASS_StreamCreateFile(
false,
"Sounds\\ambience.ogg", 0, 0, BASS_STREAM_PRESCAN);
1089 sprintf_s(msg, 99,
"LoadSounds BASS_StreamCreateFile error: %i", BASS_ErrorGetCode());
1090 Trace(msg, Logger::Level::Error);
1093 if (!BASS_ChannelSetAttribute(
g_pSoundIntro, BASS_ATTRIB_VOL, 0.5f))
1096 sprintf_s(msg, 99,
"LoadSounds BASS_ChannelSetAttribute error: %i", BASS_ErrorGetCode());
1097 Trace(msg, Logger::Level::Error);
1103 sprintf_s(msg, 99,
"LoadSounds BASS_ChannelPlay error: %i", BASS_ErrorGetCode());
1104 Trace(msg, Logger::Level::Error);
1111 sprintf_s(msg, 99,
"LoadSounds BASS_ChannelSetSync error: %i", BASS_ErrorGetCode());
1112 Trace(msg, Logger::Level::Error);
1135 if (datapacket.array == 0)
1137 Trace(
"Should not be getting LegacySoundRequestUniverse calls with our slot!",
Logger::Error);
1141 if (datapacket.array >= MAX_SCAN)
1143 Trace(
"LegacySoundRequestUniverse called with out-of-bounds array value!",
Logger::Error);
1149 Trace(
"LegacySoundRequestUniverse got a call for a vehicle that was not visible or was not active!",
Logger::Warn);
1153 if (datapacket.f_x == 0.0f)
1159 D3DXVECTOR3 source, dest;
1166 D3DXVECTOR3 result = source - dest;
1172 float newvolume = 1.0f - tfal;
1177 if (_isnan(closing) || isinf(closing))
1183 if (_isnan(closing) || isinf(closing))
1192 if (result.z != 0.0f)
1194 bear1 = D3DXToDegree(atanf(result.x / result.z));
1195 float mark1 = D3DXToDegree(atanf(result.y / result.z));
1196 float f_temp = sqrtf(mark1 * mark1 + bear1 * bear1);
1197 if (f_temp > 180.0f)
1199 f_temp = 180.0f / f_temp;
1202 if (result.z > 0.0f)
1214 const float pan = sinf(bear1);
1216 if (datapacket.f_y == 0.0f)
1229 else if (datapacket.f_y == 1.0f)
1231 else if (datapacket.f_y == 2.0f)
1233 else if (datapacket.f_y == 3.0f)
1235 else if (datapacket.f_y == 4.0f)
1241 else if (datapacket.f_x == 1.0f)
1246 D3DXVECTOR3 dest, destvel;
1252 else if (
playerships[0].reference <= REF_BUILDING)
1259 dest.x = dest.y = dest.z = 0.0f;
1263 D3DXVECTOR3 result = source - dest;
1264 float f_temp = D3DXVec3Length(&result);
1266 if (f_temp < 160.0f)
1269 f_temp = 1.0f - f_temp;
1273 Trace(
"Sonic boom detected!");
1277 D3DXVECTOR3 resultvel = sourcevel - destvel;
1278 const float delay = D3DXVec3Length(&result) / D3DXVec3Length(&resultvel);
1301 BASS_StreamFree(
radio);
1309 const DWORD channelStatus = BASS_ChannelIsActive(
radio);
1317 Trace(
"Lost stream or stream ended... reconnecting...", Logger::Level::Warn);
1319 Trace(
"Changed radio stations...");
1324 BASS_StreamFree(
radio);
1327 radio = BASS_StreamCreateURL(
"http://81.88.36.42:8010", 0, BASS_STREAM_STATUS,
nullptr,
nullptr);
1332 const int hr = BASS_ErrorGetCode();
1334 sprintf_s(msg, 99,
"BASS_StreamCreateURL failed (%i) for station: %i", hr,
station);
1335 Trace(msg, Logger::Level::Error);
1340 if (!BASS_ChannelPlay(
radio, FALSE))
1343 sprintf_s(msg, 99,
"FrameMoveAAC BASS_ChannelPlay error: %i", BASS_ErrorGetCode());
1344 Trace(msg, Logger::Level::Error);
1356 BASS_ChannelSetSync(
radio, BASS_SYNC_MIXTIME | BASS_SYNC_META, NULL,
MetaData,
this);
1363 BASS_StreamFree(
radio);
1426 int oldSoundEnum = -1, oldArray = -1;
1427 float oldVolume = 0,
oldPan = 0, oldFreqMod = 0;
1430 if (
loopingeffects.at(t).soundEnum != oldSoundEnum && oldSoundEnum != -1)
1451 D3DXVECTOR3 source, sourceVel;
1463 D3DXVECTOR3 dest, destVel;
1475 D3DXVECTOR3 result = source - dest;
1476 D3DXVECTOR3 resultVel = sourceVel - destVel;
1477 float f_temp = D3DXVec3Length(&result);
1480 float newVolume = sqrtf(f_temp / 0.5f);
1481 if (newVolume > 1.0f)
1483 newVolume = 1.0f - newVolume;
1486 if (newVolume < oldVolume)
1488 oldVolume = newVolume;
1491 oldFreqMod = D3DXVec3Length(&resultVel);
1497 if (result.z != 0.0f)
1499 bear1 = D3DXToDegree(atanf(result.x / result.z));
1500 const float mark1 = D3DXToDegree(atanf(result.y / result.z));
1501 f_temp = sqrtf(mark1 * mark1 + bear1 * bear1);
1502 if (f_temp > 180.0f)
1504 f_temp = 180.0f / f_temp;
1507 if (result.z > 0.0f)
1525 else if (oldSoundEnum != -1)
1536 float closing1 = 1.0f, closing2 = 1.0f;
1537 float newvolume1 = 0.0f, newvolume2 = 0.0f;
1538 float pan = 0.0f, pan2 = 0.0f;
1547 D3DXVECTOR3 ourPosition, ourVelocity;
1560 for (
short t = 1; t < MAX_SCAN; t++)
1570 const float realDistance = D3DXVec3Length(&realPositionDifference);
1575 const D3DXVECTOR3 theirSoundPosition = (
playerships[t].
position - theirVelocity * delaySeconds);
1577 D3DXVECTOR3 soundPositionDifference = ourPosition - theirSoundPosition;
1578 const float soundDistance = D3DXVec3Length(&soundPositionDifference);
1586 case VehicleType::W6Manx: newtons = 1029817.0f;
break;
1587 case VehicleType::E10: newtons = 2762909.0f;
break;
1588 case VehicleType::E11: newtons = 3134393.0f;
break;
1589 case VehicleType::P13: newtons = 1636364.0f;
break;
1590 case VehicleType::T19: newtons = 246795.0f;
break;
1591 case VehicleType::A4: newtons = 1388073.0f;
break;
1592 default: newtons = 0.0f;
break;
1598 const float percentDoppler2 =
Clamp(min((thrust - 513000.0f) / 516817.0f, 1.0f), 0, 1);
1602 const float percentDoppler = 1.0f;
1605 if (soundDistance < 10.0f && percentDoppler > 0)
1611 const float proposedvolume = min(tfal * percentDoppler * thrust / 513000.0f, 1);
1613 if (proposedvolume > newvolume1)
1615 newvolume1 = proposedvolume;
1618 D3DXVECTOR3 tempvec = (theirSoundPosition + theirVelocity) - (ourPosition + ourVelocity);
1619 closing1 = soundDistance - D3DXVec3Length(&tempvec);
1624 if (soundPositionDifference.z != 0.0f)
1626 bear1 = D3DXToDegree(atanf(soundPositionDifference.x / soundPositionDifference.z));
1627 const float mark1 = D3DXToDegree(atanf(soundPositionDifference.y / soundPositionDifference.z));
1629 float f_temp = sqrtf(mark1 * mark1 + bear1 * bear1);
1630 if (f_temp > 180.0f)
1632 f_temp = 180.0f / f_temp;
1635 if (soundPositionDifference.z > 0.0f)
1653 pan = sinf(D3DXToRadian(bear1));
1658 if (soundDistance < 80.0f && percentDoppler2 > 0)
1660 float proposedvolume = powf(4.4f / soundDistance, 2.0f);
1661 proposedvolume *= (thrust - 513000.0f) / (7607000.0f - 513000.0f);
1662 proposedvolume *= percentDoppler2;
1664 proposedvolume =
Clamp(proposedvolume, 0, 1);
1668 if (proposedvolume > newvolume2)
1670 newvolume2 = proposedvolume;
1673 D3DXVECTOR3 tempvec = (theirSoundPosition + theirVelocity) - (ourPosition + ourVelocity);
1674 closing2 = soundDistance - D3DXVec3Length(&tempvec);
1679 if (soundPositionDifference.z != 0.0f)
1681 bear1 = D3DXToDegree(atanf(soundPositionDifference.x / soundPositionDifference.z));
1682 float mark1 = D3DXToDegree(atanf(soundPositionDifference.y / soundPositionDifference.z));
1683 float f_temp = sqrtf(mark1 * mark1 + bear1 * bear1);
1684 if (f_temp > 180.0f)
1686 f_temp = 180.0f / f_temp;
1689 if (soundPositionDifference.z > 0.0f)
1701 pan2 = sinf(D3DXToRadian(bear1));
1711 newvolume1 = min(newvolume1, 1);
1712 float f_temp = (newvolume1 -
oldvolume) * elapsedTime;
1713 const float volume =
oldvolume + f_temp;
1718 f_temp = (pan -
oldPan) * elapsedTime;
1719 const float finalPan =
oldPan + f_temp;
1737 newvolume2 = min(newvolume2, 1);
1738 float f_temp = (newvolume2 -
oldvolume2) * elapsedTime;
1744 f_temp = (pan2 -
oldPan2) * elapsedTime;
1745 const float finalPan =
oldPan2 + f_temp;
1773 float panfloat = 0.0f;
1774 if (relativewind.z != 0.0f)
1776 panfloat = atanf(relativewind.x / relativewind.z) / D3DX_HALFPI;
1777 if (panfloat < -1.0f)
1779 else if (panfloat > 1.0f)
1786 velocity = D3DXVec3Length(&relativewind);
1792 float percentvelocity =
velocity / 0.135f;
1793 if (percentvelocity > 1.0f)
1794 percentvelocity = 1.0f;
1796 const float freq = 1.0f + percentvelocity;
1798 const float sqrtvelocity = percentvelocity * percentvelocity;
1816 #pragma region SOUND BARRIER and SONIC BOOM 1818 static float oldBusMach = 0.0f;
1819 if (oldBusMach != 0.0f)
1821 if ((oldBusMach < 1.0f && game->bus->Mach >= 1.0f) ||
1825 command.
name =
"AuralSoundBarrier";
1833 static float passedSoundBarrierBoom =
false;
1836 if (!passedSoundBarrierBoom)
1838 passedSoundBarrierBoom =
true;
1840 SClientPacket outpacket;
1841 outpacket.type = 23;
1842 outpacket.f_x = 1.0f;
1843 outpacket.f_y = 0.0f;
1844 outpacket.f_z = 0.0f;
1845 outpacket.f_w = 0.0f;
1849 else if (passedSoundBarrierBoom)
1851 passedSoundBarrierBoom =
false;
1859 rateofchange *= 0.6f * elapsedTime;
1862 float targetintensity;
1866 targetintensity = 2.0f;
1869 static float currentintensity = targetintensity;
1870 if (currentintensity < targetintensity)
1872 currentintensity += rateofchange;
1873 if (currentintensity > targetintensity)
1874 currentintensity = targetintensity;
1876 else if (currentintensity > targetintensity)
1878 currentintensity -= rateofchange;
1879 if (currentintensity < targetintensity)
1880 currentintensity = targetintensity;
1884 float percentvelocity =
velocity / 0.135f;
1885 if (percentvelocity > 1.0f)
1886 percentvelocity = 1.0f;
1888 float frequency_mod = 1.0f + percentvelocity;
1890 float f_temp = sqrtf((currentintensity - 2.0f) / 14.0f);
1891 float volume = percentvelocity * f_temp;
1893 static short precipplay = 0;
1894 short oldprecipplay = precipplay;
1896 if (currentintensity <= 2.0f)
1898 else if (currentintensity >= 8.0f)
1900 else if (currentintensity >= 10.0f)
1902 else if (currentintensity >= 12.0f)
1904 else if (currentintensity >= 14.0f)
1909 if (precipplay >= 0)
1912 if (precipplay != oldprecipplay)
1914 if (precipplay != 0)
1916 if (precipplay != 1)
1918 if (precipplay != 2)
1920 if (precipplay != 3)
1922 if (precipplay != 4)
1930 sprintf_s(msg, 99,
"AddDelayedSound adding sound %i with delay: %f", soundEnum, delay);
1935 PlayEx(soundEnum,
false, volume);
1940 delayedEffect.
delay = delay;
1942 delayedEffect.
volume = volume;
1958 loopingEffect.
array = array;
2858 Trace(msg, Logger::Level::Error);
HCHANNEL sound_channel[SOUND_ENUMERATION]
int excludeFromGlobalAttenuate
void LoadCockpitSound(int soundEnum, const char *path, bool force, SoundConfig *device=nullptr)
std::vector< Command > commandStream
float GetLength(int soundEnum)
void SendToServer(void *pData, DWORD dwSize, bool bGuaranteed, PacketOrdering order=ORDERING_NONE) const
std::vector< GUID > deviceGuids
s_network_objects playerships[MAX_SCAN]
std::vector< Sdelayedeffects > delayedeffects
SoundConfig soundConfigLegacy
SoundConfig * sound_config[SOUND_ENUMERATION]
void ToggleFullScreen(bool goFullScreen)
void FrameMoveDopplerEffects(float elapsedTime)
void InitDevice(SoundConfig *deviceConfig)
Sound(GameClass *gameptr)
static char * sound_path[SOUND_ENUMERATION]
void ChangeCockpit(bool force)
const GUID MYGUID_DEFAULT
void PlayAudioData(unsigned char *data, size_t length)
std::vector< std::string > deviceNames
propulsion * ptrPropulsion
void LegacySoundRequestUniverse(SServerPacket datapacket)
void PrecipWindSoundBarrier(D3DXVECTOR3 relativewind, float elapsedTime)
void AddLoopingVehicleSound(int soundEnum, unsigned char array)
float Clamp(float val, float min, float max)
void LoadSound(int soundEnum, SoundConfig *device=nullptr)
SoundConfig soundConfigComms
static void CALLBACK AdvanceStage(HSYNC handle, DWORD channel, DWORD data, void *user)
float sound_rate[SOUND_ENUMERATION]
void AddDelayedSound(int soundEnum, float delay, float volume=1.0f)
std::vector< Sloopingeffects > loopingeffects
void FrameMove(float elapsedTime)
float GetAttenuation(bool applyDensity) const
void Log(const char *msg, Level level=Info, int errorCode=0)
void GlobalAttenuate(float prmGaTimeToFadeOut, float prmGaTimeToHold, float prmGaTimeToFadeIn, int soundEnum, float prmExTimeToFadeIn, float prmExTimeToHold, float prmExTimeToFadeOut, float volumeAdj=1.0f)
bool myfunction(Sloopingeffects i, Sloopingeffects j)
void Trace(const char *msg, Logger::Level severity=Logger::Level::Info) const
float Play(int soundEnum)
HSAMPLE sound_sample[SOUND_ENUMERATION]
SoundConfig soundConfigRadio
char stationIdentification
float sound_volume[SOUND_ENUMERATION]
float sound_length[SOUND_ENUMERATION]
void FrameMoveDelayedEffects(float elapsedTime)
void PlayEx(int soundEnum, bool loop, float volume=1.0f, float frequencyMod=1.0f, float pan=0.0f, bool restart=true)
void RemoveLoopingVehicleSound(int soundEnum, unsigned char array)
float GetTurbidity() const
void AddToCallStack(const char *msg)
SoundConfig soundConfigComputer
char sound_device[SOUND_ENUMERATION]
void LoadSounds(short instage)
static void TouchFile(const WCHAR *str)
static void CALLBACK MetaData(HSYNC handle, DWORD channel, DWORD data, void *user)