Files
UnrealEngineUWP/Engine/Plugins/Runtime/Metasound/Source/MetasoundFrontend/Private/MetasoundTrigger.cpp
rob gay 6661b718b6 Add Trigger Simulation
- Add ExecutableDataType statics required for updating and ownership of triggers on Receive and Input nodes to avoid triggers spamming when set from boolean literals (Could potentially be useful for AudioBuffer inputs transmission).
- Misc clean-up
#jira UEAU-740
#rb phil.popp
#preflight 60596c28216649000137e147

#ROBOMERGE-SOURCE: CL 15773055 in //UE5/Release-5.0-EarlyAccess/...
#ROBOMERGE-BOT: STARSHIP (Release-5.0-EarlyAccess -> Main) (v783-15756269)

[CL 15785846 by rob gay in ue5-main branch]
2021-03-23 17:55:31 -04:00

121 lines
2.4 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "MetasoundTrigger.h"
#include "MetasoundDataReference.h"
#include "MetasoundDataTypeRegistrationMacro.h"
#include "MetasoundOperatorSettings.h"
namespace Metasound
{
FTrigger::FTrigger(const FOperatorSettings& InSettings, bool bShouldTrigger)
: NumFramesPerBlock(InSettings.GetNumFramesPerBlock())
, SampleRate(InSettings.GetSampleRate())
{
if (bShouldTrigger)
{
TriggerFrame(0);
}
}
FTrigger::FTrigger(const FOperatorSettings& InSettings, int32 InFrameToTrigger)
: NumFramesPerBlock(InSettings.GetNumFramesPerBlock())
, SampleRate(InSettings.GetSampleRate())
{
TriggerFrame(InFrameToTrigger);
}
FTrigger::FTrigger(const FOperatorSettings& InSettings)
: FTrigger(InSettings, false)
{}
void FTrigger::TriggerFrame(int32 InFrameToTrigger)
{
// Insert trigger frame index into sorted triggered frames
TriggeredFrames.Insert(InFrameToTrigger, Algo::LowerBound(TriggeredFrames, InFrameToTrigger));
if (InFrameToTrigger < NumFramesPerBlock)
{
UpdateLastTriggerIndexInBlock();
}
bHasTrigger = true;
}
void FTrigger::AdvanceBlock()
{
Advance(NumFramesPerBlock);
}
void FTrigger::Advance(int32 InNumFrames)
{
if (bHasTrigger)
{
const int32 NumToRemove = Algo::LowerBound(TriggeredFrames, InNumFrames);
if (NumToRemove)
{
TriggeredFrames.RemoveAt(0, NumToRemove, false /* bAllowShrinking */);
}
const int32 Num = TriggeredFrames.Num();
if (Num > 0)
{
for (int32 i = 0; i < Num; i++)
{
TriggeredFrames[i] -= InNumFrames;
}
}
else
{
bHasTrigger = false;
}
UpdateLastTriggerIndexInBlock();
}
}
int32 FTrigger::Num() const
{
return TriggeredFrames.Num();
}
int32 FTrigger::NumTriggeredInBlock() const
{
return LastTriggerIndexInBlock;
}
int32 FTrigger::operator[](int32 InTriggerIndex) const
{
return TriggeredFrames[InTriggerIndex];
}
bool FTrigger::IsTriggered() const
{
return bHasTrigger;
}
bool FTrigger::IsTriggeredInBlock() const
{
return LastTriggerIndexInBlock > 0;
}
FTrigger::operator bool() const
{
return IsTriggeredInBlock();
}
void FTrigger::Reset()
{
TriggeredFrames.Reset();
LastTriggerIndexInBlock = 0;
bHasTrigger = false;
}
void FTrigger::UpdateLastTriggerIndexInBlock()
{
LastTriggerIndexInBlock = Algo::LowerBound(TriggeredFrames, NumFramesPerBlock);
}
}