#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 ""; }