123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480 |
- #include "Wwise/WwiseDirectoryVisitor.h"
- #include "WwiseUnrealHelper.h"
- #include "Wwise/Metadata/WwiseMetadataRootFile.h"
- #include "Wwise/Metadata/WwiseMetadataProjectInfo.h"
- #include "Wwise/Metadata/WwiseMetadataPlatform.h"
- #include "Wwise/Metadata/WwiseMetadataLanguage.h"
- #include "Wwise/Stats/ProjectDatabase.h"
- #include "Async/Async.h"
- #include "Misc/Paths.h"
- class FWwiseDirectoryVisitor::FPlatformRootDirectoryVisitor : public IPlatformFile::FDirectoryVisitor, public FWwiseDirectoryVisitor::IGettableVisitor
- {
- public:
- FPlatformRootDirectoryVisitor(
- const FWwiseSharedPlatformId& InPlatform,
- IPlatformFile& InFileInterface) :
- Platform(InPlatform),
- FileInterface(InFileInterface)
- {}
- bool Visit(const TCHAR* FilenameOrDirectory, bool bIsDirectory) override;
- bool StartJobIfValid();
- FWwiseGeneratedFiles::FPlatformFiles& Get() override;
- const FWwiseSharedPlatformId Platform;
- IPlatformFile& FileInterface;
- FWwiseGeneratedFiles::FPlatformFiles PlatformFiles;
- TArray<TFuture<FWwiseDirectoryVisitor::IGettableVisitor*>> Futures;
- };
- class FWwiseDirectoryVisitor::FSoundBankVisitor : public IPlatformFile::FDirectoryVisitor, public FWwiseDirectoryVisitor::IGettableVisitor
- {
- public:
- FSoundBankVisitor(IPlatformFile& InFileInterface) :
- FileInterface(InFileInterface)
- {}
- virtual bool Visit(const TCHAR* FilenameOrDirectory, bool bIsDirectory);
- FWwiseGeneratedFiles::FPlatformFiles& Get() override;
- IPlatformFile& FileInterface;
- FWwiseGeneratedFiles::FPlatformFiles Result;
- };
- class FWwiseDirectoryVisitor::FMediaVisitor : public IPlatformFile::FDirectoryVisitor, public FWwiseDirectoryVisitor::IGettableVisitor
- {
- public:
- FMediaVisitor(IPlatformFile& InFileInterface) :
- FileInterface(InFileInterface)
- {}
- virtual bool Visit(const TCHAR* FilenameOrDirectory, bool bIsDirectory);
- FWwiseGeneratedFiles::FPlatformFiles& Get() override;
- IPlatformFile& FileInterface;
- FWwiseGeneratedFiles::FPlatformFiles Result;
- };
- bool FWwiseDirectoryVisitor::Visit(const TCHAR* FilenameOrDirectory, bool bIsDirectory)
- {
- SCOPED_WWISEPROJECTDATABASE_EVENT_2(TEXT("FWwiseDirectoryVisitor::Visit"));
-
- FString RelativeFilename = FilenameOrDirectory;
- FPaths::MakeStandardFilename(RelativeFilename);
- const auto Filename = FPaths::GetCleanFilename(RelativeFilename);
- if (Filename.StartsWith(TEXT(".")))
- {
- UE_LOG(LogWwiseProjectDatabase, Verbose, TEXT("[WwiseDirectoryVisitor] Skipping: %s"), *RelativeFilename);
- return true;
- }
- UE_LOG(LogWwiseProjectDatabase, VeryVerbose, TEXT("[WwiseDirectoryVisitor] Visiting %s"), *RelativeFilename);
- if (bIsDirectory)
- {
-
- return true;
- }
- FWwiseGeneratedFiles::FileTuple FileToAdd(RelativeFilename, FileInterface.GetTimeStamp(FilenameOrDirectory));
- const auto Extension = FPaths::GetExtension(RelativeFilename);
- if (Filename.Equals(TEXT("ProjectInfo.json"), ESearchCase::IgnoreCase))
- {
- UE_LOG(LogWwiseProjectDatabase, Verbose, TEXT("Found ProjectInfo: %s"), *RelativeFilename);
-
-
- auto Root = FWwiseMetadataRootFile::LoadFile(RelativeFilename);
- if (!Root || !Root->ProjectInfo)
- {
- UE_LOG(LogWwiseProjectDatabase, Error, TEXT("Could not read ProjectInfo to retrieve paths."), *RelativeFilename);
- return true;
- }
- GeneratedDirectory.ProjectInfo = Root;
- const auto Path = FPaths::GetPath(FilenameOrDirectory);
- auto& Platforms = Root->ProjectInfo->Platforms;
- bool bFoundPlatform = false;
- if (!PlatformName)
- {
- UE_LOG(LogWwiseProjectDatabase, Log, TEXT("Skipping loading all platforms"));
- }
- else
- {
- for (auto& Platform : Platforms)
- {
- if (PlatformName->ToString().Equals(Platform.Name.ToString(), ESearchCase::IgnoreCase))
- {
- bFoundPlatform = true;
- break;
- }
- }
- UE_CLOG(UNLIKELY(!bFoundPlatform), LogWwiseProjectDatabase, Log, TEXT("Requested platform not found: %s"), *PlatformName->ToString());
- }
- if (bFoundPlatform)
- {
- for (auto& Platform : Platforms)
- {
- const auto PlatformPath = Path / Platform.Path.ToString();
- if (!PlatformName->ToString().Equals(Platform.Name.ToString(), ESearchCase::IgnoreCase))
- {
- UE_LOG(LogWwiseProjectDatabase, Verbose, TEXT("Skipping platform %s"), *Platform.Name.ToString());
- continue;
- }
- if (PlatformGuid && *PlatformGuid != Platform.BasePlatformGUID)
- {
- UE_LOG(LogWwiseProjectDatabase, Verbose, TEXT("Skipping platform %s (Base %s)"), *Platform.Name.ToString(), *Platform.BasePlatform.ToString());
- continue;
- }
- UE_LOG(LogWwiseProjectDatabase, Verbose, TEXT("Visiting platform %s at: %s"), *Platform.Name.ToString(), *Platform.Path.ToString());
- FWwisePlatformId CurrentPlatform;
- CurrentPlatform.PlatformGuid = Platform.GUID;
- CurrentPlatform.PlatformName = Platform.Name;
- FString RelativePlatformPath(PlatformPath);
- FPaths::MakePathRelativeTo(RelativePlatformPath, *WwiseUnrealHelper::GetSoundBankDirectory());
- CurrentPlatform.PathRelativeToGeneratedSoundBanks = FName(RelativePlatformPath);
- FWwiseSharedPlatformId PlatformRef;
- PlatformRef.Platform = MakeShared<FWwisePlatformId, ESPMode::ThreadSafe>(CurrentPlatform);
- Futures.Add(Async(EAsyncExecution::TaskGraph, [this, PlatformRef, PlatformPath] {
- auto* RootVisitor = new FPlatformRootDirectoryVisitor(PlatformRef, FileInterface);
- if (!FileInterface.IterateDirectory(*PlatformPath, *RootVisitor) ||
- !RootVisitor->StartJobIfValid())
- {
- UE_LOG(LogWwiseProjectDatabase, Warning, TEXT("Could not find generated platform %s at: %s"), *PlatformRef.GetPlatformName().ToString(), *PlatformRef.Platform->PathRelativeToGeneratedSoundBanks.ToString());
- delete RootVisitor;
- RootVisitor = nullptr;
- }
- return RootVisitor;
- }));
- }
- }
- GeneratedDirectory.GeneratedRootFiles.ProjectInfoFile = MoveTemp(FileToAdd);
- }
- else if (Filename.Equals(TEXT("Wwise_IDs.h"), ESearchCase::IgnoreCase))
- {
- UE_LOG(LogWwiseProjectDatabase, Verbose, TEXT("Found Wwise IDs: %s"), *RelativeFilename);
- GeneratedDirectory.GeneratedRootFiles.WwiseIDsFile = MoveTemp(FileToAdd);
- }
- else if (Filename.Equals(TEXT("SoundBanksGeneration.log"), ESearchCase::IgnoreCase)
- || Extension.Equals(TEXT("xml"), ESearchCase::IgnoreCase))
- {
-
- }
- else
- {
- UE_LOG(LogWwiseProjectDatabase, Log, TEXT("Unknown file. Not in a platform. Will be ignored: %s"), *RelativeFilename);
- }
- return true;
- }
- FWwiseGeneratedFiles& FWwiseDirectoryVisitor::Get()
- {
- SCOPED_WWISEPROJECTDATABASE_EVENT_4(TEXT("FWwiseDirectoryVisitor::Get"));
- for (const auto& Future : Futures)
- {
- auto* Result = Future.Get();
- if (Result)
- {
- auto& PlatformFiles = Result->Get();
- if (PlatformFiles.IsValid())
- {
- GeneratedDirectory.Platforms.Add(Result->Platform, PlatformFiles);
- }
- delete Result;
- }
- }
- Futures.Empty();
- return GeneratedDirectory;
- }
- bool FWwiseDirectoryVisitor::FPlatformRootDirectoryVisitor::Visit(const TCHAR* FilenameOrDirectory, bool bIsDirectory)
- {
- SCOPED_WWISEPROJECTDATABASE_EVENT_2(TEXT("FPlatformRootDirectoryVisitor::Visit"));
-
- FString RelativeFilename = FilenameOrDirectory;
- FPaths::MakeStandardFilename(RelativeFilename);
- const auto Filename = FPaths::GetCleanFilename(RelativeFilename);
- if (Filename.StartsWith(TEXT(".")))
- {
- UE_LOG(LogWwiseProjectDatabase, Verbose, TEXT("[RootFilesVisitor] Skipping: %s"), *RelativeFilename);
- return true;
- }
- UE_LOG(LogWwiseProjectDatabase, VeryVerbose, TEXT("[RootFilesVisitor] Visiting %s"), *RelativeFilename);
- if (bIsDirectory)
- {
- PlatformFiles.DirectoriesToWatch.Add(RelativeFilename);
- if (Filename.Equals(TEXT("Media"), ESearchCase::IgnoreCase))
- {
- UE_LOG(LogWwiseProjectDatabase, Verbose, TEXT("Found media directory: %s"), *RelativeFilename);
- PlatformFiles.MediaDirectory = FilenameOrDirectory;
- }
- else if (Filename.Equals(TEXT("Bus"), ESearchCase::IgnoreCase)
- || Filename.Equals(TEXT("Event"), ESearchCase::IgnoreCase))
- {
- UE_LOG(LogWwiseProjectDatabase, Verbose, TEXT("Found auto SoundBank directory: %s"), *RelativeFilename);
- PlatformFiles.AutoSoundBankDirectories.Add(FilenameOrDirectory);
- }
- else {
- UE_LOG(LogWwiseProjectDatabase, Verbose, TEXT("Found language directory: %s"), *RelativeFilename);
- PlatformFiles.LanguageDirectories.Add(FilenameOrDirectory);
- }
- return true;
- }
- FWwiseGeneratedFiles::FileTuple FileToAdd(RelativeFilename, FileInterface.GetTimeStamp(FilenameOrDirectory));
- const auto Extension = FPaths::GetExtension(RelativeFilename);
- if (!Extension.Equals(TEXT("json"), ESearchCase::IgnoreCase)
- && !Extension.Equals(TEXT("txt"), ESearchCase::IgnoreCase)
- && !Extension.Equals(TEXT("bnk"), ESearchCase::IgnoreCase)
- && !Extension.Equals(TEXT("xml"), ESearchCase::IgnoreCase))
- {
- UE_LOG(LogWwiseProjectDatabase, VeryVerbose, TEXT("Adding extra file: %s"), *RelativeFilename);
- PlatformFiles.ExtraFiles.Add(MoveTemp(FileToAdd));
- return true;
- }
- if (Extension.Equals(TEXT("bnk"), ESearchCase::IgnoreCase))
- {
- UE_LOG(LogWwiseProjectDatabase, VeryVerbose, TEXT("Adding SoundBank file: %s"), *RelativeFilename);
- PlatformFiles.SoundBankFiles.Add(MoveTemp(FileToAdd));
- return true;
- }
- else if (Extension.Equals(TEXT("xml"), ESearchCase::IgnoreCase)
- || Extension.Equals(TEXT("txt"), ESearchCase::IgnoreCase))
- {
- UE_LOG(LogWwiseProjectDatabase, VeryVerbose, TEXT("Skipping file: %s"), *RelativeFilename);
- return true;
- }
- else if (Filename.Equals(TEXT("SoundbanksInfo.json"), ESearchCase::IgnoreCase))
- {
- UE_LOG(LogWwiseProjectDatabase, Verbose, TEXT("Found monolithic SoundBank info: %s"), *RelativeFilename);
- PlatformFiles.SoundbanksInfoFile = MoveTemp(FileToAdd);
- }
- else if (Filename.Equals(TEXT("PlatformInfo.json"), ESearchCase::IgnoreCase))
- {
- UE_LOG(LogWwiseProjectDatabase, Verbose, TEXT("Found platform info: %s"), *RelativeFilename);
- PlatformFiles.PlatformInfoFile = MoveTemp(FileToAdd);
- }
- else if (Filename.Equals(TEXT("PluginInfo.json"), ESearchCase::IgnoreCase))
- {
- UE_LOG(LogWwiseProjectDatabase, Verbose, TEXT("Found plugin info: %s"), *RelativeFilename);
- PlatformFiles.PluginInfoFile = MoveTemp(FileToAdd);
- }
- else
- {
- UE_LOG(LogWwiseProjectDatabase, VeryVerbose, TEXT("Adding metadata file: %s"), *RelativeFilename);
- PlatformFiles.MetadataFiles.Add(MoveTemp(FileToAdd));
- }
- return true;
- }
- bool FWwiseDirectoryVisitor::FPlatformRootDirectoryVisitor::StartJobIfValid()
- {
- if (!PlatformFiles.IsValid())
- {
- return false;
- }
- if (!PlatformFiles.MediaDirectory.IsEmpty())
- {
- const auto& Elem = PlatformFiles.MediaDirectory;
- Futures.Add(Async(EAsyncExecution::TaskGraph, [this, Elem] {
- UE_LOG(LogWwiseProjectDatabase, Verbose, TEXT("Visiting media directory: %s"), *Elem);
- auto* MediaVisitor = new FMediaVisitor(FileInterface);
- FileInterface.IterateDirectory(*Elem, *MediaVisitor);
- return static_cast<FWwiseDirectoryVisitor::IGettableVisitor*>(MediaVisitor);
- }));
- }
- for (const auto& Elem : PlatformFiles.AutoSoundBankDirectories)
- {
- Futures.Add(Async(EAsyncExecution::TaskGraph, [this, Elem] {
- UE_LOG(LogWwiseProjectDatabase, Verbose, TEXT("Visiting auto SoundBank directory: %s"), *Elem);
- auto* SoundBankVisitor = new FSoundBankVisitor(FileInterface);
- FileInterface.IterateDirectory(*Elem, *SoundBankVisitor);
- return static_cast<FWwiseDirectoryVisitor::IGettableVisitor*>(SoundBankVisitor);
- }));
- }
- for (const auto& Elem : PlatformFiles.LanguageDirectories)
- {
- Futures.Add(Async(EAsyncExecution::TaskGraph, [this, Elem] {
- UE_LOG(LogWwiseProjectDatabase, Verbose, TEXT("Visiting language directory: %s"), *Elem);
- auto* SoundBankVisitor = new FSoundBankVisitor(FileInterface);
- FileInterface.IterateDirectory(*Elem, *SoundBankVisitor);
- return static_cast<FWwiseDirectoryVisitor::IGettableVisitor*>(SoundBankVisitor);
- }));
- }
- return true;
- }
- FWwiseGeneratedFiles::FPlatformFiles& FWwiseDirectoryVisitor::FPlatformRootDirectoryVisitor::Get()
- {
- SCOPED_WWISEPROJECTDATABASE_EVENT_4(TEXT("FPlatformRootDirectoryVisitor::Get"));
- for (const auto& Future : Futures)
- {
- auto* Result = Future.Get();
- if (Result)
- {
- PlatformFiles.Append(MoveTemp(Result->Get()));
- delete Result;
- }
- }
- Futures.Empty();
- return PlatformFiles;
- }
- bool FWwiseDirectoryVisitor::FSoundBankVisitor::Visit(const TCHAR* FilenameOrDirectory, bool bIsDirectory)
- {
-
- FString RelativeFilename = FilenameOrDirectory;
- FPaths::MakeStandardFilename(RelativeFilename);
- const auto Filename = FPaths::GetCleanFilename(RelativeFilename);
- const auto Extension = FPaths::GetExtension(RelativeFilename);
- if (Filename.StartsWith(TEXT(".")))
- {
- UE_LOG(LogWwiseProjectDatabase, Verbose, TEXT("[SoundBankVisitor] Skipping: %s"), *RelativeFilename);
- return true;
- }
- UE_LOG(LogWwiseProjectDatabase, VeryVerbose, TEXT("[SoundBankVisitor] Visiting %s"), *RelativeFilename);
- if (bIsDirectory)
- {
- UE_LOG(LogWwiseProjectDatabase, VeryVerbose, TEXT("Iterating folder: %s"), *RelativeFilename);
- Result.DirectoriesToWatch.Add(RelativeFilename);
- FileInterface.IterateDirectory(FilenameOrDirectory, *this);
- return true;
- }
- FWwiseGeneratedFiles::FileTuple FileToAdd(RelativeFilename, FileInterface.GetTimeStamp(FilenameOrDirectory));
- if (Extension.Equals(TEXT("json"), ESearchCase::IgnoreCase))
- {
- UE_LOG(LogWwiseProjectDatabase, VeryVerbose, TEXT("Adding metadata file: %s"), *RelativeFilename);
- Result.MetadataFiles.Add(MoveTemp(FileToAdd));
- return true;
- }
- else if (Extension.Equals(TEXT("bnk"), ESearchCase::IgnoreCase))
- {
- UE_LOG(LogWwiseProjectDatabase, VeryVerbose, TEXT("Adding SoundBank file: %s"), *RelativeFilename);
- Result.SoundBankFiles.Add(MoveTemp(FileToAdd));
- return true;
- }
- else if (Extension.Equals(TEXT("xml"), ESearchCase::IgnoreCase)
- || Extension.Equals(TEXT("txt"), ESearchCase::IgnoreCase))
- {
- UE_LOG(LogWwiseProjectDatabase, VeryVerbose, TEXT("Skipping file: %s"), *RelativeFilename);
- return true;
- }
- else
- {
- UE_LOG(LogWwiseProjectDatabase, VeryVerbose, TEXT("Adding extra file: %s"), *RelativeFilename);
- Result.ExtraFiles.Add(MoveTemp(FileToAdd));
- return true;
- }
- }
- FWwiseGeneratedFiles::FPlatformFiles& FWwiseDirectoryVisitor::FSoundBankVisitor::Get()
- {
- return Result;
- }
- bool FWwiseDirectoryVisitor::FMediaVisitor::Visit(const TCHAR* FilenameOrDirectory, bool bIsDirectory)
- {
-
- FString RelativeFilename = FilenameOrDirectory;
- FPaths::MakeStandardFilename(RelativeFilename);
- UE_LOG(LogWwiseProjectDatabase, VeryVerbose, TEXT("[MediaVisitor] Visiting %s"), *RelativeFilename);
- if (bIsDirectory)
- {
- Result.DirectoriesToWatch.Add(RelativeFilename);
- FileInterface.IterateDirectory(FilenameOrDirectory, *this);
- }
- else
- {
- FWwiseGeneratedFiles::FileTuple FileToAdd(RelativeFilename, FileInterface.GetTimeStamp(FilenameOrDirectory));
- const auto Extension = FPaths::GetExtension(RelativeFilename);
- if (Extension.Equals(TEXT("wem"), ESearchCase::IgnoreCase))
- {
- UE_LOG(LogWwiseProjectDatabase, VeryVerbose, TEXT("Adding media file: %s"), *RelativeFilename);
- Result.MediaFiles.Add(MoveTemp(FileToAdd));
- }
- else
- {
- UE_LOG(LogWwiseProjectDatabase, Log, TEXT("Adding unexpected extra file: %s"), *RelativeFilename);
- Result.ExtraFiles.Add(MoveTemp(FileToAdd));
- }
- }
- return true;
- }
- FWwiseGeneratedFiles::FPlatformFiles& FWwiseDirectoryVisitor::FMediaVisitor::Get()
- {
- return Result;
- }
|