2021-01-27 15:54:01 -04:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
#include "MetasoundTrigger.h"
|
|
|
|
|
|
|
|
|
|
#include "MetasoundDataReference.h"
|
|
|
|
|
#include "MetasoundDataTypeRegistrationMacro.h"
|
|
|
|
|
#include "MetasoundOperatorSettings.h"
|
|
|
|
|
|
2021-03-03 16:57:52 -04:00
|
|
|
|
2021-01-27 15:54:01 -04:00
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|