Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_SoundManagerModule.c
Go to the documentation of this file.
1
10
11class SCR_SoundManagerModule : SndBaseModule
12{
14 private ref array<ref SCR_AudioSource> m_aAudioSource = {};
16 private SoundWorld m_SoundWorld;
17
19 static const string DYNAMIC_RANGE_SIGNAL_NAME = "DynamicRange";
20 static const string G_TINNITUS_SIGNAL_NAME = "GTinnitus";
21 static const string IN_EDITOR_SIGNAL_NAME = "InEditor";
22
24 private static int s_iDynamicRangeIdx;
25 private static int s_iGTinnitusIdx;
26 private static int s_iInEditorIdx;
27
28#ifdef ENABLE_DIAG
29 private static int s_iCreatedAudioSources;
30 private static int s_iMaxActiveAudioSources;
31 private static int s_iPlayedAudioSources;
32 private static int s_iInvalidAudioSources;
33 private static int s_iInaudibleAudioSources;
34 private static int s_iTerminateAudioSourceCalls;
35 private static int s_iCalculateInterirorAtCount;
36#endif
37
38 //------------------------------------------------------------------------------------------------
45 SCR_AudioSource CreateAudioSource(notnull IEntity owner, string eventName)
46 {
47 // Get SCR_AudioSourceConfiguration prefab data
48 SCR_SoundDataComponent soundDataComponent = SCR_SoundDataComponent.Cast(owner.FindComponent(SCR_SoundDataComponent));
49 if (!soundDataComponent)
50 return null;
51
52 SCR_AudioSourceConfiguration audioSourceConfiguration = soundDataComponent.GetAudioSourceConfiguration(eventName);
53 if (!audioSourceConfiguration)
54 return null;
55
56 return CreateAudioSource(owner, audioSourceConfiguration);
57 }
58
59 //------------------------------------------------------------------------------------------------
66 SCR_AudioSource CreateAudioSource(notnull IEntity owner, SCR_AudioSourceConfiguration audioSourceConfiguration)
67 {
68#ifdef ENABLE_DIAG
69 s_iCreatedAudioSources++;
70#endif
71
72 // Is sound source in audible range?
73 vector mat[4];
74 owner.GetTransform(mat);
75
76 // Has offset
77 if (audioSourceConfiguration.HasOffset())
78 {
79 mat[3] = owner.CoordToParent(audioSourceConfiguration.m_vOffset);
80 }
81
82 float distance = AudioSystem.IsAudible(audioSourceConfiguration.m_sSoundProject, audioSourceConfiguration.m_sSoundEventName, mat[3]);
83 if (distance < 0)
84 {
85#ifdef ENABLE_DIAG
86 s_iInaudibleAudioSources++;
87#endif
88
89 return null;
90 }
91
92 // Create audio source
93 SCR_AudioSource audioSource = new SCR_AudioSource(audioSourceConfiguration, mat);
94
95 // Set distance signal
96 audioSource.SetSignalValue(SCR_AudioSource.DISTANCE_SINAL_NAME, distance);
97
98 // Set owner
99 audioSource.m_Owner = owner;
100
101 return audioSource;
102 }
103
104 //------------------------------------------------------------------------------------------------
113 SCR_AudioSource CreateAudioSource(notnull IEntity owner, SCR_AudioSourceConfiguration audioSourceConfiguration, vector worldPosition)
114 {
115#ifdef ENABLE_DIAG
116 s_iCreatedAudioSources++;
117#endif
118
119 // Is sound source in audible range?
120 vector mat[4];
121
122 // Get orientation matrix
123 owner.GetTransform(mat);
124
125 // Use worldPosition as initial sound position
126 mat[3] = worldPosition;
127
128 float distance = AudioSystem.IsAudible(audioSourceConfiguration.m_sSoundProject, audioSourceConfiguration.m_sSoundEventName, mat[3]);
129 if (distance < 0)
130 {
131#ifdef ENABLE_DIAG
132 s_iInaudibleAudioSources++;
133#endif
134
135 return null;
136 }
137
138 // Create audio source
139 SCR_AudioSource audioSource = new SCR_AudioSource(audioSourceConfiguration, mat);
140
141 // Set distance signal
142 audioSource.SetSignalValue(SCR_AudioSource.DISTANCE_SINAL_NAME, distance);
143
144 // Set owner
145 audioSource.m_Owner = owner;
146
147 // Set offset
148 vector offset = owner.CoordToLocal(worldPosition);
149 audioSource.m_vOffset = audioSource.m_vOffset + offset;
150 SCR_Enum.SetFlag(audioSource.m_eFlags, EAudioSourceFlag.HasOffset);
151
152 return audioSource;
153 }
154
155 //------------------------------------------------------------------------------------------------
162 SCR_AudioSource CreateAudioSource(SCR_AudioSourceConfiguration audioSourceConfiguration, vector worldPosition)
163 {
164#ifdef ENABLE_DIAG
165 s_iCreatedAudioSources++;
166#endif
167
168 // Is sound source in audible range?
169 vector mat[4];
170
171 // Set default orientation matrix
172 Math3D.MatrixIdentity4(mat);
173
174 // Use worldPosition as initial sound position
175 mat[3] = worldPosition;
176
177 float distance = AudioSystem.IsAudible(audioSourceConfiguration.m_sSoundProject, audioSourceConfiguration.m_sSoundEventName, mat[3]);
178 if (distance < 0)
179 {
180#ifdef ENABLE_DIAG
181 s_iInaudibleAudioSources++;
182#endif
183
184 return null;
185 }
186
187 // Create audio source
188 SCR_AudioSource audioSource = new SCR_AudioSource(audioSourceConfiguration, mat);
189
190 // Set distance signal
191 audioSource.SetSignalValue(SCR_AudioSource.DISTANCE_SINAL_NAME, distance);
192
193 // Disable flags that make sense only when owner entity exists
194 SCR_Enum.SetFlag(audioSource.m_eFlags, EAudioSourceFlag.FinishWhenEntityDestroyed);
195 SCR_Enum.SetFlag(audioSource.m_eFlags, EAudioSourceFlag.Static);
196
197 return audioSource;
198 }
199
200 //------------------------------------------------------------------------------------------------
207 static void CreateAndPlayAudioSource(notnull IEntity owner, string eventName)
208 {
209 SCR_SoundManagerModule soundManager = SCR_SoundManagerModule.GetInstance(owner.GetWorld());
210 if (!soundManager)
211 return;
212
213 SCR_AudioSource audioSource = soundManager.CreateAudioSource(owner, eventName);
214 if (!audioSource)
215 return;
216
217 soundManager.PlayAudioSource(audioSource);
218 }
219
220 //------------------------------------------------------------------------------------------------
227 static void CreateAndPlayAudioSource(notnull IEntity owner, SCR_AudioSourceConfiguration audioSourceConfiguration)
228 {
229 if (!audioSourceConfiguration || !audioSourceConfiguration.IsValid())
230 return;
231
232 SCR_SoundManagerModule soundManager = SCR_SoundManagerModule.GetInstance(owner.GetWorld());
233 if (!soundManager)
234 return;
235
236 SCR_AudioSource audioSource = soundManager.CreateAudioSource(owner, audioSourceConfiguration);
237 if (!audioSource)
238 return;
239
240 soundManager.PlayAudioSource(audioSource);
241 }
242
243 //------------------------------------------------------------------------------------------------
250 void PlayAudioSource(notnull SCR_AudioSource audioSource)
251 {
252 // Set environmental signals
253 audioSource.SetEnvironmentalSignals(m_SoundWorld);
254
255 if (m_SoundWorld && !SCR_Enum.HasFlag(audioSource.m_eFlags, EAudioSourceFlag.ExteriorSource))
256 {
257 audioSource.CalculateInteriror(m_SoundWorld);
258
259#ifdef ENABLE_DIAG
260 s_iCalculateInterirorAtCount++;
261#endif
262
263 // Inset audio source to audio source pool
264 m_aAudioSource.Insert(audioSource);
265 }
266 else
267 {
268 // Inset audio source to audio source pool
269 if (audioSource.Play())
270 m_aAudioSource.Insert(audioSource);
271 }
272 }
273
274 //------------------------------------------------------------------------------------------------
279 void TerminateAudioSource(IEntity entity)
280 {
281#ifdef ENABLE_DIAG
282 s_iTerminateAudioSourceCalls++;
283#endif
284
285 foreach(SCR_AudioSource audioSource : m_aAudioSource)
286 {
287 if (audioSource.m_Owner == entity)
288 {
289 audioSource.Terminate();
290 }
291 }
292 }
293
294 //------------------------------------------------------------------------------------------------
299 void TerminateAudioSource(SCR_AudioSource audioSource)
300 {
301 // AudioSource was already played and removed
302 if (!audioSource)
303 return;
304
305 // Terminate sound
306 audioSource.Terminate();
307 }
308
309 //------------------------------------------------------------------------------------------------
313 void TerminateAll()
314 {
315 foreach (SCR_AudioSource audioSource : m_aAudioSource)
316 {
317 audioSource.Terminate(false);
318 }
319 }
320
321 //------------------------------------------------------------------------------------------------
324 static SCR_SoundManagerModule GetInstance(World world)
325 {
326 SndSystem sndSystem = SndSystem.Cast(world.FindSystem(SndSystem));
327
328 if (!sndSystem)
329 {
330 return null;
331 }
332
333 return SCR_SoundManagerModule.Cast(sndSystem.FindModule(SCR_SoundManagerModule));
334 }
335
336 //------------------------------------------------------------------------------------------------
340 private void HandleAudioSources()
341 {
342 for (int i = m_aAudioSource.Count() - 1; i >= 0; i--)
343 {
344 SCR_AudioSource audioSource = m_aAudioSource[i];
345
346 // Remove audio source if sound finished playing
347 if (AudioSystem.IsSoundPlayed(audioSource.m_AudioHandle) && !audioSource.m_InteriorRequestCallback)
348 {
349 m_aAudioSource.Remove(i);
350 continue;
351 }
352
353 if (audioSource.m_Owner)
354 {
355 // Update audio source position
356 if (!SCR_Enum.HasFlag(audioSource.m_eFlags, EAudioSourceFlag.Static))
357 audioSource.UpdateSoundTransformation();
358 }
359 else
360 {
361 // Remove audio source if parent entity was deleted
362 if (!SCR_Enum.HasFlag(audioSource.m_eFlags, EAudioSourceFlag.FinishWhenEntityDestroyed) && !audioSource.m_InteriorRequestCallback)
363 {
364 audioSource.Terminate();
365 m_aAudioSource.Remove(i);
366 }
367 }
368 }
369
370#ifdef ENABLE_DIAG
371 if (DiagMenu.GetBool(SCR_DebugMenuID.DEBUGUI_SOUNDS_SOUND_MANAGER))
372 {
373 int count = m_aAudioSource.Count();
374 DbgUI.Begin("Sound Manager");
375 DbgUI.Text("Active Audio Sources :" + count);
376 if (count > s_iMaxActiveAudioSources)
377 s_iMaxActiveAudioSources = count;
378 DbgUI.Text("Maximum Active Audio Sources :" + s_iMaxActiveAudioSources);
379 DbgUI.Text("Created Audio Sources :" + s_iCreatedAudioSources);
380 DbgUI.Text("Played Audio Sources :" + s_iPlayedAudioSources);
381 DbgUI.Text("Invalid Audio Sources :" + s_iInvalidAudioSources);
382 DbgUI.Text("Inaudible Audio Sources :" + s_iInaudibleAudioSources);
383 DbgUI.Text("TerminateAudioSource() Calls :" + s_iTerminateAudioSourceCalls);
384 DbgUI.Text("CalculateInterirorAt() Count :" + s_iCalculateInterirorAtCount);
385 DbgUI.End();
386
387 // Print events for active audio sources
388 if (m_aAudioSource.Count() != 0)
389 {
390 Print("--- " + m_aAudioSource.Count().ToString() + " playing sound events ---");
391 foreach (SCR_AudioSource audioSource : m_aAudioSource)
392 {
393 Print(audioSource.m_sSoundEventName);
394 }
395 }
396 }
397
398 if (DiagMenu.GetBool(SCR_DebugMenuID.DEBUGUI_SOUNDS_GLOBAL_VARIABLES))
399 {
400 Resource holder = BaseContainerTools.LoadContainer("{A60F08955792B575}Sounds/_SharedData/Variables/GlobalVariables.conf");
401 if (!holder)
402 return;
403
404 BaseContainer baseContainer = holder.GetResource().ToBaseContainer();
405 if (!baseContainer)
406 return;
407
408 BaseContainerList list = baseContainer.GetObjectArray("Variables");
409 if (!list)
410 return;
411
412 DbgUI.Begin("Global Variables");
413 for (int i, count = list.Count(); i < count; i++)
414 {
415 string name = list[i].GetName();
416 DbgUI.Text(name + ": " + AudioSystem.GetVariableValue(name, "{A60F08955792B575}Sounds/_SharedData/Variables/GlobalVariables.conf").ToString(-1,2));
417 }
418 DbgUI.End();
419 }
420#endif
421 }
422
423 //------------------------------------------------------------------------------------------------
428 {
429 BaseContainer settings = GetGame().GetGameUserSettings().GetModule("SCR_AudioSettings");
430 if (!settings)
431 return;
432
433 float value;
434 settings.Get("m_fDynamicRange", value);
435
436 // DynamicRange has range <-1, 1>
437 GetGame().GetSignalsManager().SetSignalValue(s_iDynamicRangeIdx, value * 0.01 - 1);
438 }
439
440 //------------------------------------------------------------------------------------------------
444 protected void SetTinnitusSignalValue()
445 {
446 BaseContainer settings = GetGame().GetGameUserSettings().GetModule("SCR_AudioSettings");
447 if (!settings)
448 return;
449
450 bool value;
451 settings.Get("m_bGTinnitus", value);
452
453 GetGame().GetSignalsManager().SetSignalValue(s_iGTinnitusIdx, value);
454 }
455
456 //------------------------------------------------------------------------------------------------
460 protected void OnEditorOpen()
461 {
462 GetGame().GetSignalsManager().SetSignalValue(s_iInEditorIdx, 1);
463 }
464
465 //------------------------------------------------------------------------------------------------
469 protected void OnEditorClose()
470 {
471 GetGame().GetSignalsManager().SetSignalValue(s_iInEditorIdx, 0);
472 }
473
474 //------------------------------------------------------------------------------------------------
478 protected void OnEditorManagerInit(SCR_EditorManagerEntity editorManager)
479 {
480 editorManager.GetOnOpened().Insert(OnEditorOpen);
481 editorManager.GetOnClosed().Insert(OnEditorClose);
482 }
483
484 //------------------------------------------------------------------------------------------------
488 protected void OnEditorManagerExit(SCR_EditorManagerEntity editorManager)
489 {
490 editorManager.GetOnOpened().Remove(OnEditorOpen);
491 editorManager.GetOnClosed().Remove(OnEditorClose);
492 }
493
494 //------------------------------------------------------------------------------------------------
498 protected void EditorManagerEventsInit()
499 {
500 SCR_EditorManagerEntity editorManager = SCR_EditorManagerEntity.GetInstance();
501 if (editorManager)
502 OnEditorManagerInit(editorManager);
503 else
504 {
506 if (editorManagerCore)
507 editorManagerCore.Event_OnEditorManagerInitOwner.Insert(OnEditorManagerInit);
508 }
509 }
510
511 //------------------------------------------------------------------------------------------------
515 protected void EditorManagerEventsExit()
516 {
517 SCR_EditorManagerEntity editorManager = SCR_EditorManagerEntity.GetInstance();
518 if (editorManager)
519 OnEditorManagerExit(editorManager);
520
522 if (editorManagerCore)
523 editorManagerCore.Event_OnEditorManagerInitOwner.Remove(OnEditorManagerInit);
524 }
525
526 //------------------------------------------------------------------------------------------------
527 override void OnUpdate(float timeslice)
528 {
529 HandleAudioSources();
530 }
531
532 //------------------------------------------------------------------------------------------------
533 override void OnInit()
534 {
535 // Get global signals indexes
536 GameSignalsManager gameSignalsManager = GetGame().GetSignalsManager();
537
538 s_iDynamicRangeIdx = gameSignalsManager.AddOrFindSignal(DYNAMIC_RANGE_SIGNAL_NAME);
539 s_iGTinnitusIdx = gameSignalsManager.AddOrFindSignal(G_TINNITUS_SIGNAL_NAME);
540 s_iInEditorIdx = gameSignalsManager.AddOrFindSignal(IN_EDITOR_SIGNAL_NAME);
541
542 // Event listeners for audio game settings
543 GetGame().OnUserSettingsChangedInvoker().Insert(SetDynamicRangeSignalValue);
544 GetGame().OnUserSettingsChangedInvoker().Insert(SetTinnitusSignalValue);
545 // Update DynamicRange signal
547 // Update EnableTinnitus signal
549
550 //Event listeners for editor manager
552
553 // GetSoundWorld
554 ChimeraWorld chimeraWorld = ChimeraWorld.CastFrom(GetGame().GetWorld());
555 if (chimeraWorld)
556 m_SoundWorld = chimeraWorld.GetSoundWorld();
557
558#ifdef ENABLE_DIAG
559 s_iCreatedAudioSources = 0;
560 s_iMaxActiveAudioSources = 0;
561 s_iPlayedAudioSources = 0;
562 s_iInvalidAudioSources = 0;
563 s_iInaudibleAudioSources = 0;
564 s_iTerminateAudioSourceCalls = 0;
565 s_iCalculateInterirorAtCount = 0;
566#endif
567 }
568
569 //------------------------------------------------------------------------------------------------
571 {
572#ifdef ENABLE_DIAG
573 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_SOUNDS_SOUND_MANAGER, "", "Sound Manager", "Sounds");
574 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_SOUNDS_GLOBAL_VARIABLES, "", "Global Variables", "Sounds");
575#endif
576 }
577
578 //------------------------------------------------------------------------------------------------
580 {
581 // Terminate all playing sounds
582 TerminateAll();
583
584 // Remove from audio game settings event
585 GetGame().OnUserSettingsChangedInvoker().Remove(SetDynamicRangeSignalValue);
586
587 // Remove from editor manager events
589
590#ifdef ENABLE_DIAG
591 DiagMenu.Unregister(SCR_DebugMenuID.DEBUGUI_SOUNDS_SOUND_MANAGER);
592 DiagMenu.Unregister(SCR_DebugMenuID.DEBUGUI_SOUNDS_GLOBAL_VARIABLES);
593#endif
594 }
595};
SCR_DebugMenuID
This enum contains all IDs for DiagMenu entries added in script.
Definition DebugMenuID.c:4
ArmaReforgerScripted GetGame()
Definition game.c:1398
EAudioSourceFlag
void SCR_AudioSource(SCR_AudioSourceConfiguration audioSourceConfiguration, vector mat[4])
float distance
void SCR_EditorManagerEntity(IEntitySource src, IEntity parent)
Definition DbgUI.c:66
Diagnostic and developer menu system.
Definition DiagMenu.c:18
Object holding reference to resource. In destructor release the resource.
Definition Resource.c:25
Core component to manage SCR_EditorManagerEntity.
void OnEditorManagerExit(SCR_EditorManagerEntity editorManager)
void SCR_SoundManagerModule(IEntitySource src, IEntity parent)
void OnEditorManagerInit(SCR_EditorManagerEntity editorManager)
override void OnUpdate(float timeslice)
Definition World.c:16
proto external void TerminateAll()
proto void Print(void var, LogLevel level=LogLevel.NORMAL)
Prints content of variable to console/log.