53 lines
1.2 KiB
C++
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();
|
|
}
|