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

34 lines
1.2 KiB
C++

#include "SamplePatternInstance.h"
#include "SamplePattern.h"
#include "Singleton/MidiSequencer.h"
#include "PluginHost/Sampler.h"
FSamplePatternInstance::FSamplePatternInstance(FSamplePattern* InOwner, int32 TrackIndex, AudioFrame InSamplePos,
TRange<AudioFrame> InSampleRange) : FPatternInstance(InOwner, TrackIndex, InSamplePos, InSampleRange)
{
}
void FSamplePatternInstance::Process(AudioFrame InFramePos, AudioFrame FrameNum)
{
const FSamplePattern* SamplePattern = GetInstanceOwner();
FSampler* Sampler = SamplePattern->GetSampler();
const AudioFrame EndSamplePos = InFramePos + FrameNum;
if (EndSamplePos < Pos || InFramePos > Pos + TimeRange.Size<AudioFrame>())
return;
int64 PatternPos = (int64)InFramePos - Pos;
int64 PatternEnd = PatternPos + FrameNum;
if (PatternPos < 0)
{
PatternPos = 0;
}
PatternEnd = FMath::Min<uint64>(PatternEnd, TimeRange.GetUpperBoundValue());
Sampler->IncomingOffset = FMath::Min<int32>(0, InFramePos - Pos) * -1;
Sampler->IncomingRange.SetLowerBoundValue(PatternPos + TimeRange.GetLowerBoundValue());
Sampler->IncomingRange.SetUpperBoundValue(PatternEnd + TimeRange.GetLowerBoundValue());
}