#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 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(Length, EndPatternPos - TimeRange.GetLowerBoundValue()); PatternPos = FMath::Max(AudioFrame(), PatternPos); Owner->OnPlay.Broadcast(this, PatternPos, RealLength); Owner->Process(PatternPos, RealLength); } } void FPatternInstance::EndSetting() { Owner->Reset(); }