Files
UnrealEngine/Engine/Source/Runtime/AudioAnalyzer/Private/AudioAnalyzerSubsystem.cpp
2025-05-18 13:04:45 +08:00

87 lines
1.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "AudioAnalyzerSubsystem.h"
#include "AudioAnalyzerModule.h"
#include "Containers/Ticker.h"
#include "Engine/World.h"
#include "Engine/Engine.h"
#include UE_INLINE_GENERATED_CPP_BY_NAME(AudioAnalyzerSubsystem)
UAudioAnalyzerSubsystem::UAudioAnalyzerSubsystem()
{
}
UAudioAnalyzerSubsystem::~UAudioAnalyzerSubsystem()
{
if (TickerHandle.IsValid())
{
FTSTicker::GetCoreTicker().RemoveTicker(TickerHandle);
TickerHandle.Reset();
}
AudioAnalyzers.Reset();
}
UAudioAnalyzerSubsystem* UAudioAnalyzerSubsystem::Get()
{
if (GEngine)
{
return GEngine->GetEngineSubsystem<UAudioAnalyzerSubsystem>();
}
return nullptr;
}
bool UAudioAnalyzerSubsystem::Tick(float DeltaTime)
{
AUDIO_ANALYSIS_LLM_SCOPE
// Loop through all analyzers and if they're ready to analyze, do it
for (UAudioAnalyzer* Analyzer : AudioAnalyzers)
{
if (Analyzer->IsReadyForAnalysis())
{
if (Analyzer->DoAnalysis())
{
Analyzer->BroadcastResults();
}
}
}
return true;
}
void UAudioAnalyzerSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{
Super::Initialize(Collection);
}
void UAudioAnalyzerSubsystem::Deinitialize()
{
AUDIO_ANALYSIS_LLM_SCOPE
// Release our audio analyzers
AudioAnalyzers.Reset();
}
void UAudioAnalyzerSubsystem::RegisterAudioAnalyzer(UAudioAnalyzer* InAnalyzer)
{
AUDIO_ANALYSIS_LLM_SCOPE
if (!TickerHandle.IsValid())
{
TickerHandle = FTSTicker::GetCoreTicker().AddTicker(FTickerDelegate::CreateUObject(this, &UAudioAnalyzerSubsystem::Tick), 0.0f);
}
AudioAnalyzers.AddUnique(InAnalyzer);
}
void UAudioAnalyzerSubsystem::UnregisterAudioAnalyzer(UAudioAnalyzer* InAnalyzer)
{
AUDIO_ANALYSIS_LLM_SCOPE
AudioAnalyzers.Remove(InAnalyzer);
if (AudioAnalyzers.IsEmpty() && TickerHandle.IsValid())
{
FTSTicker::GetCoreTicker().RemoveTicker(TickerHandle);
TickerHandle.Reset();
}
}