123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536 |
- /*******************************************************************************
- The content of this file includes portions of the proprietary AUDIOKINETIC Wwise
- Technology released in source code form as part of the game integration package.
- The content of this file may not be used without valid licenses to the
- AUDIOKINETIC Wwise Technology.
- Note that the use of the game engine is subject to the Unreal(R) Engine End User
- License Agreement at https://www.unrealengine.com/en-US/eula/unreal
-
- License Usage
-
- Licensees holding valid licenses to the AUDIOKINETIC Wwise Technology may use
- this file in accordance with the end user license agreement provided with the
- software or, alternatively, in accordance with the terms contained
- in a written agreement between you and Audiokinetic Inc.
- Copyright (c) 2023 Audiokinetic Inc.
- *******************************************************************************/
- #include "Wwise/WwiseProjectDatabase.h"
- #include "WwiseUnrealHelper.h"
- #include "Wwise/WwiseResourceLoader.h"
- #include "Wwise/WwiseProjectDatabaseDelegates.h"
- #include "Async/Async.h"
- #include "Misc/ScopedSlowTask.h"
- #include "Wwise/Metadata/WwiseMetadataPlatformInfo.h"
- #include "Wwise/Stats/Global.h"
- #define LOCTEXT_NAMESPACE "WwiseProjectDatabase"
- FWwiseDataStructureScopeLock::FWwiseDataStructureScopeLock(const FWwiseProjectDatabase& InProjectDatabase) :
- FRWScopeLock(const_cast<FRWLock&>(InProjectDatabase.GetLockedDataStructure()->Lock), SLT_ReadOnly),
- DataStructure(*InProjectDatabase.GetLockedDataStructure()),
- CurrentLanguage(InProjectDatabase.GetCurrentLanguage()),
- CurrentPlatform(InProjectDatabase.GetCurrentPlatform()),
- bDisableDefaultPlatforms(InProjectDatabase.DisableDefaultPlatforms())
- {
- }
- const WwiseAcousticTextureGlobalIdsMap& FWwiseDataStructureScopeLock::GetAcousticTextures() const
- {
- static const auto Empty = WwiseAcousticTextureGlobalIdsMap();
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return Empty;
- return PlatformData->AcousticTextures;
- }
- FWwiseRefAcousticTexture FWwiseDataStructureScopeLock::GetAcousticTexture(const FWwiseObjectInfo& InInfo) const
- {
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return {};
- FWwiseRefAcousticTexture Result;
- PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
- return Result;
- }
- const WwiseAudioDeviceGlobalIdsMap& FWwiseDataStructureScopeLock::GetAudioDevices() const
- {
- static const auto Empty = WwiseAudioDeviceGlobalIdsMap();
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return Empty;
- return PlatformData->AudioDevices;
- }
- FWwiseRefAudioDevice FWwiseDataStructureScopeLock::GetAudioDevice(const FWwiseObjectInfo& InInfo) const
- {
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return {};
- FWwiseRefAudioDevice Result;
- PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
- return Result;
- }
- const WwiseAuxBusGlobalIdsMap& FWwiseDataStructureScopeLock::GetAuxBusses() const
- {
- static const auto Empty = WwiseAuxBusGlobalIdsMap();
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return Empty;
- return PlatformData->AuxBusses;
- }
- FWwiseRefAuxBus FWwiseDataStructureScopeLock::GetAuxBus(const FWwiseObjectInfo& InInfo) const
- {
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return {};
- FWwiseRefAuxBus Result;
- PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
- return Result;
- }
- const WwiseBusGlobalIdsMap& FWwiseDataStructureScopeLock::GetBusses() const
- {
- static const auto Empty = WwiseBusGlobalIdsMap();
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return Empty;
- return PlatformData->Busses;
- }
- FWwiseRefBus FWwiseDataStructureScopeLock::GetBus(const FWwiseObjectInfo& InInfo) const
- {
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return {};
- FWwiseRefBus Result;
- PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
- return Result;
- }
- const WwiseCustomPluginGlobalIdsMap& FWwiseDataStructureScopeLock::GetCustomPlugins() const
- {
- static const auto Empty = WwiseCustomPluginGlobalIdsMap();
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return Empty;
- return PlatformData->CustomPlugins;
- }
- FWwiseRefCustomPlugin FWwiseDataStructureScopeLock::GetCustomPlugin(const FWwiseObjectInfo& InInfo) const
- {
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return {};
- FWwiseRefCustomPlugin Result;
- PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
- return Result;
- }
- const WwiseDialogueArgumentGlobalIdsMap& FWwiseDataStructureScopeLock::GetDialogueArguments() const
- {
- static const auto Empty = WwiseDialogueArgumentGlobalIdsMap();
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return Empty;
- return PlatformData->DialogueArguments;
- }
- FWwiseRefDialogueArgument FWwiseDataStructureScopeLock::GetDialogueArgument(const FWwiseObjectInfo& InInfo) const
- {
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return {};
- FWwiseRefDialogueArgument Result;
- PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
- return Result;
- }
- const WwiseDialogueEventGlobalIdsMap& FWwiseDataStructureScopeLock::GetDialogueEvents() const
- {
- static const auto Empty = WwiseDialogueEventGlobalIdsMap();
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return Empty;
- return PlatformData->DialogueEvents;
- }
- FWwiseRefDialogueEvent FWwiseDataStructureScopeLock::GetDialogueEvent(const FWwiseObjectInfo& InInfo) const
- {
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return {};
- FWwiseRefDialogueEvent Result;
- PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
- return Result;
- }
- const WwiseEventGlobalIdsMap& FWwiseDataStructureScopeLock::GetEvents() const
- {
- static const auto Empty = WwiseEventGlobalIdsMap();
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return Empty;
- return PlatformData->Events;
- }
- TSet<FWwiseRefEvent> FWwiseDataStructureScopeLock::GetEvent(const FWwiseEventInfo& InInfo) const
- {
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return {};
- TSet<FWwiseRefEvent> Result;
- PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
- return Result;
- }
- const WwiseExternalSourceGlobalIdsMap& FWwiseDataStructureScopeLock::GetExternalSources() const
- {
- static const auto Empty = WwiseExternalSourceGlobalIdsMap();
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return Empty;
- return PlatformData->ExternalSources;
- }
- FWwiseRefExternalSource FWwiseDataStructureScopeLock::GetExternalSource(const FWwiseObjectInfo& InInfo) const
- {
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return {};
- FWwiseRefExternalSource Result;
- PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
- return Result;
- }
- const WwiseGameParameterGlobalIdsMap& FWwiseDataStructureScopeLock::GetGameParameters() const
- {
- static const auto Empty = WwiseGameParameterGlobalIdsMap();
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return Empty;
- return PlatformData->GameParameters;
- }
- FWwiseRefGameParameter FWwiseDataStructureScopeLock::GetGameParameter(const FWwiseObjectInfo& InInfo) const
- {
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return {};
- FWwiseRefGameParameter Result;
- PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
- return Result;
- }
- const WwiseMediaGlobalIdsMap& FWwiseDataStructureScopeLock::GetMediaFiles() const
- {
- static const auto Empty = WwiseMediaGlobalIdsMap();
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return Empty;
- return PlatformData->MediaFiles;
- }
- FWwiseRefMedia FWwiseDataStructureScopeLock::GetMediaFile(const FWwiseObjectInfo& InInfo) const
- {
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return {};
- FWwiseRefMedia Result;
- PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
- return Result;
- }
- const WwisePluginLibGlobalIdsMap& FWwiseDataStructureScopeLock::GetPluginLibs() const
- {
- static const auto Empty = WwisePluginLibGlobalIdsMap();
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return Empty;
- return PlatformData->PluginLibs;
- }
- FWwiseRefPluginLib FWwiseDataStructureScopeLock::GetPluginLib(const FWwiseObjectInfo& InInfo) const
- {
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return {};
- FWwiseRefPluginLib Result;
- PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
- return Result;
- }
- const WwisePluginShareSetGlobalIdsMap& FWwiseDataStructureScopeLock::GetPluginShareSets() const
- {
- static const auto Empty = WwisePluginShareSetGlobalIdsMap();
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return Empty;
- return PlatformData->PluginShareSets;
- }
- FWwiseRefPluginShareSet FWwiseDataStructureScopeLock::GetPluginShareSet(const FWwiseObjectInfo& InInfo) const
- {
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return {};
- FWwiseRefPluginShareSet Result;
- PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
- return Result;
- }
- const WwiseSoundBankGlobalIdsMap& FWwiseDataStructureScopeLock::GetSoundBanks() const
- {
- static const auto Empty = WwiseSoundBankGlobalIdsMap();
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return Empty;
- return PlatformData->SoundBanks;
- }
- FWwiseRefSoundBank FWwiseDataStructureScopeLock::GetSoundBank(const FWwiseObjectInfo& InInfo) const
- {
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return {};
- FWwiseRefSoundBank Result;
- PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
- return Result;
- }
- const WwiseStateGlobalIdsMap& FWwiseDataStructureScopeLock::GetStates() const
- {
- static const auto Empty = WwiseStateGlobalIdsMap();
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return Empty;
- return PlatformData->States;
- }
- FWwiseRefState FWwiseDataStructureScopeLock::GetState(const FWwiseGroupValueInfo& InInfo) const
- {
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return {};
- FWwiseRefState Result;
- PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
- return Result;
- }
- const WwiseStateGroupGlobalIdsMap& FWwiseDataStructureScopeLock::GetStateGroups() const
- {
- static const auto Empty = WwiseStateGroupGlobalIdsMap();
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return Empty;
- return PlatformData->StateGroups;
- }
- FWwiseRefStateGroup FWwiseDataStructureScopeLock::GetStateGroup(const FWwiseObjectInfo& InInfo) const
- {
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return {};
- FWwiseRefStateGroup Result;
- PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
- return Result;
- }
- const WwiseSwitchGlobalIdsMap& FWwiseDataStructureScopeLock::GetSwitches() const
- {
- static const auto Empty = WwiseSwitchGlobalIdsMap();
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return Empty;
- return PlatformData->Switches;
- }
- FWwiseRefSwitch FWwiseDataStructureScopeLock::GetSwitch(const FWwiseGroupValueInfo& InInfo) const
- {
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return {};
- FWwiseRefSwitch Result;
- PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
- return Result;
- }
- const WwiseSwitchGroupGlobalIdsMap& FWwiseDataStructureScopeLock::GetSwitchGroups() const
- {
- static const auto Empty = WwiseSwitchGroupGlobalIdsMap();
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return Empty;
- return PlatformData->SwitchGroups;
- }
- FWwiseRefSwitchGroup FWwiseDataStructureScopeLock::GetSwitchGroup(const FWwiseObjectInfo& InInfo) const
- {
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return {};
- FWwiseRefSwitchGroup Result;
- PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
- return Result;
- }
- const WwiseTriggerGlobalIdsMap& FWwiseDataStructureScopeLock::GetTriggers() const
- {
- static const auto Empty = WwiseTriggerGlobalIdsMap();
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return Empty;
- return PlatformData->Triggers;
- }
- FWwiseRefTrigger FWwiseDataStructureScopeLock::GetTrigger(const FWwiseObjectInfo& InInfo) const
- {
- const auto* PlatformData = GetCurrentPlatformData();
- if (UNLIKELY(!PlatformData)) return {};
- FWwiseRefTrigger Result;
- PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
- return Result;
- }
- const FWwisePlatformDataStructure* FWwiseDataStructureScopeLock::GetCurrentPlatformData() const
- {
- if (DisableDefaultPlatforms())
- {
- UE_LOG(LogWwiseProjectDatabase, VeryVerbose,
- TEXT("Trying to access current platform data when none is loaded by design (cooking)"));
- return nullptr;
- }
- const auto& Platform = GetCurrentPlatform();
- const auto* PlatformData = DataStructure.Platforms.Find(Platform);
- if (UNLIKELY(!PlatformData))
- {
- if(Platform.GetPlatformName().ToString() != TEXT("None"))
- {
- UE_LOG(LogWwiseProjectDatabase, Error,
- TEXT(
- "Current platform %s not found."
- ),
- *Platform.GetPlatformName().ToString());
- }
- else
- {
- UE_LOG(LogWwiseProjectDatabase, Error,
- TEXT(
- "No JSON Metadata file found. Have SoundBanks been generated?"
- ));
- }
- if (!UE_LOG_ACTIVE(LogWwiseProjectDatabase, Verbose) || !UE_LOG_ACTIVE(LogWwiseProjectDatabase, VeryVerbose))
- {
- UE_LOG(LogWwiseHints, Warning,
- TEXT("Enable Verbose or VeryVerbose logs for LogWwiseProjectDatabase for more details on why %s is missing from your current platforms."),
- *Platform.GetPlatformName().ToString());
- }
- if (DataStructure.RootData.JsonFiles.Num() == 0 && Platform.GetPlatformName().ToString() != TEXT("None"))
- {
- FString SoundBankPath = WwiseUnrealHelper::GetSoundBankDirectory() / Platform.Platform->PathRelativeToGeneratedSoundBanks.ToString();
- UE_LOG(LogWwiseProjectDatabase, Error,
- TEXT("No JSON Metadata file found for platform %s at %s. Have SoundBanks been generated?"),
- *SoundBankPath,
- *Platform.GetPlatformName().ToString());
- }
- return nullptr;
- }
- return PlatformData;
- }
- const TSet<FWwiseSharedLanguageId>& FWwiseDataStructureScopeLock::GetLanguages() const
- {
- return DataStructure.RootData.Languages;
- }
- const TSet<FWwiseSharedPlatformId>& FWwiseDataStructureScopeLock::GetPlatforms() const
- {
- return DataStructure.RootData.Platforms;
- }
- FWwiseRefPlatform FWwiseDataStructureScopeLock::GetPlatform(const FWwiseSharedPlatformId& InPlatformId) const
- {
- if (const auto* Platform = DataStructure.RootData.PlatformGuids.Find(InPlatformId.GetPlatformGuid()))
- {
- return *Platform;
- }
- return {};
- }
- FWwiseDataStructureWriteScopeLock::FWwiseDataStructureWriteScopeLock(FWwiseProjectDatabase& InProjectDatabase) :
- FRWScopeLock(InProjectDatabase.GetLockedDataStructure()->Lock, SLT_Write),
- DataStructure(*InProjectDatabase.GetLockedDataStructure())
- {
- }
- #if PLATFORM_LINUX
- const FGuid FWwiseProjectDatabase::BasePlatformGuid(0xbd0bdf13, 0x3125454f, 0x8bfd3195, 0x37169f81);
- #elif PLATFORM_MAC
- const FGuid FWwiseProjectDatabase::BasePlatformGuid(0x9c6217d5, 0xdd114795, 0x87c16ce0, 0x2853c540);
- #elif PLATFORM_WINDOWS
- const FGuid FWwiseProjectDatabase::BasePlatformGuid(0x6e0cb257, 0xc6c84c5c, 0x83662740, 0xdfc441eb);
- #else
- static_assert(false);
- #endif
- FWwiseSharedLanguageId FWwiseProjectDatabase::GetCurrentLanguage() const
- {
- auto* ResourceLoader = GetResourceLoader();
- if (UNLIKELY(!ResourceLoader))
- {
- return {};
- }
- const auto CurrentLanguage = ResourceLoader->GetCurrentLanguage();
- return FWwiseSharedLanguageId(CurrentLanguage.GetLanguageId(), CurrentLanguage.GetLanguageName(), CurrentLanguage.LanguageRequirement);
- }
- FWwiseSharedPlatformId FWwiseProjectDatabase::GetCurrentPlatform() const
- {
- auto* ResourceLoader = GetResourceLoader();
- if (UNLIKELY(!ResourceLoader))
- {
- return {};
- }
- return ResourceLoader->GetCurrentPlatform();
- }
- bool FWwiseProjectDatabase::DisableDefaultPlatforms() const
- {
- return UNLIKELY(!IWwiseProjectDatabaseModule::ShouldInitializeProjectDatabase()) && (Get() == this);
- }
- #undef LOCTEXT_NAMESPACE
|