You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Gems/AudioEngineWwise/Code/Source/AudioEngineWwiseGemSystemCo...

196 lines
6.9 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#include <AudioEngineWwiseGemSystemComponent.h>
#include <AzCore/PlatformDef.h>
#include <AzCore/Memory/OSAllocator.h>
#include <AzCore/Serialization/SerializeContext.h>
#include <AzCore/Serialization/EditContext.h>
#include <AzCore/Serialization/EditContextConstants.inl>
#include <AzCore/Settings/SettingsRegistryMergeUtils.h>
#include <AzFramework/Platform/PlatformDefaults.h>
#include <AudioAllocators.h>
#include <AudioLogger.h>
#include <AudioSystemImplCVars.h>
#include <AudioSystemImpl_wwise.h>
#include <Common_wwise.h>
#include <Config_wwise.h>
#if defined(AUDIO_ENGINE_WWISE_EDITOR)
#include <AudioSystemEditor_wwise.h>
#endif // AUDIO_ENGINE_WWISE_EDITOR
namespace Audio
{
CAudioLogger g_audioImplLogger_wwise;
namespace Platform
{
void* InitializeSecondaryMemoryPool(size_t& secondarySize);
}
} // namespace Audio
namespace AudioEngineWwiseGem
{
void AudioEngineWwiseGemSystemComponent::Reflect(AZ::ReflectContext* context)
{
if (AZ::SerializeContext* serialize = azrtti_cast<AZ::SerializeContext*>(context))
{
serialize->Class<AudioEngineWwiseGemSystemComponent, AZ::Component>()
->Version(0)
;
if (AZ::EditContext* ec = serialize->GetEditContext())
{
ec->Class<AudioEngineWwiseGemSystemComponent>("Audio Engine Wwise Gem", "Wwise implementation of the Audio Engine interfaces")
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("System"))
->Attribute(AZ::Edit::Attributes::AutoExpand, true)
;
}
}
Audio::Wwise::ConfigurationSettings::Reflect(context);
}
void AudioEngineWwiseGemSystemComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
{
provided.push_back(AZ_CRC("AudioEngineService"));
}
void AudioEngineWwiseGemSystemComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
{
incompatible.push_back(AZ_CRC("AudioEngineService"));
}
void AudioEngineWwiseGemSystemComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required)
{
required.push_back(AZ_CRC("AudioSystemService"));
}
void AudioEngineWwiseGemSystemComponent::GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent)
{
dependent.push_back(AZ_CRC("AudioSystemService"));
}
void AudioEngineWwiseGemSystemComponent::Init()
{
}
void AudioEngineWwiseGemSystemComponent::Activate()
{
Audio::Gem::AudioEngineGemRequestBus::Handler::BusConnect();
#if defined(AUDIO_ENGINE_WWISE_EDITOR)
AudioControlsEditor::EditorImplPluginEventBus::Handler::BusConnect();
#endif // AUDIO_ENGINE_WWISE_EDITOR
}
void AudioEngineWwiseGemSystemComponent::Deactivate()
{
Audio::Gem::AudioEngineGemRequestBus::Handler::BusDisconnect();
#if defined(AUDIO_ENGINE_WWISE_EDITOR)
AudioControlsEditor::EditorImplPluginEventBus::Handler::BusDisconnect();
#endif // AUDIO_ENGINE_WWISE_EDITOR
}
bool AudioEngineWwiseGemSystemComponent::Initialize()
{
bool success = false;
// Check memory-related Wwise Cvars...
const AZ::u64 memorySubpartitionSizes = Audio::Wwise::Cvars::s_StreamDeviceMemorySize
#if !defined(WWISE_RELEASE)
+ Audio::Wwise::Cvars::s_MonitorQueueMemorySize
#endif // !WWISE_RELEASE
+ Audio::Wwise::Cvars::s_CommandQueueMemorySize;
AZ_Assert(Audio::Wwise::Cvars::s_PrimaryMemorySize > memorySubpartitionSizes,
"Wwise memory sizes of sub-categories add up to more than the primary memory pool size!")
// Initialize memory block for Wwise to use...
if (!AZ::AllocatorInstance<Audio::AudioImplAllocator>::IsReady())
{
const size_t poolSize = Audio::Wwise::Cvars::s_PrimaryMemorySize << 10;
Audio::AudioImplAllocator::Descriptor allocDesc;
// Generic Allocator:
allocDesc.m_allocationRecords = true;
allocDesc.m_heap.m_numFixedMemoryBlocks = 1;
allocDesc.m_heap.m_fixedMemoryBlocksByteSize[0] = poolSize;
allocDesc.m_heap.m_fixedMemoryBlocks[0] = AZ::AllocatorInstance<AZ::OSAllocator>::Get().Allocate(
allocDesc.m_heap.m_fixedMemoryBlocksByteSize[0], allocDesc.m_heap.m_memoryBlockAlignment);
AZ::AllocatorInstance<Audio::AudioImplAllocator>::Create(allocDesc);
}
AZ::SettingsRegistryInterface::FixedValueString assetPlatform = AzFramework::OSPlatformToDefaultAssetPlatform(
AZ_TRAIT_OS_PLATFORM_CODENAME);
if (auto settingsRegistry = AZ::SettingsRegistry::Get(); settingsRegistry != nullptr)
{
AZ::SettingsRegistryMergeUtils::PlatformGet(*settingsRegistry, assetPlatform,
AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey, "assets");
}
m_engineWwise = AZStd::make_unique<Audio::CAudioSystemImpl_wwise>(assetPlatform.c_str());
if (m_engineWwise)
{
Audio::g_audioImplLogger_wwise.Log(Audio::eALT_ALWAYS, "AudioEngineWwise created!");
Audio::SAudioRequest oAudioRequestData;
oAudioRequestData.nFlags = (Audio::eARF_PRIORITY_HIGH | Audio::eARF_EXECUTE_BLOCKING);
Audio::SAudioManagerRequestData<Audio::eAMRT_INIT_AUDIO_IMPL> oAMData;
oAudioRequestData.pData = &oAMData;
Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequestBlocking, oAudioRequestData);
success = true;
}
else
{
Audio::g_audioImplLogger_wwise.Log(Audio::eALT_ALWAYS, "Could not create AudioEngineWwise!");
}
return success;
}
void AudioEngineWwiseGemSystemComponent::Release()
{
m_engineWwise.reset();
if (AZ::AllocatorInstance<Audio::AudioImplAllocator>::IsReady())
{
AZ::AllocatorInstance<Audio::AudioImplAllocator>::Destroy();
}
}
#if defined(AUDIO_ENGINE_WWISE_EDITOR)
void AudioEngineWwiseGemSystemComponent::InitializeEditorImplPlugin()
{
m_editorImplPlugin.reset(new AudioControls::CAudioSystemEditor_wwise());
}
void AudioEngineWwiseGemSystemComponent::ReleaseEditorImplPlugin()
{
m_editorImplPlugin.reset();
}
AudioControls::IAudioSystemEditor* AudioEngineWwiseGemSystemComponent::GetEditorImplPlugin()
{
return m_editorImplPlugin.get();
}
#endif // AUDIO_ENGINE_WWISE_EDITOR
} // namespace AudioEngineWwiseGem