123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- #include "AssetManagement/WwiseProjectInfo.h"
- #include "AkAudioDevice.h"
- #include "AkSettings.h"
- #include "Misc/Paths.h"
- #include "XmlFile.h"
- #include "Internationalization/Regex.h"
- #include "Misc/FileHelper.h"
- void WwiseProjectInfo::Parse()
- {
- SupportedPlatforms.Empty();
- SupportedLanguages.Empty();
- DefaultLanguage.Empty();
- CacheDirectory.Empty();
- bProjectInfoParsed = false;
- FString ProjectPath = GetProjectPath();
- if (ProjectPath.Len() > 0)
- {
- FText errorMessage;
- int32 errorLineNumber;
- FString ProjectFileString;
- if (!FFileHelper::LoadFileToString(ProjectFileString, *ProjectPath))
- {
- return;
- }
- ParseCacheDirectory(*ProjectFileString);
- SanitizeProjectFileString(ProjectFileString);
- bProjectInfoParsed = FFastXml::ParseXmlFile(this, nullptr, ProjectFileString.GetCharArray().GetData(), nullptr, false, false, errorMessage, errorLineNumber);
- if (DefaultLanguage.Len() == 0 || DefaultLanguage == TEXT(""))
- {
- DefaultLanguage = TEXT("English(US)");
- }
- }
- }
- void WwiseProjectInfo::ParseCacheDirectory(const FString ProjectFileString)
- {
- FString PatternString(TEXT("<MiscSettingEntry Name=\"Cache\">([\\s\\S]*?)</MiscSettingEntry>"));
- FRegexPattern Pattern(PatternString);
- FRegexMatcher Matcher(Pattern, ProjectFileString);
- if (Matcher.FindNext())
- {
- CacheDirectory = Matcher.GetCaptureGroup(1);
- CacheDirectory.RemoveFromStart(TEXT("<![CDATA["));
- CacheDirectory.RemoveFromEnd(TEXT("]]>"));
- }
- else if (CacheDirectory.IsEmpty())
- {
- CacheDirectory = TEXT(".cache");
- UE_LOG(LogAkAudio, Log, TEXT("Could not parse the Cache directory from the Wwise project file. Using default value : .cache"));
- }
- if (FPaths::IsRelative(CacheDirectory))
- {
- CacheDirectory = FPaths::ConvertRelativePathToFull(FPaths::GetPath(GetProjectPath()), CacheDirectory);
- }
- }
- void WwiseProjectInfo::SanitizeProjectFileString(FString& InOutProjectFileString)
- {
- FString PatternString(TEXT("<\\!\\[CDATA[\\s\\S]*?>"));
- FRegexPattern Pattern(PatternString);
- FRegexMatcher Matcher(Pattern, InOutProjectFileString);
- while (Matcher.FindNext())
- {
- InOutProjectFileString = InOutProjectFileString.Replace(*Matcher.GetCaptureGroup(0), TEXT(""));
- }
- }
- bool WwiseProjectInfo::ProcessAttribute(const TCHAR* AttributeName, const TCHAR* AttributeValue)
- {
- if (bInsidePlatformElement)
- {
- if (FCString::Strcmp(AttributeName, TEXT("Name")) == 0)
- {
- CurrentPlatformInfo.Name = AttributeValue;
- }
- else if (FCString::Strcmp(AttributeName, TEXT("ID")) == 0)
- {
- FGuid::ParseExact(AttributeValue, EGuidFormats::DigitsWithHyphensInBraces, CurrentPlatformInfo.ID);
- }
- }
- if (bInsideLanguageElement)
- {
- if (FCString::Strcmp(AttributeName, TEXT("Name")) == 0)
- {
- if (FCString::Strcmp(AttributeValue, TEXT("External")) == 0
- || FCString::Strcmp(AttributeValue, TEXT("Mixed")) == 0
- || FCString::Strcmp(AttributeValue, TEXT("SFX")) == 0)
- {
- bInsideLanguageElement = false;
- }
- else
- {
- if (CurrentLanguageInfo.Name.IsEmpty())
- {
- CurrentLanguageInfo.Name = AttributeValue;
- AK::FNVHash32 hash;
- FTCHARToUTF8 utf8(*CurrentLanguageInfo.Name.ToLower());
- CurrentLanguageInfo.ShortID = hash.Compute(utf8.Get(), utf8.Length());
- }
- }
- }
- else if (FCString::Strcmp(AttributeName, TEXT("ID")) == 0)
- {
- FGuid::ParseExact(AttributeValue, EGuidFormats::DigitsWithHyphensInBraces, CurrentLanguageInfo.ID);
- }
- }
- if (bInsidePropertyElement
- && FCString::Strcmp(AttributeName, TEXT("Name")) == 0
- && FCString::Strcmp(AttributeValue, TEXT("DefaultLanguage")) == 0
- )
- {
- bInsideDefaultLanguage = true;
- }
- if (bInsideDefaultLanguage && FCString::Strcmp(AttributeName, TEXT("Value")) == 0)
- {
- DefaultLanguage = AttributeValue;
- bInsideDefaultLanguage = false;
- }
- return true;
- }
- bool WwiseProjectInfo::ProcessClose(const TCHAR* Element)
- {
- if (bInsidePlatformElement && FCString::Strcmp(Element, TEXT("Platform")) == 0)
- {
- SupportedPlatforms.Add(CurrentPlatformInfo);
- bInsidePlatformElement = false;
- }
- if (bInsideLanguageElement && FCString::Strcmp(Element, TEXT("Language")) == 0)
- {
- SupportedLanguages.Add(CurrentLanguageInfo);
- bInsideLanguageElement = false;
- }
- if (bInsidePropertyElement && FCString::Strcmp(Element, TEXT("Property")) == 0)
- {
- bInsidePropertyElement = false;
- }
- return true;
- }
- bool WwiseProjectInfo::ProcessComment(const TCHAR* Comment)
- {
- return true;
- }
- bool WwiseProjectInfo::ProcessElement(const TCHAR* ElementName, const TCHAR* ElementData, int32 XmlFileLineNumber)
- {
- if (FCString::Strcmp(ElementName, TEXT("Platform")) == 0)
- {
- bInsidePlatformElement = true;
-
- new (&CurrentPlatformInfo) FWwisePlatformInfo();
- }
- else if (FCString::Strcmp(ElementName, TEXT("Language")) == 0)
- {
- bInsideLanguageElement = true;
-
- new (&CurrentLanguageInfo) FWwiseLanguageInfo();
- }
- else if (FCString::Strcmp(ElementName, TEXT("Property")) == 0)
- {
- bInsidePropertyElement = true;
- }
- if (bInsideDefaultLanguage && FCString::Strcmp(ElementName, TEXT("Value")) == 0)
- {
-
- if (DefaultLanguage.IsEmpty())
- {
- DefaultLanguage = ElementData;
- }
- bInsideDefaultLanguage = false;
- }
- return true;
- }
- bool WwiseProjectInfo::ProcessXmlDeclaration(const TCHAR* ElementData, int32 XmlFileLineNumber)
- {
- return true;
- }
- FString WwiseProjectInfo::GetProjectPath() const
- {
- FString ProjectPath;
- if (const UAkSettings* Settings = GetDefault<UAkSettings>())
- {
- ProjectPath = Settings->WwiseProjectPath.FilePath;
- if (FPaths::IsRelative(ProjectPath))
- {
- ProjectPath = FPaths::ConvertRelativePathToFull(FPaths::ProjectDir(), ProjectPath);
- }
- }
- return ProjectPath;
- }
|