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

53 lines
1.2 KiB
C++

#include "PatternInstance.h"
#include "Singleton/PortAudioAPI.h"
#include "Thread/MainThreadEventList.h"
DECLARE_THREAD_MESSAGE(FPortAudioAPI, EndSetting,
FPatternInstance* PatternInstance;
)
{
Args.PatternInstance->EndSetting();
}
void FPatternInstance::RequestDestroy()
{
Owner->RequestDestroyInstance(this);
}
void FPatternInstance::RequestEndSetting()
{
PUSH_THREAD_EVENT(EndSetting, this);
}
void FPatternInstance::SetRange(TRange<AudioFrame> InRange)
{
TimeRange = InRange;
EndSetting();
}
void FPatternInstance::SetMidiPos(MidiTick InPos)
{
Pos.SetTick(InPos);
EndSetting();
}
void FPatternInstance::Process(AudioFrame SequencePos, AudioFrame Length)
{
const AudioFrame& LowerBoundValue = TimeRange.GetLowerBoundValue();
AudioFrame PatternPos = SequencePos - Pos + LowerBoundValue;
const AudioFrame EndPatternPos = PatternPos + Length;
if (TimeRange.Contains(EndPatternPos) || TimeRange.Contains(PatternPos))
{
const double RealLength = FMath::Min<double>(Length, EndPatternPos - TimeRange.GetLowerBoundValue());
PatternPos = FMath::Max<AudioFrame>(AudioFrame(), PatternPos);
Owner->OnPlay.Broadcast(this, PatternPos, RealLength);
Owner->Process(PatternPos, RealLength);
}
}
void FPatternInstance::EndSetting()
{
Owner->Reset();
}