Lost_Edge/Plugins/FMODStudio/Source/FMODAudioLink/Private/FMODAudioLinkSettings.cpp

150 lines
5.0 KiB (Stored with Git LFS)
C++

// Copyright (c), Firelight Technologies Pty, Ltd. 2024-2024.
#include "FMODAudioLinkSettings.h"
#include "FMODAudioLinkFactory.h"
#include "FMODAudioLinkLog.h"
#include "FMODStudioModule.h"
#include "FMODEvent.h"
#include "fmod_studio.hpp"
#include "FMODSettings.h"
#include "Engine/StreamableManager.h"
#include "Engine/AssetManager.h"
#include "Async/Async.h"
FFMODAudioLinkSettingsProxy::FFMODAudioLinkSettingsProxy(const UFMODAudioLinkSettings& InSettings)
{
Update(InSettings);
}
void FFMODAudioLinkSettingsProxy::Update(const UFMODAudioLinkSettings& InSettings)
{
InSettings.RequestLoadLinkEvent();
ReceivingBufferSizeInFrames = InSettings.GetReceivingBufferSizeInFrames();
ProducerToConsumerBufferRatio = InSettings.ProducerToConsumerBufferRatio;
InitialSilenceFillRatio = InSettings.InitialSilenceFillRatio;
FMODLinkEvent = InSettings.LinkEvent;
}
bool FFMODAudioLinkSettingsProxy::IsEventDataLoaded() const
{
return bIsEventDataLoaded;
}
void FFMODAudioLinkSettingsProxy::RegisterCallback(const TFunction<void()>& InCallback, FDelegateHandle& OutHandle)
{
FScopeLock Lock(&CS);
OutHandle = OnEventLoadedDelegate.Add(FSimpleMulticastDelegate::FDelegate::CreateLambda(InCallback));
}
bool FFMODAudioLinkSettingsProxy::UnRegisterCallback(const FDelegateHandle& InDelegate)
{
FScopeLock Lock(&CS);
return OnEventLoadedDelegate.Remove(InDelegate);
}
void FFMODAudioLinkSettingsProxy::NotifyEventDataLoaded()
{
FScopeLock Lock(&CS);
bIsEventDataLoaded = true;
OnEventLoadedDelegate.Broadcast();
}
#if WITH_EDITOR
void FFMODAudioLinkSettingsProxy::RefreshFromSettings(UAudioLinkSettingsAbstract* InSettings, FPropertyChangedEvent& InPropertyChangedEvent)
{
UE_LOG(LogFMODAudioLink, VeryVerbose, TEXT("FFMODAudioLinkSettingsProxy::RefreshFromSettings."));
Update(*CastChecked<UFMODAudioLinkSettings>(InSettings));
}
#endif //WITH_EDITOR
void UFMODAudioLinkSettings::PostLoad()
{
RequestLoadLinkEvent();
Super::PostLoad();
}
void UFMODAudioLinkSettings::RequestLoadLinkEvent() const
{
if (bLoadRequested)
{
return;
}
bLoadRequested = true;
const UFMODSettings& Settings = *GetDefault<UFMODSettings>();
if (Settings.bFMODAudioLinkEnabled)
{
AsyncTask(ENamedThreads::GameThread, [WeakThis = MakeWeakObjectPtr(const_cast<UFMODAudioLinkSettings*>(this))]()
{
if (WeakThis.IsValid())
{
FStreamableManager& StreamableManager = UAssetManager::GetStreamableManager();
FStreamableDelegate Delegate = FStreamableDelegate::CreateUObject(WeakThis.Get(), &UFMODAudioLinkSettings::OnLoadCompleteCallback);
WeakThis->LoadingHandle = StreamableManager.RequestAsyncLoad(WeakThis->LinkEvent.ToSoftObjectPath(), Delegate, FStreamableManager::AsyncLoadHighPriority,
/* Managed active handle */ true);
UE_LOG(LogFMODAudioLink, VeryVerbose, TEXT("FFMODAudioLinkSettings::RequestLoadLinkEvent: Async Loading %s."), *WeakThis->LinkEvent.ToSoftObjectPath().ToString());
}
});
}
}
void UFMODAudioLinkSettings::OnLoadCompleteCallback()
{
TArray<UObject*> LoadedAssets;
LoadingHandle->GetLoadedAssets(LoadedAssets);
if (LoadedAssets.Num() > 0 && IsValid(LoadedAssets[0]))
{
LinkEventResolved = CastChecked<UFMODEvent>(LoadedAssets[0]);
if (IsValid(LinkEventResolved))
{
LinkEventResolved->AddToRoot();
}
else
{
UE_LOG(LogFMODAudioLink, Error, TEXT("FFMODAudioLinkSettings::OnLoadCompleteCallback: Unable to resolve Link Event."));
}
}
GetCastProxy<FFMODAudioLinkSettingsProxy>()->NotifyEventDataLoaded();
LoadingHandle.Reset();
}
void UFMODAudioLinkSettings::FinishDestroy()
{
if (IsValid(LinkEventResolved))
{
LinkEventResolved->RemoveFromRoot();
}
Super::FinishDestroy();
}
int32 UFMODAudioLinkSettings::GetReceivingBufferSizeInFrames() const
{
if (IFMODStudioModule::IsAvailable())
{
FMOD::System* CoreSystem;
FMOD::Studio::System* StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Max);
if (StudioSystem)
{
StudioSystem->getCoreSystem(&CoreSystem);
if (CoreSystem)
{
unsigned int bufferLength = 0;
CoreSystem->getDSPBufferSize(&bufferLength, 0);
return bufferLength;
}
}
}
static const int32 SensibleDefaultSize = 512;
UE_LOG(LogFMODAudioLink, Warning, TEXT("FMODAudioLinkSettings: Failed to get FMOD settings for buffer size, defaulting to '%d'"), SensibleDefaultSize);
return SensibleDefaultSize;
}
FName UFMODAudioLinkSettings::GetFactoryName() const
{
return FFMODAudioLinkFactory::GetFactoryNameStatic();
}