summaryrefslogtreecommitdiff
path: root/Runtime/Audio/AudioListener.cpp
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-08-14 22:50:43 +0800
committerchai <chaifix@163.com>2019-08-14 22:50:43 +0800
commit15740faf9fe9fe4be08965098bbf2947e096aeeb (patch)
treea730ec236656cc8cab5b13f088adfaed6bb218fb /Runtime/Audio/AudioListener.cpp
+Unity Runtime codeHEADmaster
Diffstat (limited to 'Runtime/Audio/AudioListener.cpp')
-rw-r--r--Runtime/Audio/AudioListener.cpp177
1 files changed, 177 insertions, 0 deletions
diff --git a/Runtime/Audio/AudioListener.cpp b/Runtime/Audio/AudioListener.cpp
new file mode 100644
index 0000000..5b083e5
--- /dev/null
+++ b/Runtime/Audio/AudioListener.cpp
@@ -0,0 +1,177 @@
+#include "UnityPrefix.h"
+#include "AudioManager.h"
+#include "AudioListener.h"
+#include "Runtime/Graphics/Transform.h"
+#include "Runtime/Serialize/TransferFunctions/SerializeTransfer.h"
+#include "Runtime/Input/TimeManager.h"
+#include "Runtime/Camera/Camera.h"
+#include "Runtime/BaseClasses/IsPlaying.h"
+#include "Runtime/Camera/RenderManager.h"
+#include "AudioSourceFilter.h"
+#include "AudioEchoFilter.h"
+#include "AudioChorusFilter.h"
+#include "correct_fmod_includer.h"
+#include "Runtime/Misc/BuildSettings.h"
+#include "Runtime/Mono/MonoBehaviour.h"
+
+#if ENABLE_AUDIO
+
+AudioListener::AudioListener (MemLabelId label, ObjectCreationMode mode)
+: Super(label, mode)
+, m_Node(this)
+, m_VelocityUpdateMode (kVelocityUpdateModeAuto)
+, m_LastPosition(Vector3f(0,0,0))
+{
+}
+
+AudioListener::~AudioListener ()
+{
+ GetAudioManager().RemoveAudioListener(this);
+}
+
+void AudioListener::Cleanup()
+{
+#if ENABLE_AUDIO_FMOD
+ const GameObject* go = GetGameObjectPtr();
+ if (!go)
+ return;
+ for (int i=0;i<go->GetComponentCount();i++)
+ {
+ AudioFilter* filter = dynamic_pptr_cast<AudioFilter*> (&go->GetComponentAtIndex(i));
+ if (filter == NULL)
+ continue;
+
+ filter->Cleanup();
+ }
+#endif
+}
+
+void AudioListener::RemoveFromManager ()
+{
+ GetAudioManager().RemoveAudioListener(this);
+}
+
+void AudioListener::AddToManager ()
+{
+ m_LastPosition = GetCurrentTransform().GetPosition();
+ GetAudioManager().AddAudioListener(this);
+#if ENABLE_AUDIO_FMOD
+ ApplyFilters();
+#endif
+}
+
+void AudioListener::AwakeFromLoad (AwakeFromLoadMode awakeMode)
+{
+ Super::AwakeFromLoad (awakeMode);
+}
+
+void AudioListener::SetAlternativeTransform(Transform* t)
+{
+ m_AltTransform = t;
+}
+
+const Transform& AudioListener::GetCurrentTransform() const
+{
+#if UNITY_EDITOR
+ if (!IsWorldPlaying())
+ {
+ Transform* altTransform = m_AltTransform;
+ if (altTransform)
+ return *altTransform;
+ }
+#endif
+ return GetComponent(Transform);
+}
+
+void AudioListener::DoUpdate ()
+{
+ const Transform& transform = GetCurrentTransform();
+ const Vector3f pos = transform.GetPosition();
+
+ Vector3f vel = (pos - m_LastPosition) * GetInvDeltaTime ();
+ GetAudioManager().UpdateListener(
+ pos,
+ vel,
+ NormalizeSafe(transform.TransformDirection( Vector3f (0.0f, 1.0f, 0.0f) )),
+ NormalizeSafe(transform.TransformDirection( Vector3f (0.0f, 0.0f, 1.0f) ))
+ );
+ m_LastPosition = pos;
+}
+
+void AudioListener::Update()
+{
+ if(m_VelocityUpdateMode == kVelocityUpdateModeAuto)
+ m_VelocityUpdateMode = GetAudioManager().GetAutomaticUpdateMode( GetGameObjectPtr() );
+
+ if(m_VelocityUpdateMode==kVelocityUpdateModeDynamic)
+ DoUpdate();
+}
+
+void AudioListener::FixedUpdate()
+{
+ if(m_VelocityUpdateMode == kVelocityUpdateModeAuto)
+ m_VelocityUpdateMode = GetAudioManager().GetAutomaticUpdateMode( GetGameObjectPtr());
+
+ if(m_VelocityUpdateMode==kVelocityUpdateModeFixed)
+ DoUpdate();
+}
+
+// Apply filters
+#if ENABLE_AUDIO_FMOD
+void AudioListener::ApplyFilters()
+{
+ const GameObject& go = GetGameObject();
+ for (int i=0;i<go.GetComponentCount();i++)
+ {
+ FMOD::DSP* dsp = NULL;
+
+ AudioFilter* filter = NULL;
+ filter = dynamic_pptr_cast<AudioFilter*> (&go.GetComponentAtIndex(i));
+ if ( filter && GetBuildSettings().hasAdvancedVersion )
+ dsp = filter->GetDSP();
+
+ #if ENABLE_SCRIPTING
+ if (!dsp)
+ {
+ MonoBehaviour* behaviour = dynamic_pptr_cast<MonoBehaviour*> (&go.GetComponentAtIndex(i));
+ if ( behaviour ) dsp = behaviour->GetOrCreateDSP();
+ }
+ #endif
+
+ if (dsp == NULL)
+ continue;
+
+ FMOD_RESULT result;
+ result = dsp->remove();
+ FMOD_ASSERT(result);
+ result = GetAudioManager().GetChannelGroup_FX_IgnoreVolume()->addDSP(dsp, 0);
+ FMOD_ASSERT(result);
+ }
+}
+#endif
+
+void AudioListener::OnAddComponent()
+{
+#if ENABLE_AUDIO_FMOD
+ ApplyFilters();
+#endif
+}
+
+void AudioListener::InitializeClass ()
+{
+ REGISTER_MESSAGE_VOID (AudioListener, kDidAddComponent, OnAddComponent);
+}
+
+void AudioListener::CleanupClass()
+{
+}
+
+template<class TransferFunc>
+void AudioListener::Transfer (TransferFunc& transfer) {
+ Super::Transfer (transfer);
+}
+
+IMPLEMENT_CLASS_HAS_INIT (AudioListener)
+IMPLEMENT_OBJECT_SERIALIZE (AudioListener)
+
+#endif