WwiseResourceCooker.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563
  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/WwiseResourceCooker.h"
  16. #include "Wwise/Stats/ResourceCooker.h"
  17. #include "Wwise/WwiseResourceLoader.h"
  18. #include "Wwise/WwiseCookingCache.h"
  19. #include "Wwise/Stats/ResourceCooker.h"
  20. #include "Async/Async.h"
  21. void FWwiseResourceCooker::CookAuxBus(const FWwiseObjectInfo& InInfo, WriteAdditionalFileFunction WriteAdditionalFile)
  22. {
  23. auto* CookingCache = GetCookingCache();
  24. if (UNLIKELY(!CookingCache))
  25. {
  26. UE_LOG(LogWwiseResourceCooker, Error, TEXT("CookAuxBus: No CookingCache."));
  27. return;
  28. }
  29. if (const auto* CachedCookedData = CookingCache->AuxBusCache.Find(InInfo))
  30. {
  31. CookLocalizedAuxBusToSandbox(*CachedCookedData, WriteAdditionalFile);
  32. }
  33. else
  34. {
  35. FWwiseLocalizedAuxBusCookedData CookedData;
  36. if (UNLIKELY(!GetAuxBusCookedData(CookedData, InInfo)))
  37. {
  38. return;
  39. }
  40. CookingCache->AuxBusCache.Add(InInfo, CookedData);
  41. CookLocalizedAuxBusToSandbox(CookedData, WriteAdditionalFile);
  42. }
  43. }
  44. void FWwiseResourceCooker::CookEvent(const FWwiseEventInfo& InInfo, WriteAdditionalFileFunction WriteAdditionalFile)
  45. {
  46. auto* CookingCache = GetCookingCache();
  47. if (UNLIKELY(!CookingCache))
  48. {
  49. UE_LOG(LogWwiseResourceCooker, Error, TEXT("CookEvent: No CookingCache."));
  50. return;
  51. }
  52. if (const auto* CachedCookedData = CookingCache->EventCache.Find(InInfo))
  53. {
  54. CookLocalizedEventToSandbox(*CachedCookedData, WriteAdditionalFile);
  55. }
  56. else
  57. {
  58. FWwiseLocalizedEventCookedData CookedData;
  59. if (UNLIKELY(!GetEventCookedData(CookedData, InInfo)))
  60. {
  61. return;
  62. }
  63. CookingCache->EventCache.Add(InInfo, CookedData);
  64. CookLocalizedEventToSandbox(CookedData, WriteAdditionalFile);
  65. }
  66. }
  67. void FWwiseResourceCooker::CookExternalSource(uint32 InCookie, WriteAdditionalFileFunction WriteAdditionalFile)
  68. {
  69. auto* CookingCache = GetCookingCache();
  70. if (UNLIKELY(!CookingCache))
  71. {
  72. UE_LOG(LogWwiseResourceCooker, Error, TEXT("CookExternalSource: No CookingCache."));
  73. return;
  74. }
  75. if (const auto* CachedCookedData = CookingCache->ExternalSourceCache.Find(InCookie))
  76. {
  77. CookExternalSourceToSandbox(*CachedCookedData, WriteAdditionalFile);
  78. }
  79. else
  80. {
  81. FWwiseExternalSourceCookedData CookedData;
  82. if (UNLIKELY(!GetExternalSourceCookedData(CookedData, InCookie)))
  83. {
  84. return;
  85. }
  86. CookingCache->ExternalSourceCache.Add(InCookie, CookedData);
  87. CookExternalSourceToSandbox(CookedData, WriteAdditionalFile);
  88. }
  89. }
  90. void FWwiseResourceCooker::CookInitBank(const FWwiseObjectInfo& InInfo, WriteAdditionalFileFunction WriteAdditionalFile)
  91. {
  92. auto* CookingCache = GetCookingCache();
  93. if (UNLIKELY(!CookingCache))
  94. {
  95. UE_LOG(LogWwiseResourceCooker, Error, TEXT("CookInitBank: No CookingCache."));
  96. return;
  97. }
  98. if (const auto* CachedCookedData = CookingCache->InitBankCache.Find(InInfo))
  99. {
  100. CookInitBankToSandbox(*CachedCookedData, WriteAdditionalFile);
  101. }
  102. else
  103. {
  104. FWwiseInitBankCookedData CookedData;
  105. if (UNLIKELY(!GetInitBankCookedData(CookedData, InInfo)))
  106. {
  107. return;
  108. }
  109. CookingCache->InitBankCache.Add(InInfo, CookedData);
  110. CookInitBankToSandbox(CookedData, WriteAdditionalFile);
  111. }
  112. }
  113. void FWwiseResourceCooker::CookMedia(const FWwiseObjectInfo& InInfo, WriteAdditionalFileFunction WriteAdditionalFile)
  114. {
  115. auto* CookingCache = GetCookingCache();
  116. if (UNLIKELY(!CookingCache))
  117. {
  118. UE_LOG(LogWwiseResourceCooker, Error, TEXT("CookMedia: No CookingCache."));
  119. return;
  120. }
  121. FWwiseDatabaseMediaIdKey MediaKey;
  122. MediaKey.MediaId = InInfo.WwiseShortId;
  123. MediaKey.SoundBankId = InInfo.HardCodedSoundBankShortId;
  124. if (const auto* CachedCookedData = CookingCache->MediaCache.Find(MediaKey))
  125. {
  126. CookMediaToSandbox(*CachedCookedData, WriteAdditionalFile);
  127. }
  128. else
  129. {
  130. FWwiseMediaCookedData CookedData;
  131. if (UNLIKELY(!GetMediaCookedData(CookedData, InInfo)))
  132. {
  133. return;
  134. }
  135. CookingCache->MediaCache.Add(MediaKey, CookedData);
  136. CookMediaToSandbox(CookedData, WriteAdditionalFile);
  137. }
  138. }
  139. void FWwiseResourceCooker::CookShareSet(const FWwiseObjectInfo& InInfo, WriteAdditionalFileFunction WriteAdditionalFile)
  140. {
  141. auto* CookingCache = GetCookingCache();
  142. if (UNLIKELY(!CookingCache))
  143. {
  144. UE_LOG(LogWwiseResourceCooker, Error, TEXT("CookShareSet: No CookingCache."));
  145. return;
  146. }
  147. if (const auto* CachedCookedData = CookingCache->ShareSetCache.Find(InInfo))
  148. {
  149. CookLocalizedShareSetToSandbox(*CachedCookedData, WriteAdditionalFile);
  150. }
  151. else
  152. {
  153. FWwiseLocalizedShareSetCookedData CookedData;
  154. if (UNLIKELY(!GetShareSetCookedData(CookedData, InInfo)))
  155. {
  156. return;
  157. }
  158. CookingCache->ShareSetCache.Add(InInfo, CookedData);
  159. CookLocalizedShareSetToSandbox(CookedData, WriteAdditionalFile);
  160. }
  161. }
  162. void FWwiseResourceCooker::CookSoundBank(const FWwiseObjectInfo& InInfo, WriteAdditionalFileFunction WriteAdditionalFile)
  163. {
  164. auto* CookingCache = GetCookingCache();
  165. if (UNLIKELY(!CookingCache))
  166. {
  167. UE_LOG(LogWwiseResourceCooker, Error, TEXT("CookSoundBank: No CookingCache."));
  168. return;
  169. }
  170. if (const auto* CachedCookedData = CookingCache->SoundBankCache.Find(InInfo))
  171. {
  172. CookLocalizedSoundBankToSandbox(*CachedCookedData, WriteAdditionalFile);
  173. }
  174. else
  175. {
  176. FWwiseLocalizedSoundBankCookedData CookedData;
  177. if (UNLIKELY(!GetSoundBankCookedData(CookedData, InInfo)))
  178. {
  179. return;
  180. }
  181. CookingCache->SoundBankCache.Add(InInfo, CookedData);
  182. CookLocalizedSoundBankToSandbox(CookedData, WriteAdditionalFile);
  183. }
  184. }
  185. bool FWwiseResourceCooker::PrepareCookedData(FWwiseAcousticTextureCookedData& OutCookedData, const FWwiseObjectInfo& InInfo)
  186. {
  187. auto* CookingCache = GetCookingCache();
  188. if (!CookingCache)
  189. {
  190. return GetAcousticTextureCookedData(OutCookedData, InInfo);
  191. }
  192. if (const auto* CachedCookedData = CookingCache->AcousticTextureCache.Find(InInfo))
  193. {
  194. OutCookedData = *CachedCookedData;
  195. return true;
  196. }
  197. else if (LIKELY(GetAcousticTextureCookedData(OutCookedData, InInfo)))
  198. {
  199. CookingCache->AcousticTextureCache.Add(InInfo, OutCookedData);
  200. return true;
  201. }
  202. return false;
  203. }
  204. bool FWwiseResourceCooker::PrepareCookedData(FWwiseLocalizedAuxBusCookedData& OutCookedData, const FWwiseObjectInfo& InInfo)
  205. {
  206. auto* CookingCache = GetCookingCache();
  207. if (!CookingCache)
  208. {
  209. return GetAuxBusCookedData(OutCookedData, InInfo);
  210. }
  211. if (const auto* CachedCookedData = CookingCache->AuxBusCache.Find(InInfo))
  212. {
  213. OutCookedData = *CachedCookedData;
  214. return true;
  215. }
  216. else if (LIKELY(GetAuxBusCookedData(OutCookedData, InInfo)))
  217. {
  218. CookingCache->AuxBusCache.Add(InInfo, OutCookedData);
  219. return true;
  220. }
  221. return false;
  222. }
  223. bool FWwiseResourceCooker::PrepareCookedData(FWwiseLocalizedEventCookedData& OutCookedData, const FWwiseEventInfo& InInfo)
  224. {
  225. auto* CookingCache = GetCookingCache();
  226. if (!CookingCache)
  227. {
  228. return GetEventCookedData(OutCookedData, InInfo);
  229. }
  230. if (const auto* CachedCookedData = CookingCache->EventCache.Find(InInfo))
  231. {
  232. OutCookedData = *CachedCookedData;
  233. return true;
  234. }
  235. else if (LIKELY(GetEventCookedData(OutCookedData, InInfo)))
  236. {
  237. CookingCache->EventCache.Add(InInfo, OutCookedData);
  238. return true;
  239. }
  240. return false;
  241. }
  242. bool FWwiseResourceCooker::PrepareCookedData(FWwiseExternalSourceCookedData& OutCookedData, uint32 InCookie)
  243. {
  244. auto* CookingCache = GetCookingCache();
  245. if (!CookingCache)
  246. {
  247. return GetExternalSourceCookedData(OutCookedData, InCookie);
  248. }
  249. if (const auto* CachedCookedData = CookingCache->ExternalSourceCache.Find(InCookie))
  250. {
  251. OutCookedData = *CachedCookedData;
  252. return true;
  253. }
  254. else if (LIKELY(GetExternalSourceCookedData(OutCookedData, InCookie)))
  255. {
  256. CookingCache->ExternalSourceCache.Add(InCookie, OutCookedData);
  257. return true;
  258. }
  259. return false;
  260. }
  261. bool FWwiseResourceCooker::PrepareCookedData(FWwiseGameParameterCookedData& OutCookedData, const FWwiseObjectInfo& InInfo)
  262. {
  263. auto* CookingCache = GetCookingCache();
  264. if (!CookingCache)
  265. {
  266. return GetGameParameterCookedData(OutCookedData, InInfo);
  267. }
  268. if (const auto* CachedCookedData = CookingCache->GameParameterCache.Find(InInfo))
  269. {
  270. OutCookedData = *CachedCookedData;
  271. return true;
  272. }
  273. else if (LIKELY(GetGameParameterCookedData(OutCookedData, InInfo)))
  274. {
  275. CookingCache->GameParameterCache.Add(InInfo, OutCookedData);
  276. return true;
  277. }
  278. return false;
  279. }
  280. bool FWwiseResourceCooker::PrepareCookedData(FWwiseGroupValueCookedData& OutCookedData, const FWwiseGroupValueInfo& InInfo, EWwiseGroupType InGroupType)
  281. {
  282. auto* CookingCache = GetCookingCache();
  283. if (InGroupType == EWwiseGroupType::State)
  284. {
  285. if (!CookingCache)
  286. {
  287. return GetStateCookedData(OutCookedData, InInfo);
  288. }
  289. if (const auto* CachedCookedData = CookingCache->StateCache.Find(InInfo))
  290. {
  291. OutCookedData = *CachedCookedData;
  292. return true;
  293. }
  294. else if (LIKELY(GetStateCookedData(OutCookedData, InInfo)))
  295. {
  296. CookingCache->StateCache.Add(InInfo, OutCookedData);
  297. return true;
  298. }
  299. }
  300. else if (InGroupType == EWwiseGroupType::Switch)
  301. {
  302. if (!CookingCache)
  303. {
  304. return GetSwitchCookedData(OutCookedData, InInfo);
  305. }
  306. if (const auto* CachedCookedData = CookingCache->SwitchCache.Find(InInfo))
  307. {
  308. OutCookedData = *CachedCookedData;
  309. return true;
  310. }
  311. else if (LIKELY(GetSwitchCookedData(OutCookedData, InInfo)))
  312. {
  313. CookingCache->SwitchCache.Add(InInfo, OutCookedData);
  314. return true;
  315. }
  316. }
  317. return false;
  318. }
  319. bool FWwiseResourceCooker::PrepareCookedData(FWwiseInitBankCookedData& OutCookedData, const FWwiseObjectInfo& InInfo)
  320. {
  321. auto* CookingCache = GetCookingCache();
  322. if (!CookingCache)
  323. {
  324. return GetInitBankCookedData(OutCookedData, InInfo);
  325. }
  326. if (const auto* CachedCookedData = CookingCache->InitBankCache.Find(InInfo))
  327. {
  328. OutCookedData = *CachedCookedData;
  329. return true;
  330. }
  331. else if (LIKELY(GetInitBankCookedData(OutCookedData, InInfo)))
  332. {
  333. CookingCache->InitBankCache.Add(InInfo, OutCookedData);
  334. return true;
  335. }
  336. return false;
  337. }
  338. bool FWwiseResourceCooker::PrepareCookedData(FWwiseMediaCookedData& OutCookedData, const FWwiseObjectInfo& InInfo)
  339. {
  340. auto* CookingCache = GetCookingCache();
  341. if (!CookingCache)
  342. {
  343. return GetMediaCookedData(OutCookedData, InInfo);
  344. }
  345. FWwiseDatabaseMediaIdKey MediaIdKey;
  346. MediaIdKey.MediaId = InInfo.WwiseShortId;
  347. MediaIdKey.SoundBankId = InInfo.HardCodedSoundBankShortId;
  348. if (const auto* CachedCookedData = CookingCache->MediaCache.Find(MediaIdKey))
  349. {
  350. OutCookedData = *CachedCookedData;
  351. return true;
  352. }
  353. else if (LIKELY(GetMediaCookedData(OutCookedData, InInfo)))
  354. {
  355. CookingCache->MediaCache.Add(MediaIdKey, OutCookedData);
  356. return true;
  357. }
  358. return false;
  359. }
  360. bool FWwiseResourceCooker::PrepareCookedData(FWwiseLocalizedShareSetCookedData& OutCookedData, const FWwiseObjectInfo& InInfo)
  361. {
  362. auto* CookingCache = GetCookingCache();
  363. if (!CookingCache)
  364. {
  365. return GetShareSetCookedData(OutCookedData, InInfo);
  366. }
  367. if (const auto* CachedCookedData = CookingCache->ShareSetCache.Find(InInfo))
  368. {
  369. OutCookedData = *CachedCookedData;
  370. return true;
  371. }
  372. else if (LIKELY(GetShareSetCookedData(OutCookedData, InInfo)))
  373. {
  374. CookingCache->ShareSetCache.Add(InInfo, OutCookedData);
  375. return true;
  376. }
  377. return false;
  378. }
  379. bool FWwiseResourceCooker::PrepareCookedData(FWwiseLocalizedSoundBankCookedData& OutCookedData, const FWwiseObjectInfo& InInfo)
  380. {
  381. auto* CookingCache = GetCookingCache();
  382. if (!CookingCache)
  383. {
  384. return GetSoundBankCookedData(OutCookedData, InInfo);
  385. }
  386. if (const auto* CachedCookedData = CookingCache->SoundBankCache.Find(InInfo))
  387. {
  388. OutCookedData = *CachedCookedData;
  389. return true;
  390. }
  391. else if (LIKELY(GetSoundBankCookedData(OutCookedData, InInfo)))
  392. {
  393. CookingCache->SoundBankCache.Add(InInfo, OutCookedData);
  394. return true;
  395. }
  396. return false;
  397. }
  398. bool FWwiseResourceCooker::PrepareCookedData(FWwiseTriggerCookedData& OutCookedData, const FWwiseObjectInfo& InInfo)
  399. {
  400. auto* CookingCache = GetCookingCache();
  401. if (!CookingCache)
  402. {
  403. return GetTriggerCookedData(OutCookedData, InInfo);
  404. }
  405. if (const auto* CachedCookedData = CookingCache->TriggerCache.Find(InInfo))
  406. {
  407. OutCookedData = *CachedCookedData;
  408. return true;
  409. }
  410. else if (LIKELY(GetTriggerCookedData(OutCookedData, InInfo)))
  411. {
  412. CookingCache->TriggerCache.Add(InInfo, OutCookedData);
  413. return true;
  414. }
  415. return false;
  416. }
  417. void FWwiseResourceCooker::SetSandboxRootPath(const TCHAR* InPackageFilename)
  418. {
  419. if (!SandboxRootPath.IsEmpty())
  420. {
  421. return;
  422. }
  423. auto SandboxPath = FPaths::GetPath(InPackageFilename); // Remove Filename.uasset
  424. while (!SandboxPath.IsEmpty() && FPaths::GetCleanFilename(SandboxPath) != TEXT("Content"))
  425. {
  426. SandboxPath = FPaths::GetPath(SandboxPath);
  427. }
  428. UE_LOG(LogWwiseResourceCooker, Display, TEXT("SetSandboxRootPath: Updating Sandbox Root Path: %s"), *SandboxPath);
  429. SandboxRootPath = SandboxPath;
  430. }
  431. FWwiseResourceLoader* FWwiseResourceCooker::GetResourceLoader()
  432. {
  433. if (auto* ProjectDatabase = GetProjectDatabase())
  434. {
  435. return ProjectDatabase->GetResourceLoader();
  436. }
  437. else
  438. {
  439. return FWwiseResourceLoader::Get();
  440. }
  441. }
  442. const FWwiseResourceLoader* FWwiseResourceCooker::GetResourceLoader() const
  443. {
  444. if (const auto* ProjectDatabase = GetProjectDatabase())
  445. {
  446. return ProjectDatabase->GetResourceLoader();
  447. }
  448. else
  449. {
  450. return FWwiseResourceLoader::Get();
  451. }
  452. }
  453. FWwiseSharedLanguageId FWwiseResourceCooker::GetCurrentLanguage() const
  454. {
  455. if (const auto* ProjectDatabase = GetProjectDatabase())
  456. {
  457. return ProjectDatabase->GetCurrentLanguage();
  458. }
  459. return {};
  460. }
  461. FWwiseSharedPlatformId FWwiseResourceCooker::GetCurrentPlatform() const
  462. {
  463. if (const auto* ProjectDatabase = GetProjectDatabase())
  464. {
  465. return ProjectDatabase->GetCurrentPlatform();
  466. }
  467. return {};
  468. }
  469. void FWwiseResourceCooker::CookLocalizedAuxBusToSandbox(const FWwiseLocalizedAuxBusCookedData& InCookedData, WriteAdditionalFileFunction WriteAdditionalFile)
  470. {
  471. for (const auto& AuxBus : InCookedData.AuxBusLanguageMap)
  472. {
  473. UE_LOG(LogWwiseResourceCooker, Verbose, TEXT("Cooking AuxBus %s in %s %" PRIu32), *InCookedData.DebugName.ToString(), *AuxBus.Key.GetLanguageName().ToString(), (uint32)AuxBus.Key.GetLanguageId());
  474. CookAuxBusToSandbox(AuxBus.Value, WriteAdditionalFile);
  475. }
  476. }
  477. void FWwiseResourceCooker::CookLocalizedEventToSandbox(const FWwiseLocalizedEventCookedData& InCookedData, WriteAdditionalFileFunction WriteAdditionalFile)
  478. {
  479. for (const auto& Event : InCookedData.EventLanguageMap)
  480. {
  481. UE_LOG(LogWwiseResourceCooker, Verbose, TEXT("Cooking Event %s in %s %" PRIu32), *InCookedData.DebugName.ToString(), *Event.Key.GetLanguageName().ToString(), (uint32)Event.Key.GetLanguageId());
  482. CookEventToSandbox(Event.Value, WriteAdditionalFile);
  483. }
  484. }
  485. void FWwiseResourceCooker::CookLocalizedShareSetToSandbox(const FWwiseLocalizedShareSetCookedData& InCookedData, WriteAdditionalFileFunction WriteAdditionalFile)
  486. {
  487. for (const auto& ShareSet : InCookedData.ShareSetLanguageMap)
  488. {
  489. UE_LOG(LogWwiseResourceCooker, Verbose, TEXT("Cooking ShareSet %s in %s %" PRIu32), *InCookedData.DebugName.ToString(), *ShareSet.Key.GetLanguageName().ToString(), (uint32)ShareSet.Key.GetLanguageId());
  490. CookShareSetToSandbox(ShareSet.Value, WriteAdditionalFile);
  491. }
  492. }
  493. void FWwiseResourceCooker::CookLocalizedSoundBankToSandbox(const FWwiseLocalizedSoundBankCookedData& InCookedData, WriteAdditionalFileFunction WriteAdditionalFile)
  494. {
  495. for (const auto& SoundBank : InCookedData.SoundBankLanguageMap)
  496. {
  497. UE_LOG(LogWwiseResourceCooker, Verbose, TEXT("Cooking SoundBank %s in %s %" PRIu32), *InCookedData.DebugName.ToString(), *SoundBank.Key.GetLanguageName().ToString(), (uint32)SoundBank.Key.GetLanguageId());
  498. CookSoundBankToSandbox(SoundBank.Value, WriteAdditionalFile);
  499. }
  500. }