很早之前的修改,我也忘了改什么了

This commit is contained in:
2024-07-08 01:19:49 +08:00
parent 55d6cdaade
commit 77e386c0e5
28 changed files with 5558 additions and 96 deletions

View File

@@ -4,35 +4,65 @@
#include "UI/Widget/Thumbnail.h"
#include "UI/Widget/WaveformViewer.h"
FSamplePatternInstanceWaveformHandle::FSamplePatternInstanceWaveformHandle(SSamplePatternInstance* InPatternInstance):
FSamplePatternInstanceWaveformHandle::FSamplePatternInstanceWaveformHandle(TSharedRef<SSamplePatternInstance> InPatternInstance):
PatternInstanceWidget(InPatternInstance)
{
}
TArrayView<const FSamplePeak> FSamplePatternInstanceWaveformHandle::GetWaveform(int32 SizeX)
{
FSamplePatternInstance* Instance = (FSamplePatternInstance*)PatternInstanceWidget->GetPatternInstance();
TRange<AudioFrame> FrameViewRange = PatternInstanceWidget->GetFrameViewRange();
if (!PatternInstanceWidget.IsValid())
return TArrayView<const FSamplePeak>();
const FSamplePatternInstance* Instance = (FSamplePatternInstance*)PatternInstanceWidget.Pin()->GetPatternInstance();
const FSampler* Sampler = Instance->GetInstanceOwner()->GetSampler();
const TRange<AudioFrame>& TimeRange = Instance->TimeRange;
if (!RenderData)
{
RenderData = new FWaveform(7, 256 * 128);
RenderData->OnPostUpdatePeak.AddLambda([this]() { OnRequestUpdate.Broadcast(); });
RenderData->UpdatePeak(Sampler->GetSampleBuffer());
const float MemSize = RenderData->GetMemSize();
UE_LOG(LogTemp, Warning, TEXT("Waveform MemSize: %f MB"), MemSize / 1024 / 1024);
}
LastRenderRange = GetRenderRange();
return RenderData->GetPeakFromRange(0, SizeX, LastRenderRange.GetLowerBoundValue(), LastRenderRange.GetUpperBoundValue());
}
bool FSamplePatternInstanceWaveformHandle::NeedUpdate() const
{
const TRange<AudioFrame>& RenderRange = GetRenderRange();
const bool Lower = FMath::IsNearlyEqual(LastRenderRange.GetLowerBoundValue(), RenderRange.GetLowerBoundValue());
const bool Upper = FMath::IsNearlyEqual(LastRenderRange.GetUpperBoundValue(), RenderRange.GetUpperBoundValue());
return !(Lower && Upper);
}
TRange<AudioFrame> FSamplePatternInstanceWaveformHandle::GetRenderRange() const
{
if (!PatternInstanceWidget.IsValid())
return TRange<AudioFrame>(0, 0);
const TSharedPtr<SSamplePatternInstance> SamplePatternInstance = PatternInstanceWidget.Pin();
FSamplePatternInstance* Instance = static_cast<FSamplePatternInstance*>(SamplePatternInstance->GetPatternInstance());
const TRange<AudioFrame>& TimeRange = Instance->TimeRange;
TRange<AudioFrame> FrameViewRange = SamplePatternInstance->GetFrameViewRange();
const AudioFrame InstancePos = Instance->GetMidiPos();
FrameViewRange = TRange<AudioFrame>(FrameViewRange.GetLowerBoundValue() - InstancePos, FrameViewRange.GetUpperBoundValue() - InstancePos);
const AudioFrame BeginFrame = FMath::Max(TimeRange.GetLowerBoundValue(), FrameViewRange.GetLowerBoundValue());
const AudioFrame EndFrame = FMath::Min(TimeRange.GetUpperBoundValue(), FrameViewRange.GetUpperBoundValue());
return RenderData->GetPeakFromRange(0, SizeX, BeginFrame, EndFrame);
return TRange<AudioFrame>(BeginFrame, EndFrame);
}
SSamplePatternInstance::SSamplePatternInstance()
{
WaveformHandle = MakeShared<FSamplePatternInstanceWaveformHandle>(this);
}
void SSamplePatternInstance::Construct(const FArguments& InArgs)
{
WaveformHandle = MakeShared<FSamplePatternInstanceWaveformHandle>(SharedThis(this));
WaveformHandle->OnRequestUpdate.AddLambda([this]()
{
Invalidate(EInvalidateWidgetReason::Paint);
});
SPatternInstance::Construct(InArgs);
}
TSharedRef<SWidget> SSamplePatternInstance::GetViewWidget()
@@ -43,6 +73,8 @@ TSharedRef<SWidget> SSamplePatternInstance::GetViewWidget()
void SSamplePatternInstance::RequestUpdate()
{
if (WaveformHandle.IsValid() && WaveformHandle->NeedUpdate())
Invalidate(EInvalidateWidgetReason::Paint);
}
FReply SSamplePatternInstance::OpenPatternMenu()