BVB Source Codes

CRYENGINE Show MFXAudioEffect.cpp Source code

Return Download CRYENGINE: download MFXAudioEffect.cpp Source code - Download CRYENGINE Source code - Type:.cpp
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. #include "StdAfx.h"
  4. #include "MFXAudioEffect.h"
  5.  
  6. #include <CryAudio/IAudioSystem.h>
  7.  
  8. namespace MaterialEffectsUtils
  9. {
  10. struct SAudio1pOr3pSwitch
  11. {
  12.         static const SAudio1pOr3pSwitch& Instance()
  13.         {
  14.                 static SAudio1pOr3pSwitch theInstance;
  15.                 return theInstance;
  16.         }
  17.  
  18.         AudioControlId GetSwitchId() const
  19.         {
  20.                 return m_switchID;
  21.         }
  22.  
  23.         AudioSwitchStateId Get1pStateId() const
  24.         {
  25.                 return m_1pStateID;
  26.         }
  27.  
  28.         AudioSwitchStateId Get3pStateId() const
  29.         {
  30.                 return m_3pStateID;
  31.         }
  32.  
  33.         bool IsValid() const
  34.         {
  35.                 return m_isValid;
  36.         }
  37.  
  38. private:
  39.  
  40.         SAudio1pOr3pSwitch()
  41.                 : m_switchID(INVALID_AUDIO_CONTROL_ID)
  42.                 , m_1pStateID(INVALID_AUDIO_SWITCH_STATE_ID)
  43.                 , m_3pStateID(INVALID_AUDIO_SWITCH_STATE_ID)
  44.                 , m_isValid(false)
  45.         {
  46.                 Initialize();
  47.         }
  48.  
  49.         void Initialize()
  50.         {
  51.                 gEnv->pAudioSystem->GetAudioSwitchId("1stOr3rdP", m_switchID);
  52.                 gEnv->pAudioSystem->GetAudioSwitchStateId(m_switchID, "1stP", m_1pStateID);
  53.                 gEnv->pAudioSystem->GetAudioSwitchStateId(m_switchID, "3rdP", m_3pStateID);
  54.  
  55.                 m_isValid = (m_switchID != INVALID_AUDIO_CONTROL_ID) &&
  56.                             (m_1pStateID != INVALID_AUDIO_SWITCH_STATE_ID) && (m_3pStateID != INVALID_AUDIO_SWITCH_STATE_ID);
  57.         }
  58.  
  59.         AudioControlId     m_switchID;
  60.         AudioSwitchStateId m_1pStateID;
  61.         AudioSwitchStateId m_3pStateID;
  62.  
  63.         bool               m_isValid;
  64. };
  65.  
  66. template<typename AudioProxyType>
  67. void PrepareForAudioTriggerExecution(AudioProxyType* pIAudioProxy, const SMFXAudioEffectParams& audioParams, const SMFXRunTimeEffectParams& runtimeParams)
  68. {
  69.         const MaterialEffectsUtils::SAudio1pOr3pSwitch& audio1pOr3pSwitch = MaterialEffectsUtils::SAudio1pOr3pSwitch::Instance();
  70.  
  71.         if (audio1pOr3pSwitch.IsValid())
  72.         {
  73.                 pIAudioProxy->SetSwitchState(
  74.                   audio1pOr3pSwitch.GetSwitchId(),
  75.                   runtimeParams.playSoundFP ? audio1pOr3pSwitch.Get1pStateId() : audio1pOr3pSwitch.Get3pStateId());
  76.         }
  77.  
  78.         for (SMFXAudioEffectParams::TSwitches::const_iterator it = audioParams.triggerSwitches.begin(), itEnd = audioParams.triggerSwitches.end(); it != itEnd; ++it)
  79.         {
  80.                 const SAudioSwitchWrapper& switchWrapper = *it;
  81.                 pIAudioProxy->SetSwitchState(switchWrapper.GetSwitchId(), switchWrapper.GetSwitchStateId());
  82.         }
  83.  
  84.         REINST("IEntityAudioComponent needs to support multiple IAudioProxy objects to properly handle Rtpcs tied to specific events");
  85.  
  86.         //Note: Rtpcs are global for the audio proxy object.
  87.         //      This can be a problem if the sound is processed through IEntityAudioComponent, where the object is shared for all audio events triggered through it!
  88.         //TODO: Add support to IEntityAudioComponent to handle multiple audio proxy objects
  89.         for (int i = 0; i < runtimeParams.numAudioRtpcs; ++i)
  90.         {
  91.                 const char* rtpcName = runtimeParams.audioRtpcs[i].rtpcName;
  92.                 if (rtpcName && *rtpcName)
  93.                 {
  94.                         AudioControlId rtpcId = INVALID_AUDIO_CONTROL_ID;
  95.                         if (gEnv->pAudioSystem->GetAudioRtpcId(rtpcName, rtpcId))
  96.                         {
  97.                                 pIAudioProxy->SetRtpcValue(rtpcId, runtimeParams.audioRtpcs[i].rtpcValue);
  98.                         }
  99.                 }
  100.         }
  101. }
  102.  
  103. }
  104.  
  105. //////////////////////////////////////////////////////////////////////////
  106.  
  107. void SAudioTriggerWrapper::Init(const char* triggerName)
  108. {
  109.         CRY_ASSERT(triggerName != NULL);
  110.  
  111.         gEnv->pAudioSystem->GetAudioTriggerId(triggerName, m_triggerID);
  112.  
  113. #if defined(MATERIAL_EFFECTS_DEBUG)
  114.         m_triggerName = triggerName;
  115. #endif
  116. }
  117.  
  118. void SAudioSwitchWrapper::Init(const char* switchName, const char* switchStateName)
  119. {
  120.         CRY_ASSERT(switchName != NULL);
  121.         CRY_ASSERT(switchStateName != NULL);
  122.  
  123.         gEnv->pAudioSystem->GetAudioSwitchId(switchName, m_switchID);
  124.         gEnv->pAudioSystem->GetAudioSwitchStateId(m_switchID, switchStateName, m_switchStateID);
  125.  
  126. #if defined(MATERIAL_EFFECTS_DEBUG)
  127.         m_switchName = switchName;
  128.         m_switchStateName = switchStateName;
  129. #endif
  130. }
  131.  
  132. //////////////////////////////////////////////////////////////////////////
  133.  
  134. CMFXAudioEffect::CMFXAudioEffect()
  135.         : CMFXEffectBase(eMFXPF_Audio)
  136. {
  137.  
  138. }
  139.  
  140. void CMFXAudioEffect::Execute(const SMFXRunTimeEffectParams& params)
  141. {
  142.         FUNCTION_PROFILER(gEnv->pSystem, PROFILE_ACTION);
  143.  
  144.         IF_UNLIKELY (!m_audioParams.trigger.IsValid())
  145.                 return;
  146.  
  147.         IEntity* pOwnerEntity = (params.audioProxyEntityId != 0) ? gEnv->pEntitySystem->GetEntity(params.audioProxyEntityId) : NULL;
  148.         if (pOwnerEntity)
  149.         {
  150.                 IEntityAudioComponent* pIEntityAudioComponent = pOwnerEntity->GetOrCreateComponent<IEntityAudioComponent>();
  151.                 CRY_ASSERT(pIEntityAudioComponent);
  152.  
  153.                 MaterialEffectsUtils::PrepareForAudioTriggerExecution<IEntityAudioComponent>(pIEntityAudioComponent, m_audioParams, params);
  154.  
  155.                 pIEntityAudioComponent->ExecuteTrigger(m_audioParams.trigger.GetTriggerId(), params.audioProxyId);
  156.         }
  157.         else
  158.         {
  159.                 IAudioProxy* pIAudioProxy = gEnv->pAudioSystem->GetFreeAudioProxy();
  160.                 if (pIAudioProxy != NULL)
  161.                 {
  162.                         pIAudioProxy->Initialize("MFXAudioEffect");
  163.  
  164.                         MaterialEffectsUtils::PrepareForAudioTriggerExecution<IAudioProxy>(pIAudioProxy, m_audioParams, params);
  165.  
  166.                         pIAudioProxy->SetPosition(params.pos);
  167.                         pIAudioProxy->SetOcclusionType(eAudioOcclusionType_Low);
  168.                         pIAudioProxy->SetCurrentEnvironments();
  169.                         pIAudioProxy->ExecuteTrigger(m_audioParams.trigger.GetTriggerId());
  170.                 }
  171.                 SAFE_RELEASE(pIAudioProxy);
  172.         }
  173. }
  174.  
  175. void CMFXAudioEffect::GetResources(SMFXResourceList& resourceList) const
  176. {
  177.         SMFXAudioListNode* pListNode = SMFXAudioListNode::Create();
  178.  
  179.         pListNode->m_audioParams.triggerName = m_audioParams.trigger.GetTriggerName();
  180.  
  181.         const size_t switchesCount = MIN(m_audioParams.triggerSwitches.size(), pListNode->m_audioParams.triggerSwitches.max_size());
  182.  
  183.         for (size_t i = 0; i < switchesCount; ++i)
  184.         {
  185.                 IMFXAudioParams::SSwitchData switchData;
  186.                 switchData.switchName = m_audioParams.triggerSwitches[i].GetSwitchName();
  187.                 switchData.switchStateName = m_audioParams.triggerSwitches[i].GetSwitchStateName();
  188.  
  189.                 pListNode->m_audioParams.triggerSwitches.push_back(switchData);
  190.         }
  191.  
  192.         SMFXAudioListNode* pNextNode = resourceList.m_audioList;
  193.  
  194.         if (pNextNode == NULL)
  195.         {
  196.                 resourceList.m_audioList = pListNode;
  197.         }
  198.         else
  199.         {
  200.                 while (pNextNode->pNext)
  201.                         pNextNode = pNextNode->pNext;
  202.  
  203.                 pNextNode->pNext = pListNode;
  204.         }
  205. }
  206.  
  207. void CMFXAudioEffect::LoadParamsFromXml(const XmlNodeRef& paramsNode)
  208. {
  209.         // Xml data format
  210.         /*
  211.            <Audio trigger="footstep">
  212.            <Switch name="Switch1" state="switch1_state" />
  213.            <Switch name="Switch2" state="swtich2_state" />
  214.            <Switch ... />
  215.            </Audio>
  216.          */
  217.  
  218.         m_audioParams.trigger.Init(paramsNode->getAttr("trigger"));
  219.  
  220.         const int childCount = paramsNode->getChildCount();
  221.         m_audioParams.triggerSwitches.reserve(childCount);
  222.  
  223.         for (int i = 0; i < childCount; ++i)
  224.         {
  225.                 const XmlNodeRef& childNode = paramsNode->getChild(i);
  226.  
  227.                 if (strcmp(childNode->getTag(), "Switch") == 0)
  228.                 {
  229.                         SAudioSwitchWrapper switchWrapper;
  230.                         switchWrapper.Init(childNode->getAttr("name"), childNode->getAttr("state"));
  231.                         if (switchWrapper.IsValid())
  232.                         {
  233.                                 m_audioParams.triggerSwitches.push_back(switchWrapper);
  234.                         }
  235. #if defined(MATERIAL_EFFECTS_DEBUG)
  236.                         else
  237.                         {
  238.                                 GameWarning("[MFX] AudioEffect (at line %d) : Switch '%s' or SwitchState '%s' not valid", paramsNode->getLine(), switchWrapper.GetSwitchName(), switchWrapper.GetSwitchStateName());
  239.                         }
  240. #endif
  241.                 }
  242.         }
  243.  
  244. #if defined(MATERIAL_EFFECTS_DEBUG)
  245.         if (!m_audioParams.trigger.IsValid())
  246.         {
  247.                 GameWarning("[MFX] AudioEffect (at line %d) : Trigger '%s'not valid", paramsNode->getLine(), m_audioParams.trigger.GetTriggerName());
  248.         }
  249. #endif
  250. }
  251.  
  252. void CMFXAudioEffect::GetMemoryUsage(ICrySizer* pSizer) const
  253. {
  254.         pSizer->AddObject(this, sizeof(*this));
  255.         pSizer->AddObject(&m_audioParams);
  256. }
  257.  
downloadMFXAudioEffect.cpp Source code - Download CRYENGINE Source code
Related Source Codes/Software:
postal - 2017-06-11
reactide - Reactide is the first dedicated IDE for React web ... 2017-06-11
rkt - rkt is a pod-native container engine for Linux. It... 2017-06-11
uWebSockets - Tiny WebSockets https://for... 2017-06-11
realworld - TodoMVC for the RealWorld - Exemplary fullstack Me... 2017-06-11
CRYENGINE - CRYENGINE is a powerful real-time game development... 2017-06-11
goreplay - GoReplay is an open-source tool for capturing and ... 2017-06-10
pyenv - Simple Python version management 2017-06-10
redux-saga - An alternative side effect model for Redux apps ... 2017-06-10
angular-starter - 2017-06-10

 Back to top