AudioManager.cpp 36,7 КБ
Newer Older
aap's avatar
aap включено в состав коммита
1
#include "common.h"
Sergeanur's avatar
Sergeanur включено в состав коммита
2

Filip Gawin's avatar
Filip Gawin включено в состав коммита
3
#include "AudioManager.h"
Sergeanur's avatar
Sergeanur включено в состав коммита
4
#include "audio_enums.h"
Filip Gawin's avatar
Filip Gawin включено в состав коммита
5

Sergeanur's avatar
Sergeanur включено в состав коммита
6
#include "AudioScriptObject.h"
Filip Gawin's avatar
Filip Gawin включено в состав коммита
7
#include "MusicManager.h"
Sergeanur's avatar
Sergeanur включено в состав коммита
8
9
#include "Timer.h"
#include "DMAudio.h"
Filip Gawin's avatar
Cleanup    
Filip Gawin включено в состав коммита
10
#include "sampman.h"
Sergeanur's avatar
Sergeanur включено в состав коммита
11
12
#include "Camera.h"
#include "World.h"
Sergeanur's avatar
Sergeanur включено в состав коммита
13
#include "Entity.h"
Filip Gawin's avatar
Filip Gawin включено в состав коммита
14

Sergeanur's avatar
Sergeanur включено в состав коммита
15
cAudioManager AudioManager;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
16

Sergeanur's avatar
Sergeanur включено в состав коммита
17
18
19
#define SPEED_OF_SOUND 343.f
#define TIME_SPENT 50

Filip Gawin's avatar
Filip Gawin включено в состав коммита
20
21
cAudioManager::cAudioManager()
{
Sergeanur's avatar
Sergeanur включено в состав коммита
22
	m_bIsInitialised = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
23
	m_bIsSurround = TRUE;
Sergeanur's avatar
Sergeanur включено в состав коммита
24
25
	m_fSpeedOfSound = SPEED_OF_SOUND / TIME_SPENT;
	m_nTimeSpent = TIME_SPENT;
Sergeanur's avatar
Sergeanur включено в состав коммита
26
	m_nActiveSamples = NUM_CHANNELS_GENERIC;
Sergeanur's avatar
Sergeanur включено в состав коммита
27
	m_nActiveQueue = 1;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
28
	ClearRequestedQueue();
Sergeanur's avatar
Sergeanur включено в состав коммита
29
	m_nActiveQueue = 0;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
30
31
32
	ClearRequestedQueue();
	ClearActiveSamples();
	GenerateIntegerRandomNumberTable();
Sergeanur's avatar
Sergeanur включено в состав коммита
33
	m_bDoubleVolume = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
34
#ifdef AUDIO_REFLECTIONS
Sergeanur's avatar
Sergeanur включено в состав коммита
35
	m_bDynamicAcousticModelingStatus = TRUE;
Sergeanur's avatar
Sergeanur включено в состав коммита
36
#endif
Filip Gawin's avatar
Filip Gawin включено в состав коммита
37

Sergeanur's avatar
Sergeanur включено в состав коммита
38
	for (uint32 i = 0; i < NUM_AUDIOENTITIES; i++) {
Sergeanur's avatar
Sergeanur включено в состав коммита
39
		m_asAudioEntities[i].m_bIsUsed = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
40
		m_aAudioEntityOrderList[i] = NUM_AUDIOENTITIES;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
41
	}
Sergeanur's avatar
Sergeanur включено в состав коммита
42
	m_nAudioEntitiesCount = 0;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
43
	m_FrameCounter = 0;
Sergeanur's avatar
Sergeanur включено в состав коммита
44
	m_bReduceReleasingPriority = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
45
	m_bTimerJustReset = FALSE;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
46
47
48
49
50
	m_nTimer = 0;
}

cAudioManager::~cAudioManager()
{
Sergeanur's avatar
Sergeanur включено в состав коммита
51
52
	if (m_bIsInitialised)
		Terminate();
Filip Gawin's avatar
Filip Gawin включено в состав коммита
53
54
}

Filip Gawin's avatar
Filip Gawin включено в состав коммита
55
void
Sergeanur's avatar
Sergeanur включено в состав коммита
56
cAudioManager::Initialise()
Filip Gawin's avatar
Filip Gawin включено в состав коммита
57
{
Sergeanur's avatar
Sergeanur включено в состав коммита
58
59
60
61
	if (!m_bIsInitialised) {
		PreInitialiseGameSpecificSetup();
		m_bIsInitialised = SampleManager.Initialise();
		if (m_bIsInitialised) {
Sergeanur's avatar
Sergeanur включено в состав коммита
62
#ifdef EXTERNAL_3D_SOUND
Sergeanur's avatar
Sergeanur включено в состав коммита
63
64
65
66
			m_nActiveSamples = SampleManager.GetMaximumSupportedChannels();
			if (m_nActiveSamples <= 1) {
				Terminate();
			} else {
Sergeanur's avatar
Sergeanur включено в состав коммита
67
				m_nActiveSamples--;
Sergeanur's avatar
Sergeanur включено в состав коммита
68
69
70
71
#else
			{
				m_nActiveSamples = NUM_CHANNELS_GENERIC;
#endif
Sergeanur's avatar
Sergeanur включено в состав коммита
72
73
74
75
76
				PostInitialiseGameSpecificSetup();
				InitialisePoliceRadioZones();
				InitialisePoliceRadio();
				MusicManager.Initialise();
			}
Filip Gawin's avatar
Filip Gawin включено в состав коммита
77
78
79
80
81
		}
	}
}

void
Sergeanur's avatar
Sergeanur включено в состав коммита
82
cAudioManager::Terminate()
Filip Gawin's avatar
Filip Gawin включено в состав коммита
83
{
Sergeanur's avatar
Sergeanur включено в состав коммита
84
85
86
87
	if (m_bIsInitialised) {
		MusicManager.Terminate();

		for (uint32 i = 0; i < NUM_AUDIOENTITIES; i++) {
Sergeanur's avatar
Sergeanur включено в состав коммита
88
			m_asAudioEntities[i].m_bIsUsed = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
89
			m_aAudioEntityOrderList[i] = ARRAY_SIZE(m_aAudioEntityOrderList);
Filip Gawin's avatar
Filip Gawin включено в состав коммита
90
91
		}

Sergeanur's avatar
Sergeanur включено в состав коммита
92
		m_nAudioEntitiesCount = 0;
Sergeanur's avatar
Sergeanur включено в состав коммита
93
94
		m_sAudioScriptObjectManager.m_nScriptObjectEntityTotal = 0;
		PreTerminateGameSpecificShutdown();
Filip Gawin's avatar
Filip Gawin включено в состав коммита
95

Sergeanur's avatar
Sergeanur включено в состав коммита
96
		for (uint32 i = 0; i < MAX_SFX_BANKS; i++) {
Sergeanur's avatar
Sergeanur включено в состав коммита
97
98
			if (SampleManager.IsSampleBankLoaded(i))
				SampleManager.UnloadSampleBank(i);
Filip Gawin's avatar
Filip Gawin включено в состав коммита
99
		}
Sergeanur's avatar
Sergeanur включено в состав коммита
100
101
102

		SampleManager.Terminate();

Sergeanur's avatar
Sergeanur включено в состав коммита
103
		m_bIsInitialised = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
104
		PostTerminateGameSpecificShutdown();
Filip Gawin's avatar
Filip Gawin включено в состав коммита
105
106
	}
}
Filip Gawin's avatar
Filip Gawin включено в состав коммита
107

Filip Gawin's avatar
audio7    
Filip Gawin включено в состав коммита
108
void
Sergeanur's avatar
Sergeanur включено в состав коммита
109
cAudioManager::Service()
Filip Gawin's avatar
Filip Gawin включено в состав коммита
110
{
Sergeanur's avatar
Sergeanur включено в состав коммита
111
112
113
114
	GenerateIntegerRandomNumberTable();
	if (m_bTimerJustReset) {
		ResetAudioLogicTimers(m_nTimer);
		MusicManager.ResetTimers(m_nTimer);
Sergeanur's avatar
Sergeanur включено в состав коммита
115
		m_bTimerJustReset = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
116
117
	}
	if (m_bIsInitialised) {
Sergeanur's avatar
Sergeanur включено в состав коммита
118
119
		m_bWasPaused = m_bIsPaused;
		m_bIsPaused = CTimer::GetIsUserPaused();
Sergeanur's avatar
Sergeanur включено в состав коммита
120
#ifdef AUDIO_REFLECTIONS
Sergeanur's avatar
Sergeanur включено в состав коммита
121
		UpdateReflections();
Sergeanur's avatar
Sergeanur включено в состав коммита
122
#endif
Sergeanur's avatar
Sergeanur включено в состав коммита
123
124
		ServiceSoundEffects();
		MusicManager.Service();
Filip Gawin's avatar
audio7    
Filip Gawin включено в состав коммита
125
	}
Filip Gawin's avatar
Filip Gawin включено в состав коммита
126
127
}

Sergeanur's avatar
Sergeanur включено в состав коммита
128
129
int32
cAudioManager::CreateEntity(eAudioType type, void *entity)
Filip Gawin's avatar
Filip Gawin включено в состав коммита
130
{
Sergeanur's avatar
Sergeanur включено в состав коммита
131
132
133
134
135
136
	if (!m_bIsInitialised)
		return AEHANDLE_ERROR_NOAUDIOSYS;
	if (!entity)
		return AEHANDLE_ERROR_NOENTITY;
	if (type >= TOTAL_AUDIO_TYPES)
		return AEHANDLE_ERROR_BADAUDIOTYPE;
Sergeanur's avatar
Sergeanur включено в состав коммита
137
138
139
140

#ifdef FIX_BUGS
	// since sound could still play after entity deletion let's make sure we don't override one that is in use
	// find all the free entity IDs that are being used by queued samples
Sergeanur's avatar
Sergeanur включено в состав коммита
141
	int32 stillUsedEntities[NUM_CHANNELS_GENERIC * NUM_SOUND_QUEUES];
Sergeanur's avatar
Sergeanur включено в состав коммита
142
143
	uint32 stillUsedEntitiesCount = 0;

Sergeanur's avatar
Sergeanur включено в состав коммита
144
145
146
	for (uint8 i = 0; i < NUM_SOUND_QUEUES; i++)
		for (uint8 j = 0; j < m_nRequestedCount[i]; j++) {
			tSound &sound = m_aRequestedQueue[i][m_aRequestedOrderList[i][j]];
Sergeanur's avatar
Sergeanur включено в состав коммита
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
			if (sound.m_nEntityIndex < 0) continue;
			if (!m_asAudioEntities[sound.m_nEntityIndex].m_bIsUsed) {
				bool found = false;
				for (uint8 k = 0; k < stillUsedEntitiesCount; k++) {
					if (stillUsedEntities[k] == sound.m_nEntityIndex) {
						found = true;
						break;
					}
				}
				if (!found)
					stillUsedEntities[stillUsedEntitiesCount++] = sound.m_nEntityIndex;
			}
		}
#endif

Sergeanur's avatar
Sergeanur включено в состав коммита
162
	for (uint32 i = 0; i < NUM_AUDIOENTITIES; i++) {
Sergeanur's avatar
Sergeanur включено в состав коммита
163
		if (!m_asAudioEntities[i].m_bIsUsed) {
Sergeanur's avatar
Sergeanur включено в состав коммита
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#ifdef FIX_BUGS
			// skip if ID is still used by queued sample
			bool skip = false;
			for (uint8 j = 0; j < stillUsedEntitiesCount; j++) {
				if (stillUsedEntities[j] == i) {
					//debug("audio entity %i still used, skipping\n", i);
					skip = true;
					break;
				}
			}
			if (skip)
				continue;
#endif

Sergeanur's avatar
Sergeanur включено в состав коммита
178
179
			m_asAudioEntities[i].m_bIsUsed = TRUE;
			m_asAudioEntities[i].m_bStatus = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
180
181
182
183
184
185
186
			m_asAudioEntities[i].m_nType = type;
			m_asAudioEntities[i].m_pEntity = entity;
			m_asAudioEntities[i].m_awAudioEvent[0] = SOUND_NO_SOUND;
			m_asAudioEntities[i].m_awAudioEvent[1] = SOUND_NO_SOUND;
			m_asAudioEntities[i].m_awAudioEvent[2] = SOUND_NO_SOUND;
			m_asAudioEntities[i].m_awAudioEvent[3] = SOUND_NO_SOUND;
			m_asAudioEntities[i].m_AudioEvents = 0;
Sergeanur's avatar
Sergeanur включено в состав коммита
187
			m_aAudioEntityOrderList[m_nAudioEntitiesCount++] = i;
Sergeanur's avatar
Sergeanur включено в состав коммита
188
			return i;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
189
190
		}
	}
Sergeanur's avatar
Sergeanur включено в состав коммита
191
	return AEHANDLE_ERROR_NOFREESLOT;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
192
193
}

Filip Gawin's avatar
Filip Gawin включено в состав коммита
194
void
Sergeanur's avatar
Sergeanur включено в состав коммита
195
cAudioManager::DestroyEntity(int32 id)
Filip Gawin's avatar
Filip Gawin включено в состав коммита
196
{
Sergeanur's avatar
Sergeanur включено в состав коммита
197
	if (m_bIsInitialised && id >= 0 && id < NUM_AUDIOENTITIES && m_asAudioEntities[id].m_bIsUsed) {
Sergeanur's avatar
Sergeanur включено в состав коммита
198
		m_asAudioEntities[id].m_bIsUsed = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
199
200
		for (uint32 i = 0; i < m_nAudioEntitiesCount; i++) {
			if (id == m_aAudioEntityOrderList[i]) {
Sergeanur's avatar
Sergeanur включено в состав коммита
201
				if (i < NUM_AUDIOENTITIES - 1)
Sergeanur's avatar
Sergeanur включено в состав коммита
202
203
					memmove(&m_aAudioEntityOrderList[i], &m_aAudioEntityOrderList[i + 1], NUM_AUDIOENTITY_EVENTS * (m_nAudioEntitiesCount - (i + 1)));
				m_aAudioEntityOrderList[--m_nAudioEntitiesCount] = NUM_AUDIOENTITIES;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
204
				return;
Sergeanur's avatar
Sergeanur включено в состав коммита
205
			}
Filip Gawin's avatar
Filip Gawin включено в состав коммита
206
207
		}
	}
Filip Gawin's avatar
Filip Gawin включено в состав коммита
208
209
}

Sergeanur's avatar
Sergeanur включено в состав коммита
210
211
212
213
214
215
216
217
bool8
cAudioManager::GetEntityStatus(int32 id)
{
	if (m_bIsInitialised && id >= 0 && id < NUM_AUDIOENTITIES && m_asAudioEntities[id].m_bIsUsed)
		return m_asAudioEntities[id].m_bStatus;
	return FALSE;
}

Filip Gawin's avatar
Filip Gawin включено в состав коммита
218
void
Sergeanur's avatar
Sergeanur включено в состав коммита
219
cAudioManager::SetEntityStatus(int32 id, bool8 status)
Filip Gawin's avatar
Filip Gawin включено в состав коммита
220
{
Sergeanur's avatar
Sergeanur включено в состав коммита
221
	if (m_bIsInitialised && id >= 0 && id < NUM_AUDIOENTITIES && m_asAudioEntities[id].m_bIsUsed)
Sergeanur's avatar
Sergeanur включено в состав коммита
222
		m_asAudioEntities[id].m_bStatus = status;
Sergeanur's avatar
Sergeanur включено в состав коммита
223
224
225
226
227
228
229
230
}

void *
cAudioManager::GetEntityPointer(int32 id)
{
	if (m_bIsInitialised && id >= 0 && id < NUM_AUDIOENTITIES && m_asAudioEntities[id].m_bIsUsed)
		return m_asAudioEntities[id].m_pEntity;
	return NULL;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
231
232
}

Filip Gawin's avatar
audio7    
Filip Gawin включено в состав коммита
233
void
Sergeanur's avatar
Sergeanur включено в состав коммита
234
cAudioManager::PlayOneShot(int32 index, uint16 sound, float vol)
Filip Gawin's avatar
audio7    
Filip Gawin включено в состав коммита
235
{
Sergeanur's avatar
Sergeanur включено в состав коммита
236
237
238
239
240
	static const uint8 OneShotPriority[] = {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 3, 5, 2, 2, 1, 1, 3, 1, 3, 3, 1, 1, 1, 4, 4, 3, 1, 1,
	                                        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 3, 2, 2, 2, 2, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	                                        1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 3, 1, 1, 1, 9,
	                                        2, 2, 0, 0, 0, 0, 3, 3, 5, 1, 1, 1, 1, 3, 4, 7, 6, 6, 6, 6, 1, 3, 4, 3, 4, 2, 1, 3, 5, 4, 6, 6, 1, 3,
	                                        1, 1, 1, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
Filip Gawin's avatar
audio7    
Filip Gawin включено в состав коммита
241

Sergeanur's avatar
Sergeanur включено в состав коммита
242
	if (m_bIsInitialised) {
Sergeanur's avatar
Sergeanur включено в состав коммита
243
244
245
246
247
248
249
250
251
252
253
254
		if (index >= 0 && index < NUM_AUDIOENTITIES) {
			tAudioEntity &entity = m_asAudioEntities[index];
			if (entity.m_bIsUsed) {
				if (sound < SOUND_TOTAL_SOUNDS) {
					if (entity.m_nType == AUDIOTYPE_SCRIPTOBJECT) {
						if (m_sAudioScriptObjectManager.m_nScriptObjectEntityTotal < ARRAY_SIZE(m_sAudioScriptObjectManager.m_anScriptObjectEntityIndices)) {
							entity.m_awAudioEvent[0] = sound;
							entity.m_AudioEvents = 1;
							m_sAudioScriptObjectManager.m_anScriptObjectEntityIndices[m_sAudioScriptObjectManager.m_nScriptObjectEntityTotal++] = index;
						}
					} else {
						int32 i = 0;
Sergeanur's avatar
Sergeanur включено в состав коммита
255
						while (TRUE) {
Sergeanur's avatar
Sergeanur включено в состав коммита
256
257
258
259
							if (i >= entity.m_AudioEvents) {
								if (entity.m_AudioEvents < ARRAY_SIZE(entity.m_awAudioEvent)) {
									entity.m_awAudioEvent[i] = sound;
									entity.m_afVolume[i] = vol;
Sergeanur's avatar
Sergeanur включено в состав коммита
260
									entity.m_AudioEvents++;
Sergeanur's avatar
Sergeanur включено в состав коммита
261
262
263
264
265
								}
								return;
							}
							if (OneShotPriority[entity.m_awAudioEvent[i]] > OneShotPriority[sound])
								break;
Sergeanur's avatar
Sergeanur включено в состав коммита
266
							i++;
Sergeanur's avatar
Sergeanur включено в состав коммита
267
268
269
270
271
272
273
274
						}
						if (i < NUM_AUDIOENTITY_EVENTS - 1) {
							memmove(&entity.m_awAudioEvent[i + 1], &entity.m_awAudioEvent[i], (NUM_AUDIOENTITY_EVENTS - 1 - i) * NUM_AUDIOENTITY_EVENTS / 2);
							memmove(&entity.m_afVolume[i + 1], &entity.m_afVolume[i], (NUM_AUDIOENTITY_EVENTS - 1 - i) * NUM_AUDIOENTITY_EVENTS);
						}
						entity.m_awAudioEvent[i] = sound;
						entity.m_afVolume[i] = vol;
						if (entity.m_AudioEvents < ARRAY_SIZE(entity.m_awAudioEvent))
Sergeanur's avatar
Sergeanur включено в состав коммита
275
							entity.m_AudioEvents++;
Sergeanur's avatar
Sergeanur включено в состав коммита
276
277
278
279
					}
				}
			}
		}
Filip Gawin's avatar
audio7    
Filip Gawin включено в состав коммита
280
281
282
	}
}

Filip Gawin's avatar
Filip Gawin включено в состав коммита
283
void
Sergeanur's avatar
Sergeanur включено в состав коммита
284
cAudioManager::SetEffectsMasterVolume(uint8 volume)
Filip Gawin's avatar
Filip Gawin включено в состав коммита
285
{
Sergeanur's avatar
Sergeanur включено в состав коммита
286
	SampleManager.SetEffectsMasterVolume(volume);
Filip Gawin's avatar
Filip Gawin включено в состав коммита
287
}
Filip Gawin's avatar
Filip Gawin включено в состав коммита
288

Filip Gawin's avatar
Filip Gawin включено в состав коммита
289
void
Sergeanur's avatar
Sergeanur включено в состав коммита
290
cAudioManager::SetMusicMasterVolume(uint8 volume)
Filip Gawin's avatar
Filip Gawin включено в состав коммита
291
{
Sergeanur's avatar
Sergeanur включено в состав коммита
292
	SampleManager.SetMusicMasterVolume(volume);
Filip Gawin's avatar
Filip Gawin включено в состав коммита
293
294
}

Sergeanur's avatar
Sergeanur включено в состав коммита
295
void
Sergeanur's avatar
Sergeanur включено в состав коммита
296
cAudioManager::SetEffectsFadeVol(uint8 volume)
Filip Gawin's avatar
Filip Gawin включено в состав коммита
297
{
Sergeanur's avatar
Sergeanur включено в состав коммита
298
	SampleManager.SetEffectsFadeVolume(volume);
Filip Gawin's avatar
Filip Gawin включено в состав коммита
299
300
}

Fire_Head's avatar
Fire_Head включено в состав коммита
301
void
Sergeanur's avatar
Sergeanur включено в состав коммита
302
cAudioManager::SetMusicFadeVol(uint8 volume)
Filip Gawin's avatar
Filip Gawin включено в состав коммита
303
{
Sergeanur's avatar
Sergeanur включено в состав коммита
304
	SampleManager.SetMusicFadeVolume(volume);
Filip Gawin's avatar
Filip Gawin включено в состав коммита
305
306
}

Sergeanur's avatar
Sergeanur включено в состав коммита
307
void
Sergeanur's avatar
Sergeanur включено в состав коммита
308
cAudioManager::SetMonoMode(bool8 mono)
Filip Gawin's avatar
Filip Gawin включено в состав коммита
309
{
Sergeanur's avatar
Sergeanur включено в состав коммита
310
	SampleManager.SetMonoMode(mono);
Filip Gawin's avatar
Filip Gawin включено в состав коммита
311
312
}

Sergeanur's avatar
Sergeanur включено в состав коммита
313
314
void
cAudioManager::ResetTimers(uint32 time)
Filip Gawin's avatar
Filip Gawin включено в состав коммита
315
{
Sergeanur's avatar
Sergeanur включено в состав коммита
316
	if (m_bIsInitialised) {
Sergeanur's avatar
Sergeanur включено в состав коммита
317
		m_bTimerJustReset = TRUE;
Sergeanur's avatar
Sergeanur включено в состав коммита
318
319
		m_nTimer = time;
		ClearRequestedQueue();
Sergeanur's avatar
Sergeanur включено в состав коммита
320
321
		if (m_nActiveQueue) {
			m_nActiveQueue = 0;
Sergeanur's avatar
Sergeanur включено в состав коммита
322
			ClearRequestedQueue();
Sergeanur's avatar
Sergeanur включено в состав коммита
323
			m_nActiveQueue = 1;
Sergeanur's avatar
Sergeanur включено в состав коммита
324
		} else {
Sergeanur's avatar
Sergeanur включено в состав коммита
325
			m_nActiveQueue = 1;
Sergeanur's avatar
Sergeanur включено в состав коммита
326
			ClearRequestedQueue();
Sergeanur's avatar
Sergeanur включено в состав коммита
327
			m_nActiveQueue = 0;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
328
		}
Sergeanur's avatar
Sergeanur включено в состав коммита
329
330
		ClearActiveSamples();
		ClearMissionAudio();
Sergeanur's avatar
Sergeanur включено в состав коммита
331
		SampleManager.StopChannel(CHANNEL_POLICE_RADIO);
Sergeanur's avatar
Sergeanur включено в состав коммита
332
333
334
335
336
337
		SampleManager.SetEffectsFadeVolume(0);
		SampleManager.SetMusicFadeVolume(0);
		MusicManager.ResetMusicAfterReload();
#ifdef AUDIO_OAL
		SampleManager.Service();
#endif
Filip Gawin's avatar
Filip Gawin включено в состав коммита
338
339
340
341
342
343
344
345
	}
}

void
cAudioManager::DestroyAllGameCreatedEntities()
{
	cAudioScriptObject *entity;

Sergeanur's avatar
Sergeanur включено в состав коммита
346
	if (m_bIsInitialised) {
Sergeanur's avatar
Sergeanur включено в состав коммита
347
		for (uint32 i = 0; i < NUM_AUDIOENTITIES; i++) {
Sergeanur's avatar
Sergeanur включено в состав коммита
348
349
			if (m_asAudioEntities[i].m_bIsUsed) {
				switch (m_asAudioEntities[i].m_nType) {
Filip Gawin's avatar
Filip Gawin включено в состав коммита
350
351
352
353
354
				case AUDIOTYPE_PHYSICAL:
				case AUDIOTYPE_EXPLOSION:
				case AUDIOTYPE_WEATHER:
				case AUDIOTYPE_CRANE:
				case AUDIOTYPE_GARAGE:
Sergeanur's avatar
Sergeanur включено в состав коммита
355
356
357
				case AUDIOTYPE_FIREHYDRANT:
					DestroyEntity(i);
					break;
Fire-Head's avatar
Fire-Head включено в состав коммита
358
				case AUDIOTYPE_SCRIPTOBJECT:
Sergeanur's avatar
Sergeanur включено в состав коммита
359
360
					entity = (cAudioScriptObject *)m_asAudioEntities[i].m_pEntity;
					if (entity) {
Filip Gawin's avatar
Filip Gawin включено в состав коммита
361
						delete entity;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
362
363
						m_asAudioEntities[i].m_pEntity = nil;
					}
Filip Gawin's avatar
Filip Gawin включено в состав коммита
364
					DestroyEntity(i);
Filip Gawin's avatar
Filip Gawin включено в состав коммита
365
					break;
Sergeanur's avatar
Sergeanur включено в состав коммита
366
367
				default:
					break;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
368
369
370
				}
			}
		}
Sergeanur's avatar
Sergeanur включено в состав коммита
371
		m_sAudioScriptObjectManager.m_nScriptObjectEntityTotal = 0;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
372
373
374
	}
}

Sergeanur's avatar
Sergeanur включено в состав коммита
375
376
#ifdef GTA_PC

Sergeanur's avatar
Sergeanur включено в состав коммита
377
uint8
Sergeanur's avatar
Sergeanur включено в состав коммита
378
cAudioManager::GetNum3DProvidersAvailable()
Filip Gawin's avatar
Filip Gawin включено в состав коммита
379
{
Sergeanur's avatar
Sergeanur включено в состав коммита
380
#ifdef EXTERNAL_3D_SOUND
Sergeanur's avatar
Sergeanur включено в состав коммита
381
382
	if (m_bIsInitialised)
		return SampleManager.GetNum3DProvidersAvailable();
Sergeanur's avatar
Sergeanur включено в состав коммита
383
#endif
Sergeanur's avatar
Sergeanur включено в состав коммита
384
	return 0;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
385
386
}

Sergeanur's avatar
Sergeanur включено в состав коммита
387
char *
Sergeanur's avatar
Sergeanur включено в состав коммита
388
cAudioManager::Get3DProviderName(uint8 id)
Filip Gawin's avatar
Cleanup    
Filip Gawin включено в состав коммита
389
{
Sergeanur's avatar
Sergeanur включено в состав коммита
390
391
392
#ifndef EXTERNAL_3D_SOUND
	return nil;
#else
Sergeanur's avatar
Sergeanur включено в состав коммита
393
394
	if (!m_bIsInitialised)
		return nil;
erorcun's avatar
erorcun включено в состав коммита
395
#ifdef AUDIO_OAL
withmorten's avatar
withmorten включено в состав коммита
396
	id = Clamp(id, 0, SampleManager.GetNum3DProvidersAvailable() - 1);
erorcun's avatar
erorcun включено в состав коммита
397
398
#else
	// We don't want that either since it will crash the game, but skipping for now
Sergeanur's avatar
Sergeanur включено в состав коммита
399
400
	if (id >= SampleManager.GetNum3DProvidersAvailable())
		return nil;
erorcun's avatar
erorcun включено в состав коммита
401
#endif
Sergeanur's avatar
Sergeanur включено в состав коммита
402
	return SampleManager.Get3DProviderName(id);
Sergeanur's avatar
Sergeanur включено в состав коммита
403
#endif
Filip Gawin's avatar
Cleanup    
Filip Gawin включено в состав коммита
404
405
}

Sergeanur's avatar
Sergeanur включено в состав коммита
406
int8
Sergeanur's avatar
Sergeanur включено в состав коммита
407
cAudioManager::GetCurrent3DProviderIndex()
Filip Gawin's avatar
Filip Gawin включено в состав коммита
408
{
Sergeanur's avatar
Sergeanur включено в состав коммита
409
#ifdef EXTERNAL_3D_SOUND
Sergeanur's avatar
Sergeanur включено в состав коммита
410
411
	if (m_bIsInitialised)
		return SampleManager.GetCurrent3DProviderIndex();
Sergeanur's avatar
Sergeanur включено в состав коммита
412
#endif
Filip Gawin's avatar
Filip Gawin включено в состав коммита
413

Sergeanur's avatar
Sergeanur включено в состав коммита
414
	return -1;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
415
416
}

Sergeanur's avatar
Sergeanur включено в состав коммита
417
418
int8
cAudioManager::SetCurrent3DProvider(uint8 which)
Filip Gawin's avatar
Filip Gawin включено в состав коммита
419
{
Sergeanur's avatar
Sergeanur включено в состав коммита
420
421
422
#ifndef EXTERNAL_3D_SOUND
	return -1;
#else
Sergeanur's avatar
Sergeanur включено в состав коммита
423
424
	if (!m_bIsInitialised)
		return -1;
Sergeanur's avatar
Sergeanur включено в состав коммита
425
	for (uint8 i = 0; i < m_nActiveSamples + 1; i++)
Sergeanur's avatar
Sergeanur включено в состав коммита
426
427
		SampleManager.StopChannel(i);
	ClearRequestedQueue();
Sergeanur's avatar
Sergeanur включено в состав коммита
428
429
	if (m_nActiveQueue == 0)
		m_nActiveQueue = 1;
Sergeanur's avatar
Sergeanur включено в состав коммита
430
	else
Sergeanur's avatar
Sergeanur включено в состав коммита
431
		m_nActiveQueue = 0;
Sergeanur's avatar
Sergeanur включено в состав коммита
432
433
434
435
	ClearRequestedQueue();
	ClearActiveSamples();
	int8 current = SampleManager.SetCurrent3DProvider(which);
	if (current > 0) {
Sergeanur's avatar
Sergeanur включено в состав коммита
436
#ifdef EXTERNAL_3D_SOUND
Sergeanur's avatar
Sergeanur включено в состав коммита
437
438
		m_nActiveSamples = SampleManager.GetMaximumSupportedChannels();
		if (m_nActiveSamples > 1)
Sergeanur's avatar
Sergeanur включено в состав коммита
439
			m_nActiveSamples--;
Sergeanur's avatar
Sergeanur включено в состав коммита
440
#endif
Filip Gawin's avatar
Cleanup    
Filip Gawin включено в состав коммита
441
	}
Sergeanur's avatar
Sergeanur включено в состав коммита
442
	return current;
Sergeanur's avatar
Sergeanur включено в состав коммита
443
#endif
Filip Gawin's avatar
Filip Gawin включено в состав коммита
444
445
}

Sergeanur's avatar
Sergeanur включено в состав коммита
446
void
Sergeanur's avatar
Sergeanur включено в состав коммита
447
cAudioManager::SetSpeakerConfig(int32 conf)
Filip Gawin's avatar
Filip Gawin включено в состав коммита
448
{
Sergeanur's avatar
Sergeanur включено в состав коммита
449
#ifdef EXTERNAL_3D_SOUND
Sergeanur's avatar
Sergeanur включено в состав коммита
450
	SampleManager.SetSpeakerConfig(conf);
Sergeanur's avatar
Sergeanur включено в состав коммита
451
#endif
Filip Gawin's avatar
Cleanup    
Filip Gawin включено в состав коммита
452
}
Filip Gawin's avatar
Filip Gawin включено в состав коммита
453

Sergeanur's avatar
Sergeanur включено в состав коммита
454
bool8
Sergeanur's avatar
Sergeanur включено в состав коммита
455
cAudioManager::IsMP3RadioChannelAvailable()
Filip Gawin's avatar
Cleanup    
Filip Gawin включено в состав коммита
456
{
Sergeanur's avatar
Sergeanur включено в состав коммита
457
458
	if (m_bIsInitialised)
		return SampleManager.IsMP3RadioChannelAvailable();
Filip Gawin's avatar
Filip Gawin включено в состав коммита
459

Sergeanur's avatar
Sergeanur включено в состав коммита
460
	return FALSE;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
461
462
}

Sergeanur's avatar
Sergeanur включено в состав коммита
463
void
Sergeanur's avatar
Sergeanur включено в состав коммита
464
cAudioManager::ReleaseDigitalHandle()
Filip Gawin's avatar
Filip Gawin включено в состав коммита
465
{
Sergeanur's avatar
Sergeanur включено в состав коммита
466
467
	if (m_bIsInitialised) {
		SampleManager.ReleaseDigitalHandle();
Sergeanur's avatar
Sergeanur включено в состав коммита
468
	}
Filip Gawin's avatar
Filip Gawin включено в состав коммита
469
470
}

Sergeanur's avatar
Sergeanur включено в состав коммита
471
void
Sergeanur's avatar
Sergeanur включено в состав коммита
472
cAudioManager::ReacquireDigitalHandle()
Filip Gawin's avatar
Filip Gawin включено в состав коммита
473
{
Sergeanur's avatar
Sergeanur включено в состав коммита
474
475
	if (m_bIsInitialised) {
		SampleManager.ReacquireDigitalHandle();
Filip Gawin's avatar
Cleanup    
Filip Gawin включено в состав коммита
476
	}
Filip Gawin's avatar
Filip Gawin включено в состав коммита
477
478
}

Sergeanur's avatar
Sergeanur включено в состав коммита
479
#ifdef AUDIO_REFLECTIONS
Sergeanur's avatar
Sergeanur включено в состав коммита
480
void
Sergeanur's avatar
Sergeanur включено в состав коммита
481
cAudioManager::SetDynamicAcousticModelingStatus(bool8 status)
Filip Gawin's avatar
Filip Gawin включено в состав коммита
482
{
Sergeanur's avatar
Sergeanur включено в состав коммита
483
	m_bDynamicAcousticModelingStatus = status;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
484
}
Sergeanur's avatar
Sergeanur включено в состав коммита
485
#endif
Filip Gawin's avatar
Filip Gawin включено в состав коммита
486

Sergeanur's avatar
Sergeanur включено в состав коммита
487
bool8
Sergeanur's avatar
Sergeanur включено в состав коммита
488
cAudioManager::CheckForAnAudioFileOnCD()
Filip Gawin's avatar
Filip Gawin включено в состав коммита
489
{
Sergeanur's avatar
Sergeanur включено в состав коммита
490
	return SampleManager.CheckForAnAudioFileOnCD();
Filip Gawin's avatar
Filip Gawin включено в состав коммита
491
492
}

Sergeanur's avatar
Sergeanur включено в состав коммита
493
char
Sergeanur's avatar
Sergeanur включено в состав коммита
494
cAudioManager::GetCDAudioDriveLetter()
Filip Gawin's avatar
Filip Gawin включено в состав коммита
495
{
Sergeanur's avatar
Sergeanur включено в состав коммита
496
497
	if (m_bIsInitialised)
		return SampleManager.GetCDAudioDriveLetter();
Filip Gawin's avatar
Filip Gawin включено в состав коммита
498

Sergeanur's avatar
Sergeanur включено в состав коммита
499
	return '\0';
Filip Gawin's avatar
Filip Gawin включено в состав коммита
500
501
}

Sergeanur's avatar
Sergeanur включено в состав коммита
502
bool8
Sergeanur's avatar
Sergeanur включено в состав коммита
503
cAudioManager::IsAudioInitialised()
Filip Gawin's avatar
Filip Gawin включено в состав коммита
504
{
Sergeanur's avatar
Sergeanur включено в состав коммита
505
	return m_bIsInitialised;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
506
507
}

Sergeanur's avatar
Sergeanur включено в состав коммита
508
509
#endif // GTA_PC

Sergeanur's avatar
Sergeanur включено в состав коммита
510
511
void
cAudioManager::ServiceSoundEffects()
Filip Gawin's avatar
Filip Gawin включено в состав коммита
512
{
Sergeanur's avatar
Sergeanur включено в состав коммита
513
#ifdef FIX_BUGS
Sergeanur's avatar
Sergeanur включено в состав коммита
514
	if(CTimer::GetLogicalFramesPassed() != 0)
Sergeanur's avatar
Sergeanur включено в состав коммита
515
#endif
Sergeanur's avatar
Sergeanur включено в состав коммита
516
	m_bReduceReleasingPriority = (m_FrameCounter++ % 5) == 0;
Sergeanur's avatar
Sergeanur включено в состав коммита
517
	if (m_bIsPaused && !m_bWasPaused) {
Sergeanur's avatar
Sergeanur включено в состав коммита
518
		for (int32 i = 0; i < NUM_CHANNELS; i++)
Sergeanur's avatar
Sergeanur включено в состав коммита
519
			SampleManager.StopChannel(i);
Filip Gawin's avatar
Filip Gawin включено в состав коммита
520

Sergeanur's avatar
Sergeanur включено в состав коммита
521
		ClearRequestedQueue();
Sergeanur's avatar
Sergeanur включено в состав коммита
522
523
		if (m_nActiveQueue) {
			m_nActiveQueue = 0;
Sergeanur's avatar
Sergeanur включено в состав коммита
524
			ClearRequestedQueue();
Sergeanur's avatar
Sergeanur включено в состав коммита
525
			m_nActiveQueue = 1;
Sergeanur's avatar
Sergeanur включено в состав коммита
526
		} else {
Sergeanur's avatar
Sergeanur включено в состав коммита
527
			m_nActiveQueue = 1;
Sergeanur's avatar
Sergeanur включено в состав коммита
528
			ClearRequestedQueue();
Sergeanur's avatar
Sergeanur включено в состав коммита
529
			m_nActiveQueue = 0;
Sergeanur's avatar
Sergeanur включено в состав коммита
530
531
		}
		ClearActiveSamples();
Filip Gawin's avatar
Filip Gawin включено в состав коммита
532
	}
Sergeanur's avatar
Sergeanur включено в состав коммита
533
	m_nActiveQueue = m_nActiveQueue == 1 ? 0 : 1;
Sergeanur's avatar
Sergeanur включено в состав коммита
534
535
536
537
538
539
540
541
542
	ProcessReverb();
	ProcessSpecial();
	ClearRequestedQueue();
	InterrogateAudioEntities();
	m_sPedComments.Process();
	ServicePoliceRadio();
	ServiceCollisions();
	AddReleasingSounds();
	ProcessMissionAudio();
Sergeanur's avatar
Sergeanur включено в состав коммита
543
#ifdef EXTERNAL_3D_SOUND
Sergeanur's avatar
Sergeanur включено в состав коммита
544
545
546
547
548
549
	AdjustSamplesVolume();
#endif
	ProcessActiveQueues();
#ifdef AUDIO_OAL
	SampleManager.Service();
#endif
Sergeanur's avatar
Sergeanur включено в состав коммита
550
	for (int32 i = 0; i < m_sAudioScriptObjectManager.m_nScriptObjectEntityTotal; i++) {
Sergeanur's avatar
Sergeanur включено в состав коммита
551
552
553
554
		cAudioScriptObject *object = (cAudioScriptObject *)m_asAudioEntities[m_sAudioScriptObjectManager.m_anScriptObjectEntityIndices[i]].m_pEntity;
		delete object;
		m_asAudioEntities[m_sAudioScriptObjectManager.m_anScriptObjectEntityIndices[i]].m_pEntity = nil;
		DestroyEntity(m_sAudioScriptObjectManager.m_anScriptObjectEntityIndices[i]);
Filip Gawin's avatar
Filip Gawin включено в состав коммита
555
	}
Sergeanur's avatar
Sergeanur включено в состав коммита
556
	m_sAudioScriptObjectManager.m_nScriptObjectEntityTotal = 0;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
557
558
}

Sergeanur's avatar
Sergeanur включено в состав коммита
559
560
561
562
563
564
uint32
cAudioManager::FL(float f)
{
	return SampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex) * f;
}

Sergeanur's avatar
Sergeanur включено в состав коммита
565
uint8
Sergeanur's avatar
Sergeanur включено в состав коммита
566
cAudioManager::ComputeVolume(uint8 emittingVolume, float maxDistance, float distance)
Filip Gawin's avatar
Filip Gawin включено в состав коммита
567
{
Sergeanur's avatar
Sergeanur включено в состав коммита
568
569
	float minDistance;
	if (maxDistance <= 0.0f)
Sergeanur's avatar
Sergeanur включено в состав коммита
570
		return 0;
Sergeanur's avatar
Sergeanur включено в состав коммита
571
572
573
	minDistance = maxDistance / 5.0f;
	if (minDistance <= distance)
		emittingVolume = sq((maxDistance - minDistance - (distance - minDistance)) / (maxDistance - minDistance)) * emittingVolume;
Sergeanur's avatar
Sergeanur включено в состав коммита
574
	return emittingVolume;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
575
576
}

Sergeanur's avatar
Sergeanur включено в состав коммита
577
void
Sergeanur's avatar
Sergeanur включено в состав коммита
578
cAudioManager::TranslateEntity(Const CVector *in, CVector *out)
Filip Gawin's avatar
Filip Gawin включено в состав коммита
579
{
Sergeanur's avatar
Sergeanur включено в состав коммита
580
	*out = MultiplyInverse(TheCamera.GetMatrix(), *in);
Filip Gawin's avatar
Filip Gawin включено в состав коммита
581
582
}

Sergeanur's avatar
Sergeanur включено в состав коммита
583
584
int32
cAudioManager::ComputePan(float dist, CVector *vec)
Filip Gawin's avatar
Filip Gawin включено в состав коммита
585
{
Sergeanur's avatar
Sergeanur включено в состав коммита
586
587
	Const static uint8 PanTable[64] = {0,  3,  8,  12, 16, 19, 22, 24, 26, 28, 30, 31, 33, 34, 36, 37, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 49, 50, 51, 52, 53, 53,
									   54, 55, 55, 56, 56, 57, 57, 58, 58, 58, 59, 59, 59, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 63, 63, 63};
Filip Gawin's avatar
Filip Gawin включено в состав коммита
588

Sergeanur's avatar
Sergeanur включено в состав коммита
589
590
	int32 index = vec->x / (dist / 64.f);
	index = Min(63, ABS(index));
Filip Gawin's avatar
Filip Gawin включено в состав коммита
591

Sergeanur's avatar
Sergeanur включено в состав коммита
592
	if (vec->x > 0.f)
Sergeanur's avatar
Sergeanur включено в состав коммита
593
		return Max(20, 63 - (int8)PanTable[index]);
Sergeanur's avatar
Sergeanur включено в состав коммита
594
	return Min(107, PanTable[index] + 63);
Filip Gawin's avatar
Filip Gawin включено в состав коммита
595
}
_AG's avatar
_AG включено в состав коммита
596

Sergeanur's avatar
Sergeanur включено в состав коммита
597
uint32
Sergeanur's avatar
Sergeanur включено в состав коммита
598
cAudioManager::ComputeDopplerEffectedFrequency(uint32 oldFreq, float position1, float position2, float speedMultiplier)
Filip Gawin's avatar
Filip Gawin включено в состав коммита
599
{
Sergeanur's avatar
Sergeanur включено в состав коммита
600
601
602
603
604
605
	uint32 newFreq = oldFreq;
	if (!TheCamera.Get_Just_Switched_Status() && speedMultiplier != 0.0f) {
		float dist = position2 - position1;
		if (dist != 0.0f) {
			float speedOfSource = (dist / m_nTimeSpent) * speedMultiplier;
			if (m_fSpeedOfSound > Abs(speedOfSource)) {
Sergeanur's avatar
Sergeanur включено в состав коммита
606
				speedOfSource = Clamp2(speedOfSource, 0.0f, 1.5f);
Sergeanur's avatar
Sergeanur включено в состав коммита
607
608
609
				newFreq = (oldFreq * m_fSpeedOfSound) / (speedOfSource + m_fSpeedOfSound);
			}
		}
Filip Gawin's avatar
Filip Gawin включено в состав коммита
610
	}
Sergeanur's avatar
Sergeanur включено в состав коммита
611
	return newFreq;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
612
613
}

Sergeanur's avatar
Sergeanur включено в состав коммита
614
int32
Sergeanur's avatar
Sergeanur включено в состав коммита
615
cAudioManager::RandomDisplacement(uint32 seed)
Filip Gawin's avatar
Filip Gawin включено в состав коммита
616
{
Sergeanur's avatar
Sergeanur включено в состав коммита
617
	int32 value;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
618

Sergeanur's avatar
Sergeanur включено в состав коммита
619
	static bool8 bPos = TRUE;
Sergeanur's avatar
Sergeanur включено в состав коммита
620
	static uint32 Adjustment = 0;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
621

Sergeanur's avatar
Sergeanur включено в состав коммита
622
623
	if (!seed)
		return 0;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
624

Sergeanur's avatar
Sergeanur включено в состав коммита
625
626
	value = m_anRandomTable[(Adjustment + seed) % 5] % seed;
	Adjustment += value;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
627

Sergeanur's avatar
Sergeanur включено в состав коммита
628
	if (value % 2) {
Sergeanur's avatar
Sergeanur включено в состав коммита
629
		bPos = !bPos;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
630
	}
Sergeanur's avatar
Sergeanur включено в состав коммита
631
	if (!bPos)
Sergeanur's avatar
Sergeanur включено в состав коммита
632
633
		value = -value;
	return value;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
634
635
}

Sergeanur's avatar
Sergeanur включено в состав коммита
636
637
void
cAudioManager::InterrogateAudioEntities()
Filip Gawin's avatar
Filip Gawin включено в состав коммита
638
{
Sergeanur's avatar
Sergeanur включено в состав коммита
639
640
641
	for (uint32 i = 0; i < m_nAudioEntitiesCount; i++) {
		ProcessEntity(m_aAudioEntityOrderList[i]);
		m_asAudioEntities[m_aAudioEntityOrderList[i]].m_AudioEvents = 0;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
642
643
644
	}
}

Sergeanur's avatar
Sergeanur включено в состав коммита
645
646
void
cAudioManager::AddSampleToRequestedQueue()
Filip Gawin's avatar
Filip Gawin включено в состав коммита
647
{
Sergeanur's avatar
Sergeanur включено в состав коммита
648
	uint32 finalPriority;
Sergeanur's avatar
Sergeanur включено в состав коммита
649
	uint8 sampleIndex;
Sergeanur's avatar
Sergeanur включено в состав коммита
650
#ifdef AUDIO_REFLECTIONS
Sergeanur's avatar
Sergeanur включено в состав коммита
651
	bool8 bReflections;
Sergeanur's avatar
Sergeanur включено в состав коммита
652
#endif
Filip Gawin's avatar
Filip Gawin включено в состав коммита
653

Sergeanur's avatar
Sergeanur включено в состав коммита
654
	if (m_sQueueSample.m_nSampleIndex < TOTAL_AUDIO_SAMPLES) {
Sergeanur's avatar
Sergeanur включено в состав коммита
655
		finalPriority = m_sQueueSample.m_nPriority * (MAX_VOLUME - m_sQueueSample.m_nVolume);
Sergeanur's avatar
Sergeanur включено в состав коммита
656
		sampleIndex = m_nRequestedCount[m_nActiveQueue];
Sergeanur's avatar
Sergeanur включено в состав коммита
657
		if (sampleIndex >= m_nActiveSamples) {
Sergeanur's avatar
Sergeanur включено в состав коммита
658
659
			sampleIndex = m_aRequestedOrderList[m_nActiveQueue][m_nActiveSamples - 1];
			if (m_aRequestedQueue[m_nActiveQueue][sampleIndex].m_nFinalPriority <= finalPriority)
Sergeanur's avatar
Sergeanur включено в состав коммита
660
661
				return;
		} else {
Sergeanur's avatar
Sergeanur включено в состав коммита
662
			m_nRequestedCount[m_nActiveQueue]++;
Sergeanur's avatar
Sergeanur включено в состав коммита
663
		}
Sergeanur's avatar
Sergeanur включено в состав коммита
664
665
666
667
668
669
670
671
672
673
#if GTA_VERSION < GTA3_PC_10
		if (m_sQueueSample.m_bStatic) {
			if (m_sQueueSample.m_nLoopCount > 0)
				m_sQueueSample.unk = m_nTimeSpent * SampleManager.GetSampleLength(m_sQueueSample.m_nSampleIndex) / m_sQueueSample.m_nFrequency;
			else
				m_sQueueSample.unk = -3;
		}
#endif
		m_sQueueSample.m_nFinalPriority = finalPriority;
		m_sQueueSample.m_bIsPlayingFinished = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
674
#ifdef AUDIO_REFLECTIONS
Sergeanur's avatar
Sergeanur включено в состав коммита
675
		if (m_sQueueSample.m_bIs2D) {
Sergeanur's avatar
Sergeanur включено в состав коммита
676
677
			m_sQueueSample.m_bReflections = FALSE;
			m_sQueueSample.m_nReflectionDelay = 0;
Sergeanur's avatar
Sergeanur включено в состав коммита
678
		}
Sergeanur's avatar
Sergeanur включено в состав коммита
679
		if (m_bDynamicAcousticModelingStatus && m_sQueueSample.m_nLoopCount > 0) {
Sergeanur's avatar
Sergeanur включено в состав коммита
680
			bReflections = m_sQueueSample.m_bReflections;
Sergeanur's avatar
Sergeanur включено в состав коммита
681
		} else {
Sergeanur's avatar
Sergeanur включено в состав коммита
682
			bReflections = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
683
			m_sQueueSample.m_nReflectionDelay = 0;
Sergeanur's avatar
Sergeanur включено в состав коммита
684
		}
Sergeanur's avatar
Sergeanur включено в состав коммита
685
		m_sQueueSample.m_bReflections = FALSE;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
686

Sergeanur's avatar
Sergeanur включено в состав коммита
687
		if (!m_bDynamicAcousticModelingStatus)
Sergeanur's avatar
Sergeanur включено в состав коммита
688
			m_sQueueSample.m_bReverb = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
689
#endif
Filip Gawin's avatar
Filip Gawin включено в состав коммита
690

Sergeanur's avatar
Sergeanur включено в состав коммита
691
		m_aRequestedQueue[m_nActiveQueue][sampleIndex] = m_sQueueSample;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
692

Sergeanur's avatar
Sergeanur включено в состав коммита
693
		AddDetailsToRequestedOrderList(sampleIndex);
Sergeanur's avatar
Sergeanur включено в состав коммита
694
#ifdef AUDIO_REFLECTIONS
Sergeanur's avatar
Sergeanur включено в состав коммита
695
696
		if (bReflections)
			AddReflectionsToRequestedQueue();
Sergeanur's avatar
Sergeanur включено в состав коммита
697
#endif
Filip Gawin's avatar
Filip Gawin включено в состав коммита
698
699
	}
}
Sergeanur's avatar
Sergeanur включено в состав коммита
700

Sergeanur's avatar
Sergeanur включено в состав коммита
701
702
void
cAudioManager::AddDetailsToRequestedOrderList(uint8 sample)
Filip Gawin's avatar
Filip Gawin включено в состав коммита
703
{
Sergeanur's avatar
Sergeanur включено в состав коммита
704
705
706
	uint32 i = 0;
	if (sample != 0) {
		for (; i < sample; i++) {
Sergeanur's avatar
Sergeanur включено в состав коммита
707
708
			if (m_aRequestedQueue[m_nActiveQueue][m_aRequestedOrderList[m_nActiveQueue][i]].m_nFinalPriority >
			    m_aRequestedQueue[m_nActiveQueue][sample].m_nFinalPriority)
Sergeanur's avatar
Sergeanur включено в состав коммита
709
710
711
				break;
		}
		if (i < sample) {
Sergeanur's avatar
Sergeanur включено в состав коммита
712
			memmove(&m_aRequestedOrderList[m_nActiveQueue][i + 1], &m_aRequestedOrderList[m_nActiveQueue][i], m_nActiveSamples - i - 1);
Sergeanur's avatar
Sergeanur включено в состав коммита
713
		}
Filip Gawin's avatar
Filip Gawin включено в состав коммита
714
	}
Sergeanur's avatar
Sergeanur включено в состав коммита
715
	m_aRequestedOrderList[m_nActiveQueue][i] = sample;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
716
717
}

Sergeanur's avatar
Sergeanur включено в состав коммита
718
#ifdef AUDIO_REFLECTIONS
Sergeanur's avatar
Sergeanur включено в состав коммита
719
720
void
cAudioManager::AddReflectionsToRequestedQueue()
Filip Gawin's avatar
Filip Gawin включено в состав коммита
721
{
Sergeanur's avatar
Sergeanur включено в состав коммита
722
723
724
	float reflectionDistance;
	int32 noise;
	uint8 emittingVolume = (m_sQueueSample.m_nVolume / 2) + (m_sQueueSample.m_nVolume / 8);
Filip Gawin's avatar
Filip Gawin включено в состав коммита
725

Sergeanur's avatar
Sergeanur включено в состав коммита
726
727
	for (uint32 i = 0; i < ARRAY_SIZE(m_afReflectionsDistances); i++) {
		reflectionDistance = m_afReflectionsDistances[i];
Sergeanur's avatar
Sergeanur включено в состав коммита
728
729
730
		if (reflectionDistance > 0.0f && reflectionDistance < 100.f && reflectionDistance < m_sQueueSample.m_MaxDistance) {
			m_sQueueSample.m_nReflectionDelay = (reflectionDistance * 500.f / 1029.f);
			if (m_sQueueSample.m_nReflectionDelay > 5) {
Sergeanur's avatar
Sergeanur включено в состав коммита
731
				m_sQueueSample.m_fDistance = m_afReflectionsDistances[i];
Sergeanur's avatar
Sergeanur включено в состав коммита
732
				SET_EMITTING_VOLUME(emittingVolume);
Sergeanur's avatar
Sergeanur включено в состав коммита
733
				m_sQueueSample.m_nVolume = ComputeVolume(emittingVolume, m_sQueueSample.m_MaxDistance, m_sQueueSample.m_fDistance);
Sergeanur's avatar
Sergeanur включено в состав коммита
734
735
				if (m_sQueueSample.m_nVolume > emittingVolume / 16) {
					m_sQueueSample.m_nCounter += (i + 1) * 256;
Sergeanur's avatar
Sergeanur включено в состав коммита
736
					if (m_sQueueSample.m_nLoopCount > 0) {
Sergeanur's avatar
Sergeanur включено в состав коммита
737
						noise = RandomDisplacement(m_sQueueSample.m_nFrequency / 32);
Sergeanur's avatar
Sergeanur включено в состав коммита
738
						if (noise > 0)
Sergeanur's avatar
Sergeanur включено в состав коммита
739
							m_sQueueSample.m_nFrequency -= noise;
Sergeanur's avatar
Sergeanur включено в состав коммита
740
741
						else
							m_sQueueSample.m_nFrequency += noise;
Sergeanur's avatar
Sergeanur включено в состав коммита
742
					}
Sergeanur's avatar
Sergeanur включено в состав коммита
743
					m_sQueueSample.m_nPriority += 20;
Sergeanur's avatar
Sergeanur включено в состав коммита
744
745
746
747
748
					m_sQueueSample.m_vecPos = m_avecReflectionsPos[i];
					AddSampleToRequestedQueue();
				}
			}
		}
Filip Gawin's avatar
Filip Gawin включено в состав коммита
749
750
751
	}
}

Sergeanur's avatar
Sergeanur включено в состав коммита
752
753
void
cAudioManager::UpdateReflections()
Filip Gawin's avatar
Filip Gawin включено в состав коммита
754
{
Sergeanur's avatar
Sergeanur включено в состав коммита
755
	CVector camPos;
Sergeanur's avatar
Sergeanur включено в состав коммита
756
757
	CColPoint colpoint;
	CEntity *ent;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
758

Sergeanur's avatar
Sergeanur включено в состав коммита
759
	if (m_FrameCounter % 8 == 0) {
Sergeanur's avatar
Sergeanur включено в состав коммита
760
		camPos = TheCamera.GetPosition();
Sergeanur's avatar
Sergeanur включено в состав коммита
761
		m_avecReflectionsPos[0] = camPos;
Sergeanur's avatar
Sergeanur включено в состав коммита
762
		m_avecReflectionsPos[0].y += 50.0f;
Sergeanur's avatar
Sergeanur включено в состав коммита
763
764
765
766
767
		if (CWorld::ProcessLineOfSight(camPos, m_avecReflectionsPos[0], colpoint, ent, true, false, false, true, false, true, true))
			m_afReflectionsDistances[0] = Distance(camPos, colpoint.point);
		else
			m_afReflectionsDistances[0] = 50.0f;
	} else if ((m_FrameCounter + 1) % 8 == 0) {
Sergeanur's avatar
Sergeanur включено в состав коммита
768
		camPos = TheCamera.GetPosition();
Sergeanur's avatar
Sergeanur включено в состав коммита
769
770
771
772
773
774
775
		m_avecReflectionsPos[1] = camPos;
		m_avecReflectionsPos[1].y -= 50.0f;
		if (CWorld::ProcessLineOfSight(camPos, m_avecReflectionsPos[1], colpoint, ent, true, false, false, true, false, true, true))
			m_afReflectionsDistances[1] = Distance(camPos, colpoint.point);
		else
			m_afReflectionsDistances[1] = 50.0f;
	} else if ((m_FrameCounter + 2) % 8 == 0) {
Sergeanur's avatar
Sergeanur включено в состав коммита
776
		camPos = TheCamera.GetPosition();
Sergeanur's avatar
Sergeanur включено в состав коммита
777
778
779
780
781
782
783
		m_avecReflectionsPos[2] = camPos;
		m_avecReflectionsPos[2].x -= 50.0f;
		if (CWorld::ProcessLineOfSight(camPos, m_avecReflectionsPos[2], colpoint, ent, true, false, false, true, false, true, true))
			m_afReflectionsDistances[2] = Distance(camPos, colpoint.point);
		else
			m_afReflectionsDistances[2] = 50.0f;
	} else if ((m_FrameCounter + 3) % 8 == 0) {
Sergeanur's avatar
Sergeanur включено в состав коммита
784
		camPos = TheCamera.GetPosition();
Sergeanur's avatar
Sergeanur включено в состав коммита
785
786
787
788
789
790
791
		m_avecReflectionsPos[3] = camPos;
		m_avecReflectionsPos[3].x += 50.0f;
		if (CWorld::ProcessLineOfSight(camPos, m_avecReflectionsPos[3], colpoint, ent, true, false, false, true, false, true, true))
			m_afReflectionsDistances[3] = Distance(camPos, colpoint.point);
		else
			m_afReflectionsDistances[3] = 50.0f;
	} else if ((m_FrameCounter + 4) % 8 == 0) {
Sergeanur's avatar
Sergeanur включено в состав коммита
792
		camPos = TheCamera.GetPosition();
Sergeanur's avatar
Sergeanur включено в состав коммита
793
794
795
796
797
798
		m_avecReflectionsPos[4] = camPos;
		m_avecReflectionsPos[4].z += 50.0f;
		if (CWorld::ProcessVerticalLine(camPos, m_avecReflectionsPos[4].z, colpoint, ent, true, false, false, false, true, false, nil))
			m_afReflectionsDistances[4] = colpoint.point.z - camPos.z;
		else
			m_afReflectionsDistances[4] = 50.0f;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
799
800
	}
}
Sergeanur's avatar
Sergeanur включено в состав коммита
801
#endif // AUDIO_REFLECTIONS
Filip Gawin's avatar
Filip Gawin включено в состав коммита
802

Sergeanur's avatar
Sergeanur включено в состав коммита
803
804
void
cAudioManager::AddReleasingSounds()
Filip Gawin's avatar
Filip Gawin включено в состав коммита
805
{
Sergeanur's avatar
Sergeanur включено в состав коммита
806
807
808
809
810
811
	// in case someone would want to increase it
#ifdef FIX_BUGS
	bool8 toProcess[NUM_CHANNELS_GENERIC];
#else
	bool8 toProcess[44];
#endif
Filip Gawin's avatar
Filip Gawin включено в состав коммита
812

Sergeanur's avatar
Sergeanur включено в состав коммита
813
	uint8 queue = m_nActiveQueue == 0 ? 1 : 0;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
814

Sergeanur's avatar
Sergeanur включено в состав коммита
815
816
	for (uint8 i = 0; i < m_nRequestedCount[queue]; i++) {
		tSound &sample = m_aRequestedQueue[queue][m_aRequestedOrderList[queue][i]];
Sergeanur's avatar
Sergeanur включено в состав коммита
817
		if (sample.m_bIsPlayingFinished)
Sergeanur's avatar
Sergeanur включено в состав коммита
818
			continue;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
819

Sergeanur's avatar
Sergeanur включено в состав коммита
820
		toProcess[i] = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
821
822
823
		for (uint8 j = 0; j < m_nRequestedCount[m_nActiveQueue]; j++) {
			if (sample.m_nEntityIndex == m_aRequestedQueue[m_nActiveQueue][m_aRequestedOrderList[m_nActiveQueue][j]].m_nEntityIndex &&
			    sample.m_nCounter == m_aRequestedQueue[m_nActiveQueue][m_aRequestedOrderList[m_nActiveQueue][j]].m_nCounter) {
Sergeanur's avatar
Sergeanur включено в состав коммита
824
				toProcess[i] = TRUE;
Sergeanur's avatar
Sergeanur включено в состав коммита
825
826
				break;
			}
Filip Gawin's avatar
Cleanup    
Filip Gawin включено в состав коммита
827
		}
Sergeanur's avatar
Sergeanur включено в состав коммита
828
		if (!toProcess[i]) {
Sergeanur's avatar
Sergeanur включено в состав коммита
829
#ifdef AUDIO_REFLECTIONS
Sergeanur's avatar
Sergeanur включено в состав коммита
830
			if (sample.m_nCounter <= 255 || sample.m_nReflectionDelay == 0) // check if not delayed reflection
Sergeanur's avatar
Sergeanur включено в состав коммита
831
832
#endif
			{
Sergeanur's avatar
Sergeanur включено в состав коммита
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
#ifdef ATTACH_RELEASING_SOUNDS_TO_ENTITIES
				if (sample.m_nCounter <= 255 && !sample.m_bIs2D) { // check if not reflection and is a 3D sound
					CEntity* entity = (CEntity*)GetEntityPointer(sample.m_nEntityIndex);
					if (entity && m_asAudioEntities[sample.m_nEntityIndex].m_nType == AUDIOTYPE_PHYSICAL) {
						sample.m_vecPos = entity->GetPosition();
						float oldDistance = sample.m_fDistance;
						sample.m_fDistance = Sqrt(GetDistanceSquared(sample.m_vecPos));
						if (sample.m_nSampleIndex >= SAMPLEBANK_PED_START && sample.m_nSampleIndex <= SAMPLEBANK_PED_END) { // check if it's ped comment
							uint8 vol;
							if (CWorld::GetIsLineOfSightClear(TheCamera.GetPosition(), sample.m_vecPos, true, false, false, false, false, false))
								vol = MAX_VOLUME;
							else
								vol = 31;
#ifdef EXTERNAL_3D_SOUND
							sample.m_nEmittingVolume = vol;
#endif
							sample.m_nVolume = ComputeVolume(vol, sample.m_MaxDistance, sample.m_fDistance);
						} else {
							// calculate new volume with changed distance
							float volumeDiff = sq((sample.m_MaxDistance - sample.m_fDistance) / (sample.m_MaxDistance - oldDistance));
							if (volumeDiff > 0.0f) {
								uint8 newVolume = volumeDiff * sample.m_nVolume;
								if (sample.m_nVolumeChange > 0)
									sample.m_nVolumeChange = volumeDiff * sample.m_nVolumeChange;
#if defined(FIX_BUGS) && defined(EXTERNAL_3D_SOUND)
								if (sample.m_nEmittingVolumeChange > 0)
									sample.m_nEmittingVolumeChange = volumeDiff * sample.m_nEmittingVolumeChange;
#endif
								sample.m_nVolume = Min(127, newVolume);
							}
						}
						if (sample.m_nVolume == 0)
							sample.m_nFramesToPlay = 0;
					}
				}
#endif
#ifdef FIX_BUGS
				// fixing emitting volume not being lowered and high fps bugs
				if (sample.m_nFramesToPlay <= 0)
Sergeanur's avatar
Sergeanur включено в состав коммита
872
					continue;
Sergeanur's avatar
Sergeanur включено в состав коммита
873
				if (sample.m_nLoopCount == 0) {
Sergeanur's avatar
Sergeanur включено в состав коммита
874
					if (sample.m_nVolumeChange == -1) {
Sergeanur's avatar
Sergeanur включено в состав коммита
875
						sample.m_nVolumeChange = sample.m_nVolume / sample.m_nFramesToPlay;
Sergeanur's avatar
Sergeanur включено в состав коммита
876
877
						if (sample.m_nVolumeChange <= 0)
							sample.m_nVolumeChange = 1;
Sergeanur's avatar
Sergeanur включено в состав коммита
878
879
880
881
882
#ifdef EXTERNAL_3D_SOUND
						sample.m_nEmittingVolumeChange = sample.m_nEmittingVolume / sample.m_nFramesToPlay;
						if (sample.m_nEmittingVolumeChange <= 0)
							sample.m_nEmittingVolumeChange = 1;
#endif
Sergeanur's avatar
Sergeanur включено в состав коммита
883
					}
Sergeanur's avatar
Sergeanur включено в состав коммита
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
					if (sample.m_nVolume <= sample.m_nVolumeChange * CTimer::GetTimeStepFix()) {
						sample.m_nFramesToPlay = 0;
						continue;
					}
					sample.m_nVolume -= sample.m_nVolumeChange * CTimer::GetTimeStepFix();
#ifdef EXTERNAL_3D_SOUND
					if (sample.m_nEmittingVolume <= sample.m_nEmittingVolumeChange * CTimer::GetTimeStepFix()) {
						sample.m_nFramesToPlay = 0;
						continue;
					}
					sample.m_nEmittingVolume -= sample.m_nEmittingVolumeChange * CTimer::GetTimeStepFix();
#endif
				}
				sample.m_nFramesToPlay -= CTimer::GetTimeStepFix();
				if (sample.m_nFramesToPlay < 0)
					sample.m_nFramesToPlay = 0;
Sergeanur's avatar
Sergeanur включено в состав коммита
900
#else
Sergeanur's avatar
Sergeanur включено в состав коммита
901
902
903
904
905
906
907
908
				if (sample.m_nFramesToPlay == 0)
					continue;
				if (sample.m_nLoopCount == 0) {
					if (sample.m_nVolumeChange == -1) {
						sample.m_nVolumeChange = sample.m_nVolume / sample.m_nFramesToPlay;
						if (sample.m_nVolumeChange <= 0)
							sample.m_nVolumeChange = 1;
					}
Sergeanur's avatar
Sergeanur включено в состав коммита
909
					if (sample.m_nVolume <= sample.m_nVolumeChange) {
Sergeanur's avatar
Sergeanur включено в состав коммита
910
						sample.m_nFramesToPlay = 0;
Sergeanur's avatar
Sergeanur включено в состав коммита
911
912
913
914
						continue;
					}
					sample.m_nVolume -= sample.m_nVolumeChange;
				}
Sergeanur's avatar
Sergeanur включено в состав коммита
915
				sample.m_nFramesToPlay--;
Sergeanur's avatar
Sergeanur включено в состав коммита
916
#endif
Sergeanur's avatar
Sergeanur включено в состав коммита
917
918
				if (m_bReduceReleasingPriority) {
					if (sample.m_nPriority < 20)
Sergeanur's avatar
Sergeanur включено в состав коммита
919
						sample.m_nPriority++;
Sergeanur's avatar
Sergeanur включено в состав коммита
920
				}
Sergeanur's avatar
Sergeanur включено в состав коммита
921
				sample.m_bStatic = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
922
923
924
			}
			memcpy(&m_sQueueSample, &sample, sizeof(tSound));
			AddSampleToRequestedQueue();
Filip Gawin's avatar
Cleanup    
Filip Gawin включено в состав коммита
925
		}
Filip Gawin's avatar
Filip Gawin включено в состав коммита
926
927
928
	}
}

Filip Gawin's avatar
Cleanup    
Filip Gawin включено в состав коммита
929
void
Sergeanur's avatar
Sergeanur включено в состав коммита
930
cAudioManager::ProcessActiveQueues()
Filip Gawin's avatar
Filip Gawin включено в состав коммита
931
{
Sergeanur's avatar
Sergeanur включено в состав коммита
932
	bool8 flag;
Sergeanur's avatar
Sergeanur включено в состав коммита
933
934
	float position2;
	float position1;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
935

Sergeanur's avatar
Sergeanur включено в состав коммита
936
937
	uint32 samplesPerFrame;
	uint32 samplesToPlay;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
938

Sergeanur's avatar
Sergeanur включено в состав коммита
939
#ifdef EXTERNAL_3D_SOUND
Sergeanur's avatar
Sergeanur включено в состав коммита
940
941
942
943
	float x;
	float usedX;
	float usedY;
	float usedZ;
Sergeanur's avatar
Sergeanur включено в состав коммита
944
#endif
Filip Gawin's avatar
Filip Gawin включено в состав коммита
945

Sergeanur's avatar
Sergeanur включено в состав коммита
946
947
948
	uint8 vol;
	uint8 emittingVol;
	CVector position;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
949

Sergeanur's avatar
Sergeanur включено в состав коммита
950
951
952
953
954
955
956
#ifdef EXTERNAL_3D_SOUND
	#define WORKING_VOLUME_FIELD m_nEmittingVolume
#else
	#define WORKING_VOLUME_FIELD m_nVolume
#endif

#ifdef USE_TIME_SCALE_FOR_AUDIO
Sergeanur's avatar
Sergeanur включено в состав коммита
957
	float timeScale = m_bIsPaused ? 1.0f : CTimer::GetTimeScale();
Sergeanur's avatar
Sergeanur включено в состав коммита
958
959
#endif

Sergeanur's avatar
Sergeanur включено в состав коммита
960
961
	for (uint8 i = 0; i < m_nActiveSamples; i++) {
		m_aRequestedQueue[m_nActiveQueue][i].m_bIsBeingPlayed = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
962
		m_asActiveSamples[i].m_bIsBeingPlayed = FALSE;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
963
964
	}

Sergeanur's avatar
Sergeanur включено в состав коммита
965
966
	for (uint8 i = 0; i < m_nRequestedCount[m_nActiveQueue]; i++) {
		tSound &sample = m_aRequestedQueue[m_nActiveQueue][m_aRequestedOrderList[m_nActiveQueue][i]];
Sergeanur's avatar
Sergeanur включено в состав коммита
967
		if (sample.m_nSampleIndex != NO_SAMPLE) {
Sergeanur's avatar
Sergeanur включено в состав коммита
968
			for (uint8 j = 0; j < m_nActiveSamples; j++) {
Sergeanur's avatar
Sergeanur включено в состав коммита
969
970
				if (sample.m_nEntityIndex == m_asActiveSamples[j].m_nEntityIndex && sample.m_nCounter == m_asActiveSamples[j].m_nCounter &&
				    sample.m_nSampleIndex == m_asActiveSamples[j].m_nSampleIndex) {
Sergeanur's avatar
Sergeanur включено в состав коммита
971
					if (sample.m_nLoopCount > 0) {
Sergeanur's avatar
Sergeanur включено в состав коммита
972
#if GTA_VERSION >= GTA3_PC_10
Sergeanur's avatar
Sergeanur включено в состав коммита
973
						if (m_FrameCounter & 1)
Sergeanur's avatar
Sergeanur включено в состав коммита
974
							flag = !!(j & 1);
Sergeanur's avatar
Sergeanur включено в состав коммита
975
						else
Sergeanur's avatar
Sergeanur включено в состав коммита
976
977
							flag = !(j & 1);
						if (flag && !SampleManager.GetChannelUsedFlag(j)) {
Sergeanur's avatar
Sergeanur включено в состав коммита
978
979
980
981
982
983
984
985
986
#else
						if (m_asActiveSamples[j].unk != 0)
							m_asActiveSamples[j].unk--;
						else if (SampleManager.GetChannelUsedFlag(j))
							m_asActiveSamples[j].unk = m_nTimeSpent * SampleManager.GetSampleLength(m_asActiveSamples[j].m_nSampleIndex) / m_asActiveSamples[j].m_nFrequency;
						else {
#endif
							sample.m_bIsPlayingFinished = TRUE;
							m_asActiveSamples[j].m_bIsPlayingFinished = TRUE;
Sergeanur's avatar
Sergeanur включено в состав коммита
987
988
989
990
991
							m_asActiveSamples[j].m_nSampleIndex = NO_SAMPLE;
							m_asActiveSamples[j].m_nEntityIndex = AEHANDLE_NONE;
							continue;
						}
					}
Sergeanur's avatar
Sergeanur включено в состав коммита
992
993
					sample.m_bIsBeingPlayed = TRUE;
					m_asActiveSamples[j].m_bIsBeingPlayed = TRUE;
Sergeanur's avatar
Sergeanur включено в состав коммита
994
					sample.m_nVolumeChange = -1;
Sergeanur's avatar
Sergeanur включено в состав коммита
995
					if (!sample.m_bStatic) {
Sergeanur's avatar
Sergeanur включено в состав коммита
996
						if (sample.m_bIs2D) {
Sergeanur's avatar
Sergeanur включено в состав коммита
997
998
999
							emittingVol = m_bDoubleVolume ? 2 * Min(63, sample.WORKING_VOLUME_FIELD) : sample.WORKING_VOLUME_FIELD;
#ifdef USE_TIME_SCALE_FOR_AUDIO
							SampleManager.SetChannelFrequency(j, sample.m_nFrequency * timeScale);
Sergeanur's avatar
Sergeanur включено в состав коммита
1000
#else
Для ускорения просмотра не вся история отображается Просмотреть всю вину