Files
UnrealEngine/Engine/Source/Runtime/SignalProcessing/Private/MultiMono.cpp
2025-05-18 13:04:45 +08:00

41 lines
1.3 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "DSP/MultiMono.h"
#include "DSP/FloatArrayMath.h"
namespace Audio
{
void MultiMonoMixUpOrDown(
TArrayView<const float> InSrc, const TArrayView<float> InDst, const int32 NumFrames, TArrayView<const float> MixGains,
const int32 NumSrcChannels, const int32 NumDstChannels)
{
MultiMonoMixUpOrDown(
MakeMultiMonoPointersFromView(InSrc, NumFrames, NumSrcChannels),
MakeMultiMonoPointersFromView(InDst, NumFrames, NumDstChannels),
NumFrames,
MixGains);
}
void MultiMonoMixUpOrDown(TArrayView<const float*> InSrc, TArrayView<float*> InDst, const int32 NumFrames,TArrayView<const float> MixGains)
{
const int32 NumSrcChannels = InSrc.Num();
const int32 NumDstChannels = InDst.Num();
checkSlow(NumFrames > 0);
checkSlow(MixGains.Num() == NumSrcChannels * NumDstChannels);
for (int32 DstCh = 0; DstCh < NumDstChannels; ++DstCh)
{
const TArrayView<float> Dst = MakeArrayView(InDst[DstCh], NumFrames);
FMemory::Memzero(Dst.GetData(), NumFrames * sizeof(float));
for (int32 SrcCh = 0; SrcCh < NumSrcChannels; ++SrcCh)
{
if (const float ChannelGain = MixGains[DstCh + (SrcCh * NumDstChannels)]; !FMath::IsNearlyZero(ChannelGain))
{
const TArrayView<const float> Src = MakeArrayView(InSrc[SrcCh], NumFrames);
ArrayMixIn(Src, Dst, ChannelGain);
}
}
}
}
}