WwiseInitBankLoader.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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 "WwiseInitBankLoader/WwiseInitBankLoader.h"
  16. #if WITH_EDITORONLY_DATA
  17. #include "Platforms/AkPlatformInfo.h"
  18. #include "Wwise/WwiseProjectDatabase.h"
  19. #endif
  20. #if WITH_EDITOR
  21. #include "AssetToolsModule.h"
  22. #include "FileHelpers.h"
  23. #endif
  24. #include "AkAudioDevice.h"
  25. #include "AkSettings.h"
  26. #include "AkUnrealEditorHelper.h"
  27. #include "Interfaces/IPluginManager.h"
  28. #include "Misc/ScopedSlowTask.h"
  29. #define LOCTEXT_NAMESPACE "WwiseInitBankLoader"
  30. FWwiseInitBankLoader* FWwiseInitBankLoader::Get()
  31. {
  32. static FWwiseInitBankLoader* Instance = new FWwiseInitBankLoader;
  33. return Instance;
  34. }
  35. FWwiseInitBankLoader::FWwiseInitBankLoader()
  36. {
  37. }
  38. #if WITH_EDITORONLY_DATA
  39. void FWwiseInitBankLoader::UpdateInitBankInSettings()
  40. {
  41. UE_LOG(LogAkAudio, VeryVerbose, TEXT("FWwiseInitBankLoader::UpdateInitBankInSettings: Updating InitBank in Settings."));
  42. if (!GetInitBankAsset())
  43. {
  44. auto* Settings = GetMutableDefault<UAkSettings>();
  45. if (UNLIKELY(!Settings))
  46. {
  47. UE_LOG(LogAkAudio, Error, TEXT("UpdateInitBankInSettings: Could not retrieve AkSettings."));
  48. return;
  49. }
  50. const FSoftObjectPath Path = Settings->DefaultAssetCreationPath / TEXT("InitBank");
  51. if (const auto LoadedUObject = Path.TryLoad())
  52. {
  53. Settings->InitBank = Cast<UAkInitBank>(LoadedUObject);
  54. UE_CLOG(Settings->InitBank.IsValid(), LogAkAudio, Display, TEXT("UpdateInitBankInSettings: Using existing InitBank at %s"), *Settings->DefaultAssetCreationPath);
  55. }
  56. if (!Settings->InitBank.IsValid())
  57. {
  58. FScopedSlowTask SlowTask(0, LOCTEXT("WwiseInitBankCreating", "Creating InitBank asset..."));
  59. UE_LOG(LogAkAudio, Display, TEXT("UpdateInitBankInSettings: Creating required InitBank at %s"), *Settings->DefaultAssetCreationPath);
  60. auto& AssetToolsModule = FModuleManager::LoadModuleChecked<FAssetToolsModule>("AssetTools").Get();
  61. Settings->InitBank = Cast<UAkInitBank>(AssetToolsModule.CreateAsset(TEXT("InitBank"), Settings->DefaultAssetCreationPath, UAkInitBank::StaticClass(), nullptr));
  62. }
  63. const ELoadingPhase::Type CurrentPhase = IPluginManager::Get().GetLastCompletedLoadingPhase();
  64. if (CurrentPhase == ELoadingPhase::None || CurrentPhase < ELoadingPhase::PostEngineInit)
  65. {
  66. PostInitDelegate = FCoreDelegates::OnPostEngineInit.AddRaw(this, &FWwiseInitBankLoader::OnPostInitSavePackage);
  67. }
  68. else
  69. {
  70. OnPostInitSavePackage();
  71. }
  72. }
  73. }
  74. #endif
  75. void FWwiseInitBankLoader::LoadInitBank() const
  76. {
  77. auto* InitBankAsset = GetInitBankAsset();
  78. if (UNLIKELY(!InitBankAsset))
  79. {
  80. UE_LOG(LogAkAudio, Warning, TEXT("LoadInitBank: InitBankAsset not initialized"));
  81. return;
  82. }
  83. UE_LOG(LogAkAudio, Verbose, TEXT("LoadInitBank: Loading Init Bank asset"));
  84. InitBankAsset->AddToRoot();
  85. InitBankAsset->LoadInitBank();
  86. }
  87. void FWwiseInitBankLoader::UnloadInitBank() const
  88. {
  89. auto* InitBankAsset = GetInitBankAsset();
  90. if (UNLIKELY(!InitBankAsset))
  91. {
  92. UE_LOG(LogAkAudio, Warning, TEXT("UnloadInitBank: InitBankAsset not initialized"));
  93. return;
  94. }
  95. UE_LOG(LogAkAudio, Verbose, TEXT("UnloadInitBank: Unloading init bank asset"));
  96. InitBankAsset->RemoveFromRoot();
  97. InitBankAsset->UnloadInitBank(true);
  98. }
  99. UAkInitBank* FWwiseInitBankLoader::GetInitBankAsset() const
  100. {
  101. const auto* Settings = GetDefault<UAkSettings>();
  102. if (UNLIKELY(!Settings))
  103. {
  104. UE_LOG(LogAkAudio, Error, TEXT("GetInitBankAsset: Could not retrieve AkSettings."));
  105. return nullptr;
  106. }
  107. if (Settings->InitBank.IsNull())
  108. {
  109. UE_LOG(LogAkAudio, Log, TEXT("FWwiseInitBankLoader::GetInitBankAsset: InitBank asset is not set in Settings."));
  110. return nullptr;
  111. }
  112. return Settings->InitBank.LoadSynchronous();
  113. }
  114. #if WITH_EDITORONLY_DATA
  115. void FWwiseInitBankLoader::OnPostInitSavePackage() const
  116. {
  117. auto* Settings = GetMutableDefault<UAkSettings>();
  118. if (UNLIKELY(!Settings))
  119. {
  120. UE_LOG(LogAkAudio, Error, TEXT("OnPostInitSavePackage: Could not retrieve AkSettings."));
  121. return;
  122. }
  123. if (UNLIKELY(!Settings->InitBank.IsValid()))
  124. {
  125. UE_LOG(LogAkAudio, Error, TEXT("OnPostInitSavePackage: Trying to save invalid Init Bank in %s"), *Settings->DefaultAssetCreationPath);
  126. }
  127. UE_LOG(LogAkAudio, Display, TEXT("OnPostInitSavePackage: Saving new Init Bank in %s..."), *Settings->DefaultAssetCreationPath);
  128. UEditorLoadingAndSavingUtils::SavePackages({ Settings->InitBank->GetPackage() }, true);
  129. AkUnrealEditorHelper::SaveConfigFile(Settings);
  130. }
  131. #endif
  132. #undef LOCTEXT_NAMESPACE