123 lines
2.9 KiB
C++
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 "";
|
|
}
|