WwiseProjectDatabase.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536
  1. /*******************************************************************************
  2. The content of this file includes portions of the proprietary AUDIOKINETIC Wwise
  3. Technology released in source code form as part of the game integration package.
  4. The content of this file may not be used without valid licenses to the
  5. AUDIOKINETIC Wwise Technology.
  6. Note that the use of the game engine is subject to the Unreal(R) Engine End User
  7. License Agreement at https://www.unrealengine.com/en-US/eula/unreal
  8. License Usage
  9. Licensees holding valid licenses to the AUDIOKINETIC Wwise Technology may use
  10. this file in accordance with the end user license agreement provided with the
  11. software or, alternatively, in accordance with the terms contained
  12. in a written agreement between you and Audiokinetic Inc.
  13. Copyright (c) 2023 Audiokinetic Inc.
  14. *******************************************************************************/
  15. #include "Wwise/WwiseProjectDatabase.h"
  16. #include "WwiseUnrealHelper.h"
  17. #include "Wwise/WwiseResourceLoader.h"
  18. #include "Wwise/WwiseProjectDatabaseDelegates.h"
  19. #include "Async/Async.h"
  20. #include "Misc/ScopedSlowTask.h"
  21. #include "Wwise/Metadata/WwiseMetadataPlatformInfo.h"
  22. #include "Wwise/Stats/Global.h"
  23. #define LOCTEXT_NAMESPACE "WwiseProjectDatabase"
  24. FWwiseDataStructureScopeLock::FWwiseDataStructureScopeLock(const FWwiseProjectDatabase& InProjectDatabase) :
  25. FRWScopeLock(const_cast<FRWLock&>(InProjectDatabase.GetLockedDataStructure()->Lock), SLT_ReadOnly),
  26. DataStructure(*InProjectDatabase.GetLockedDataStructure()),
  27. CurrentLanguage(InProjectDatabase.GetCurrentLanguage()),
  28. CurrentPlatform(InProjectDatabase.GetCurrentPlatform()),
  29. bDisableDefaultPlatforms(InProjectDatabase.DisableDefaultPlatforms())
  30. {
  31. }
  32. const WwiseAcousticTextureGlobalIdsMap& FWwiseDataStructureScopeLock::GetAcousticTextures() const
  33. {
  34. static const auto Empty = WwiseAcousticTextureGlobalIdsMap();
  35. const auto* PlatformData = GetCurrentPlatformData();
  36. if (UNLIKELY(!PlatformData)) return Empty;
  37. return PlatformData->AcousticTextures;
  38. }
  39. FWwiseRefAcousticTexture FWwiseDataStructureScopeLock::GetAcousticTexture(const FWwiseObjectInfo& InInfo) const
  40. {
  41. const auto* PlatformData = GetCurrentPlatformData();
  42. if (UNLIKELY(!PlatformData)) return {};
  43. FWwiseRefAcousticTexture Result;
  44. PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
  45. return Result;
  46. }
  47. const WwiseAudioDeviceGlobalIdsMap& FWwiseDataStructureScopeLock::GetAudioDevices() const
  48. {
  49. static const auto Empty = WwiseAudioDeviceGlobalIdsMap();
  50. const auto* PlatformData = GetCurrentPlatformData();
  51. if (UNLIKELY(!PlatformData)) return Empty;
  52. return PlatformData->AudioDevices;
  53. }
  54. FWwiseRefAudioDevice FWwiseDataStructureScopeLock::GetAudioDevice(const FWwiseObjectInfo& InInfo) const
  55. {
  56. const auto* PlatformData = GetCurrentPlatformData();
  57. if (UNLIKELY(!PlatformData)) return {};
  58. FWwiseRefAudioDevice Result;
  59. PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
  60. return Result;
  61. }
  62. const WwiseAuxBusGlobalIdsMap& FWwiseDataStructureScopeLock::GetAuxBusses() const
  63. {
  64. static const auto Empty = WwiseAuxBusGlobalIdsMap();
  65. const auto* PlatformData = GetCurrentPlatformData();
  66. if (UNLIKELY(!PlatformData)) return Empty;
  67. return PlatformData->AuxBusses;
  68. }
  69. FWwiseRefAuxBus FWwiseDataStructureScopeLock::GetAuxBus(const FWwiseObjectInfo& InInfo) const
  70. {
  71. const auto* PlatformData = GetCurrentPlatformData();
  72. if (UNLIKELY(!PlatformData)) return {};
  73. FWwiseRefAuxBus Result;
  74. PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
  75. return Result;
  76. }
  77. const WwiseBusGlobalIdsMap& FWwiseDataStructureScopeLock::GetBusses() const
  78. {
  79. static const auto Empty = WwiseBusGlobalIdsMap();
  80. const auto* PlatformData = GetCurrentPlatformData();
  81. if (UNLIKELY(!PlatformData)) return Empty;
  82. return PlatformData->Busses;
  83. }
  84. FWwiseRefBus FWwiseDataStructureScopeLock::GetBus(const FWwiseObjectInfo& InInfo) const
  85. {
  86. const auto* PlatformData = GetCurrentPlatformData();
  87. if (UNLIKELY(!PlatformData)) return {};
  88. FWwiseRefBus Result;
  89. PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
  90. return Result;
  91. }
  92. const WwiseCustomPluginGlobalIdsMap& FWwiseDataStructureScopeLock::GetCustomPlugins() const
  93. {
  94. static const auto Empty = WwiseCustomPluginGlobalIdsMap();
  95. const auto* PlatformData = GetCurrentPlatformData();
  96. if (UNLIKELY(!PlatformData)) return Empty;
  97. return PlatformData->CustomPlugins;
  98. }
  99. FWwiseRefCustomPlugin FWwiseDataStructureScopeLock::GetCustomPlugin(const FWwiseObjectInfo& InInfo) const
  100. {
  101. const auto* PlatformData = GetCurrentPlatformData();
  102. if (UNLIKELY(!PlatformData)) return {};
  103. FWwiseRefCustomPlugin Result;
  104. PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
  105. return Result;
  106. }
  107. const WwiseDialogueArgumentGlobalIdsMap& FWwiseDataStructureScopeLock::GetDialogueArguments() const
  108. {
  109. static const auto Empty = WwiseDialogueArgumentGlobalIdsMap();
  110. const auto* PlatformData = GetCurrentPlatformData();
  111. if (UNLIKELY(!PlatformData)) return Empty;
  112. return PlatformData->DialogueArguments;
  113. }
  114. FWwiseRefDialogueArgument FWwiseDataStructureScopeLock::GetDialogueArgument(const FWwiseObjectInfo& InInfo) const
  115. {
  116. const auto* PlatformData = GetCurrentPlatformData();
  117. if (UNLIKELY(!PlatformData)) return {};
  118. FWwiseRefDialogueArgument Result;
  119. PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
  120. return Result;
  121. }
  122. const WwiseDialogueEventGlobalIdsMap& FWwiseDataStructureScopeLock::GetDialogueEvents() const
  123. {
  124. static const auto Empty = WwiseDialogueEventGlobalIdsMap();
  125. const auto* PlatformData = GetCurrentPlatformData();
  126. if (UNLIKELY(!PlatformData)) return Empty;
  127. return PlatformData->DialogueEvents;
  128. }
  129. FWwiseRefDialogueEvent FWwiseDataStructureScopeLock::GetDialogueEvent(const FWwiseObjectInfo& InInfo) const
  130. {
  131. const auto* PlatformData = GetCurrentPlatformData();
  132. if (UNLIKELY(!PlatformData)) return {};
  133. FWwiseRefDialogueEvent Result;
  134. PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
  135. return Result;
  136. }
  137. const WwiseEventGlobalIdsMap& FWwiseDataStructureScopeLock::GetEvents() const
  138. {
  139. static const auto Empty = WwiseEventGlobalIdsMap();
  140. const auto* PlatformData = GetCurrentPlatformData();
  141. if (UNLIKELY(!PlatformData)) return Empty;
  142. return PlatformData->Events;
  143. }
  144. TSet<FWwiseRefEvent> FWwiseDataStructureScopeLock::GetEvent(const FWwiseEventInfo& InInfo) const
  145. {
  146. const auto* PlatformData = GetCurrentPlatformData();
  147. if (UNLIKELY(!PlatformData)) return {};
  148. TSet<FWwiseRefEvent> Result;
  149. PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
  150. return Result;
  151. }
  152. const WwiseExternalSourceGlobalIdsMap& FWwiseDataStructureScopeLock::GetExternalSources() const
  153. {
  154. static const auto Empty = WwiseExternalSourceGlobalIdsMap();
  155. const auto* PlatformData = GetCurrentPlatformData();
  156. if (UNLIKELY(!PlatformData)) return Empty;
  157. return PlatformData->ExternalSources;
  158. }
  159. FWwiseRefExternalSource FWwiseDataStructureScopeLock::GetExternalSource(const FWwiseObjectInfo& InInfo) const
  160. {
  161. const auto* PlatformData = GetCurrentPlatformData();
  162. if (UNLIKELY(!PlatformData)) return {};
  163. FWwiseRefExternalSource Result;
  164. PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
  165. return Result;
  166. }
  167. const WwiseGameParameterGlobalIdsMap& FWwiseDataStructureScopeLock::GetGameParameters() const
  168. {
  169. static const auto Empty = WwiseGameParameterGlobalIdsMap();
  170. const auto* PlatformData = GetCurrentPlatformData();
  171. if (UNLIKELY(!PlatformData)) return Empty;
  172. return PlatformData->GameParameters;
  173. }
  174. FWwiseRefGameParameter FWwiseDataStructureScopeLock::GetGameParameter(const FWwiseObjectInfo& InInfo) const
  175. {
  176. const auto* PlatformData = GetCurrentPlatformData();
  177. if (UNLIKELY(!PlatformData)) return {};
  178. FWwiseRefGameParameter Result;
  179. PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
  180. return Result;
  181. }
  182. const WwiseMediaGlobalIdsMap& FWwiseDataStructureScopeLock::GetMediaFiles() const
  183. {
  184. static const auto Empty = WwiseMediaGlobalIdsMap();
  185. const auto* PlatformData = GetCurrentPlatformData();
  186. if (UNLIKELY(!PlatformData)) return Empty;
  187. return PlatformData->MediaFiles;
  188. }
  189. FWwiseRefMedia FWwiseDataStructureScopeLock::GetMediaFile(const FWwiseObjectInfo& InInfo) const
  190. {
  191. const auto* PlatformData = GetCurrentPlatformData();
  192. if (UNLIKELY(!PlatformData)) return {};
  193. FWwiseRefMedia Result;
  194. PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
  195. return Result;
  196. }
  197. const WwisePluginLibGlobalIdsMap& FWwiseDataStructureScopeLock::GetPluginLibs() const
  198. {
  199. static const auto Empty = WwisePluginLibGlobalIdsMap();
  200. const auto* PlatformData = GetCurrentPlatformData();
  201. if (UNLIKELY(!PlatformData)) return Empty;
  202. return PlatformData->PluginLibs;
  203. }
  204. FWwiseRefPluginLib FWwiseDataStructureScopeLock::GetPluginLib(const FWwiseObjectInfo& InInfo) const
  205. {
  206. const auto* PlatformData = GetCurrentPlatformData();
  207. if (UNLIKELY(!PlatformData)) return {};
  208. FWwiseRefPluginLib Result;
  209. PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
  210. return Result;
  211. }
  212. const WwisePluginShareSetGlobalIdsMap& FWwiseDataStructureScopeLock::GetPluginShareSets() const
  213. {
  214. static const auto Empty = WwisePluginShareSetGlobalIdsMap();
  215. const auto* PlatformData = GetCurrentPlatformData();
  216. if (UNLIKELY(!PlatformData)) return Empty;
  217. return PlatformData->PluginShareSets;
  218. }
  219. FWwiseRefPluginShareSet FWwiseDataStructureScopeLock::GetPluginShareSet(const FWwiseObjectInfo& InInfo) const
  220. {
  221. const auto* PlatformData = GetCurrentPlatformData();
  222. if (UNLIKELY(!PlatformData)) return {};
  223. FWwiseRefPluginShareSet Result;
  224. PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
  225. return Result;
  226. }
  227. const WwiseSoundBankGlobalIdsMap& FWwiseDataStructureScopeLock::GetSoundBanks() const
  228. {
  229. static const auto Empty = WwiseSoundBankGlobalIdsMap();
  230. const auto* PlatformData = GetCurrentPlatformData();
  231. if (UNLIKELY(!PlatformData)) return Empty;
  232. return PlatformData->SoundBanks;
  233. }
  234. FWwiseRefSoundBank FWwiseDataStructureScopeLock::GetSoundBank(const FWwiseObjectInfo& InInfo) const
  235. {
  236. const auto* PlatformData = GetCurrentPlatformData();
  237. if (UNLIKELY(!PlatformData)) return {};
  238. FWwiseRefSoundBank Result;
  239. PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
  240. return Result;
  241. }
  242. const WwiseStateGlobalIdsMap& FWwiseDataStructureScopeLock::GetStates() const
  243. {
  244. static const auto Empty = WwiseStateGlobalIdsMap();
  245. const auto* PlatformData = GetCurrentPlatformData();
  246. if (UNLIKELY(!PlatformData)) return Empty;
  247. return PlatformData->States;
  248. }
  249. FWwiseRefState FWwiseDataStructureScopeLock::GetState(const FWwiseGroupValueInfo& InInfo) const
  250. {
  251. const auto* PlatformData = GetCurrentPlatformData();
  252. if (UNLIKELY(!PlatformData)) return {};
  253. FWwiseRefState Result;
  254. PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
  255. return Result;
  256. }
  257. const WwiseStateGroupGlobalIdsMap& FWwiseDataStructureScopeLock::GetStateGroups() const
  258. {
  259. static const auto Empty = WwiseStateGroupGlobalIdsMap();
  260. const auto* PlatformData = GetCurrentPlatformData();
  261. if (UNLIKELY(!PlatformData)) return Empty;
  262. return PlatformData->StateGroups;
  263. }
  264. FWwiseRefStateGroup FWwiseDataStructureScopeLock::GetStateGroup(const FWwiseObjectInfo& InInfo) const
  265. {
  266. const auto* PlatformData = GetCurrentPlatformData();
  267. if (UNLIKELY(!PlatformData)) return {};
  268. FWwiseRefStateGroup Result;
  269. PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
  270. return Result;
  271. }
  272. const WwiseSwitchGlobalIdsMap& FWwiseDataStructureScopeLock::GetSwitches() const
  273. {
  274. static const auto Empty = WwiseSwitchGlobalIdsMap();
  275. const auto* PlatformData = GetCurrentPlatformData();
  276. if (UNLIKELY(!PlatformData)) return Empty;
  277. return PlatformData->Switches;
  278. }
  279. FWwiseRefSwitch FWwiseDataStructureScopeLock::GetSwitch(const FWwiseGroupValueInfo& InInfo) const
  280. {
  281. const auto* PlatformData = GetCurrentPlatformData();
  282. if (UNLIKELY(!PlatformData)) return {};
  283. FWwiseRefSwitch Result;
  284. PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
  285. return Result;
  286. }
  287. const WwiseSwitchGroupGlobalIdsMap& FWwiseDataStructureScopeLock::GetSwitchGroups() const
  288. {
  289. static const auto Empty = WwiseSwitchGroupGlobalIdsMap();
  290. const auto* PlatformData = GetCurrentPlatformData();
  291. if (UNLIKELY(!PlatformData)) return Empty;
  292. return PlatformData->SwitchGroups;
  293. }
  294. FWwiseRefSwitchGroup FWwiseDataStructureScopeLock::GetSwitchGroup(const FWwiseObjectInfo& InInfo) const
  295. {
  296. const auto* PlatformData = GetCurrentPlatformData();
  297. if (UNLIKELY(!PlatformData)) return {};
  298. FWwiseRefSwitchGroup Result;
  299. PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
  300. return Result;
  301. }
  302. const WwiseTriggerGlobalIdsMap& FWwiseDataStructureScopeLock::GetTriggers() const
  303. {
  304. static const auto Empty = WwiseTriggerGlobalIdsMap();
  305. const auto* PlatformData = GetCurrentPlatformData();
  306. if (UNLIKELY(!PlatformData)) return Empty;
  307. return PlatformData->Triggers;
  308. }
  309. FWwiseRefTrigger FWwiseDataStructureScopeLock::GetTrigger(const FWwiseObjectInfo& InInfo) const
  310. {
  311. const auto* PlatformData = GetCurrentPlatformData();
  312. if (UNLIKELY(!PlatformData)) return {};
  313. FWwiseRefTrigger Result;
  314. PlatformData->GetRef(Result, GetCurrentLanguage(), InInfo);
  315. return Result;
  316. }
  317. const FWwisePlatformDataStructure* FWwiseDataStructureScopeLock::GetCurrentPlatformData() const
  318. {
  319. if (DisableDefaultPlatforms())
  320. {
  321. UE_LOG(LogWwiseProjectDatabase, VeryVerbose,
  322. TEXT("Trying to access current platform data when none is loaded by design (cooking)"));
  323. return nullptr;
  324. }
  325. const auto& Platform = GetCurrentPlatform();
  326. const auto* PlatformData = DataStructure.Platforms.Find(Platform);
  327. if (UNLIKELY(!PlatformData))
  328. {
  329. if(Platform.GetPlatformName().ToString() != TEXT("None"))
  330. {
  331. UE_LOG(LogWwiseProjectDatabase, Error,
  332. TEXT(
  333. "Current platform %s not found."
  334. ),
  335. *Platform.GetPlatformName().ToString());
  336. }
  337. else
  338. {
  339. UE_LOG(LogWwiseProjectDatabase, Error,
  340. TEXT(
  341. "No JSON Metadata file found. Have SoundBanks been generated?"
  342. ));
  343. }
  344. if (!UE_LOG_ACTIVE(LogWwiseProjectDatabase, Verbose) || !UE_LOG_ACTIVE(LogWwiseProjectDatabase, VeryVerbose))
  345. {
  346. UE_LOG(LogWwiseHints, Warning,
  347. TEXT("Enable Verbose or VeryVerbose logs for LogWwiseProjectDatabase for more details on why %s is missing from your current platforms."),
  348. *Platform.GetPlatformName().ToString());
  349. }
  350. if (DataStructure.RootData.JsonFiles.Num() == 0 && Platform.GetPlatformName().ToString() != TEXT("None"))
  351. {
  352. FString SoundBankPath = WwiseUnrealHelper::GetSoundBankDirectory() / Platform.Platform->PathRelativeToGeneratedSoundBanks.ToString();
  353. UE_LOG(LogWwiseProjectDatabase, Error,
  354. TEXT("No JSON Metadata file found for platform %s at %s. Have SoundBanks been generated?"),
  355. *SoundBankPath,
  356. *Platform.GetPlatformName().ToString());
  357. }
  358. return nullptr;
  359. }
  360. return PlatformData;
  361. }
  362. const TSet<FWwiseSharedLanguageId>& FWwiseDataStructureScopeLock::GetLanguages() const
  363. {
  364. return DataStructure.RootData.Languages;
  365. }
  366. const TSet<FWwiseSharedPlatformId>& FWwiseDataStructureScopeLock::GetPlatforms() const
  367. {
  368. return DataStructure.RootData.Platforms;
  369. }
  370. FWwiseRefPlatform FWwiseDataStructureScopeLock::GetPlatform(const FWwiseSharedPlatformId& InPlatformId) const
  371. {
  372. if (const auto* Platform = DataStructure.RootData.PlatformGuids.Find(InPlatformId.GetPlatformGuid()))
  373. {
  374. return *Platform;
  375. }
  376. return {};
  377. }
  378. FWwiseDataStructureWriteScopeLock::FWwiseDataStructureWriteScopeLock(FWwiseProjectDatabase& InProjectDatabase) :
  379. FRWScopeLock(InProjectDatabase.GetLockedDataStructure()->Lock, SLT_Write),
  380. DataStructure(*InProjectDatabase.GetLockedDataStructure())
  381. {
  382. }
  383. #if PLATFORM_LINUX
  384. const FGuid FWwiseProjectDatabase::BasePlatformGuid(0xbd0bdf13, 0x3125454f, 0x8bfd3195, 0x37169f81);
  385. #elif PLATFORM_MAC
  386. const FGuid FWwiseProjectDatabase::BasePlatformGuid(0x9c6217d5, 0xdd114795, 0x87c16ce0, 0x2853c540);
  387. #elif PLATFORM_WINDOWS
  388. const FGuid FWwiseProjectDatabase::BasePlatformGuid(0x6e0cb257, 0xc6c84c5c, 0x83662740, 0xdfc441eb);
  389. #else
  390. static_assert(false);
  391. #endif
  392. FWwiseSharedLanguageId FWwiseProjectDatabase::GetCurrentLanguage() const
  393. {
  394. auto* ResourceLoader = GetResourceLoader();
  395. if (UNLIKELY(!ResourceLoader))
  396. {
  397. return {};
  398. }
  399. const auto CurrentLanguage = ResourceLoader->GetCurrentLanguage();
  400. return FWwiseSharedLanguageId(CurrentLanguage.GetLanguageId(), CurrentLanguage.GetLanguageName(), CurrentLanguage.LanguageRequirement);
  401. }
  402. FWwiseSharedPlatformId FWwiseProjectDatabase::GetCurrentPlatform() const
  403. {
  404. auto* ResourceLoader = GetResourceLoader();
  405. if (UNLIKELY(!ResourceLoader))
  406. {
  407. return {};
  408. }
  409. return ResourceLoader->GetCurrentPlatform();
  410. }
  411. bool FWwiseProjectDatabase::DisableDefaultPlatforms() const
  412. {
  413. return UNLIKELY(!IWwiseProjectDatabaseModule::ShouldInitializeProjectDatabase()) && (Get() == this);
  414. }
  415. #undef LOCTEXT_NAMESPACE