AronaSlate/Source/AronaCore/Mixer/MixerTrack.cpp
2024-01-25 11:21:15 +08:00

123 lines
2.9 KiB
C++

#include "MixerTrack.h"
#include "Singleton/MixerList.h"
#include "Singleton/PortAudioAPI.h"
#include "Singleton/PluginHostList.h"
#include "RemoveIf.h"
#include "Thread/MainThreadEventList.h"
#include "PluginHost/PluginHost.h"
#include "Thread/ThreadMessage.h"
DEFINE_LOG_CATEGORY(LogMixerTrack);
DECLARE_THREAD_MESSAGE(FMainThreadEventList, BroadcastAddEffectToTrack,
FMixerTrack* Track;
FPluginHost* Effect;
)
{
FMixerList::Get().OnMixerTrackEffectAdded.Broadcast(Args.Track, Args.Effect);
}
DECLARE_THREAD_MESSAGE(FMainThreadEventList, BroadcastRemoveEffectFromTrack,
FMixerTrack* Track;
FPluginHost* Effect;
)
{
FMixerList::Get().OnMixerTrackEffectRemoved.Broadcast(Args.Track, Args.Effect);
}
DECLARE_THREAD_MESSAGE(FPortAudioAPI, AddEffectToTrack,
FMixerTrack* Track;
FPluginHost* Effect;
)
{
Args.Effect->ChannelInterface->SetInputChannel(Args.Track->ChannelInterface->OutputChannelNodes);
Args.Effect->ChannelInterface->SetOutputChannel(Args.Track->ChannelInterface->OutputChannelNodes);
Args.Track->AddEffectInternal(Args.Effect);
}
DECLARE_THREAD_MESSAGE(FPortAudioAPI, RemoveEffectFromTrack,
FMixerTrack* Track;
FPluginHost* Effect;
)
{
Args.Track->Effects.RemoveSingle(Args.Effect);
PUSH_THREAD_EVENT(BroadcastRemoveEffectFromTrack, Args.Track, Args.Effect);
// Args.Effect->Delete();
}
FMixerTrack::~FMixerTrack()
{
for (auto Effect : Effects)
{
FMixerList::Get().OnMixerTrackEffectRemoved.Broadcast(this, Effect);
FPluginHostList::Get().RemoveSingle(Effect);
delete Effect;
}
delete ChannelInterface;
}
void FMixerTrack::Init()
{
const int32 OutputChannelCount = FPortAudioAPI::Get().GetOutputChannelCount();
Buffer.Resize(OutputChannelCount, FPortAudioAPI::Get().BlockSize);
ChannelInterface = new FMixerChannelInterface(this);
}
void FMixerTrack::AddEffect(FPluginHost* Effect)
{
Effect->OwnerTracks.Add(this);
PUSH_THREAD_EVENT(AddEffectToTrack, this, Effect);
}
void FMixerTrack::RemoveEffect(FPluginHost* Effect)
{
PUSH_THREAD_EVENT(RemoveEffectFromTrack, this, Effect);
}
void FMixerTrack::RemoveChild(FMixerTrack* Child)
{
const int32 NewSize = Algo::RemoveIf(Children, [&](FMixerTrackLink& Link) { return Link.Track == Child; });
Children.SetNum(NewSize);
}
void FMixerTrack::Process(int32 NumSamples)
{
for (FPluginHost* Effect : Effects)
Effect->Process(NumSamples);
Buffer.Multiple(Gain);
// Buffer.CalculatePeak();
}
void FMixerTrack::AddEffectInternal(FPluginHost* Effect)
{
Effects.Add(Effect);
PUSH_THREAD_EVENT(BroadcastAddEffectToTrack, this, Effect);
}
FDummyMixerTrack::~FDummyMixerTrack()
{
UE_LOG(LogMixerTrack, Log, TEXT("FDummyMixerTrack Destruyed: %s"), *GetName());
}
FInstrumentMixerTrack::~FInstrumentMixerTrack()
{
Host = nullptr;
UE_LOG(LogMixerTrack, Log, TEXT("FInstrumentMixerTrack Destruyed: %s"), *GetName());
}
void FInstrumentMixerTrack::Rename(FString InStr)
{
if (Host)
Host->Name = *InStr;
}
FString FInstrumentMixerTrack::GetName() const
{
if (Host)
return Host->Name;
return "";
}