14 private ref array<ref SCR_AudioSource> m_aAudioSource = {};
16 private SoundWorld m_SoundWorld;
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";
24 private static int s_iDynamicRangeIdx;
25 private static int s_iGTinnitusIdx;
26 private static int s_iInEditorIdx;
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;
48 SCR_SoundDataComponent soundDataComponent = SCR_SoundDataComponent.Cast(owner.FindComponent(SCR_SoundDataComponent));
49 if (!soundDataComponent)
52 SCR_AudioSourceConfiguration audioSourceConfiguration = soundDataComponent.GetAudioSourceConfiguration(eventName);
53 if (!audioSourceConfiguration)
56 return CreateAudioSource(owner, audioSourceConfiguration);
66 SCR_AudioSource CreateAudioSource(notnull
IEntity owner, SCR_AudioSourceConfiguration audioSourceConfiguration)
69 s_iCreatedAudioSources++;
74 owner.GetTransform(mat);
77 if (audioSourceConfiguration.HasOffset())
79 mat[3] = owner.CoordToParent(audioSourceConfiguration.m_vOffset);
82 float distance =
AudioSystem.IsAudible(audioSourceConfiguration.m_sSoundProject, audioSourceConfiguration.m_sSoundEventName, mat[3]);
86 s_iInaudibleAudioSources++;
99 audioSource.m_Owner = owner;
116 s_iCreatedAudioSources++;
123 owner.GetTransform(mat);
126 mat[3] = worldPosition;
128 float distance =
AudioSystem.IsAudible(audioSourceConfiguration.m_sSoundProject, audioSourceConfiguration.m_sSoundEventName, mat[3]);
132 s_iInaudibleAudioSources++;
145 audioSource.m_Owner = owner;
148 vector offset = owner.CoordToLocal(worldPosition);
149 audioSource.m_vOffset = audioSource.m_vOffset + offset;
162 SCR_AudioSource CreateAudioSource(SCR_AudioSourceConfiguration audioSourceConfiguration,
vector worldPosition)
165 s_iCreatedAudioSources++;
172 Math3D.MatrixIdentity4(mat);
175 mat[3] = worldPosition;
177 float distance =
AudioSystem.IsAudible(audioSourceConfiguration.m_sSoundProject, audioSourceConfiguration.m_sSoundEventName, mat[3]);
181 s_iInaudibleAudioSources++;
207 static void CreateAndPlayAudioSource(notnull
IEntity owner,
string eventName)
213 SCR_AudioSource audioSource = soundManager.CreateAudioSource(owner, eventName);
217 soundManager.PlayAudioSource(audioSource);
227 static void CreateAndPlayAudioSource(notnull
IEntity owner, SCR_AudioSourceConfiguration audioSourceConfiguration)
229 if (!audioSourceConfiguration || !audioSourceConfiguration.IsValid())
236 SCR_AudioSource audioSource = soundManager.CreateAudioSource(owner, audioSourceConfiguration);
240 soundManager.PlayAudioSource(audioSource);
253 audioSource.SetEnvironmentalSignals(m_SoundWorld);
257 audioSource.CalculateInteriror(m_SoundWorld);
260 s_iCalculateInterirorAtCount++;
264 m_aAudioSource.Insert(audioSource);
269 if (audioSource.Play())
270 m_aAudioSource.Insert(audioSource);
279 void TerminateAudioSource(
IEntity entity)
282 s_iTerminateAudioSourceCalls++;
287 if (audioSource.m_Owner == entity)
289 audioSource.Terminate();
306 audioSource.Terminate();
317 audioSource.Terminate(
false);
340 private void HandleAudioSources()
342 for (
int i = m_aAudioSource.Count() - 1; i >= 0; i--)
347 if (
AudioSystem.IsSoundPlayed(audioSource.m_AudioHandle) && !audioSource.m_InteriorRequestCallback)
349 m_aAudioSource.Remove(i);
353 if (audioSource.m_Owner)
357 audioSource.UpdateSoundTransformation();
362 if (!
SCR_Enum.HasFlag(audioSource.m_eFlags,
EAudioSourceFlag.FinishWhenEntityDestroyed) && !audioSource.m_InteriorRequestCallback)
364 audioSource.Terminate();
365 m_aAudioSource.Remove(i);
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);
388 if (m_aAudioSource.Count() != 0)
390 Print(
"--- " + m_aAudioSource.Count().ToString() +
" playing sound events ---");
393 Print(audioSource.m_sSoundEventName);
404 BaseContainer baseContainer = holder.GetResource().ToBaseContainer();
412 DbgUI.Begin(
"Global Variables");
413 for (
int i, count = list.Count(); i < count; i++)
415 string name = list[i].GetName();
416 DbgUI.Text(name +
": " +
AudioSystem.GetVariableValue(name,
"{A60F08955792B575}Sounds/_SharedData/Variables/GlobalVariables.conf").ToString(-1,2));
434 settings.Get(
"m_fDynamicRange", value);
437 GetGame().GetSignalsManager().SetSignalValue(s_iDynamicRangeIdx, value * 0.01 - 1);
451 settings.Get(
"m_bGTinnitus", value);
453 GetGame().GetSignalsManager().SetSignalValue(s_iGTinnitusIdx, value);
462 GetGame().GetSignalsManager().SetSignalValue(s_iInEditorIdx, 1);
471 GetGame().GetSignalsManager().SetSignalValue(s_iInEditorIdx, 0);
506 if (editorManagerCore)
522 if (editorManagerCore)
529 HandleAudioSources();
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);
556 m_SoundWorld = chimeraWorld.GetSoundWorld();
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;