5#include "Containers/Array.h"
19#define CHECK_SAMPLE(VALUE)
20#define CHECK_SAMPLE2(VALUE)
22#define CHECK_SAMPLE(VALUE) Audio::CheckSample(VALUE)
23#define CHECK_SAMPLE2(VALUE) Audio::CheckSample(VALUE)
39 UE_DEPRECATED(5.5,
"Audio code relies on denormals flush to zero floating point mode from now on. Please use FScopedFTZFloatMode instead of this API")
75 return (4.0f *
X) /
UE_PI * (1.0f - FMath::Abs(
X) /
UE_PI);
82 X2 = 0.225f * (X2* FMath::Abs(X2) - X2) + X2;
91 const float AbsX = FMath::Abs(
X);
92 const float Numerator = 16.0f *
X * (
UE_PI -
AbsX);
94 return Numerator / Denominator;
130 LastPhasePerSample = -1;
237 float LastPhasePerSample;
244 if (
X < -3)
return -1.0f;
245 if (
X > 3)
return 1.0f;
253 const float Num =
X * (1.0f - FMath::Abs(
X) /
UE_PI);
261 return 2.0f *
X - 1.0f;
267 return 0.5f *
X + 0.5f;
275 check(NumSamples % 4 == 0);
292 return 440.0f * FMath::Pow(2.0f, (
InMidiNote - 69.0f) / 12.0f);
348 return 69.0f + 12.0f * FMath::LogX(2.0f,
InFrequency / 440.0f);
355 const float TargetFrequency = 440.0f * FMath::Pow(2.0f, ((
float)
TargetMidiNote - 69.0f) / 12.0f);
356 const float PitchScale = TargetFrequency / BaseFrequency;
429 const float Arg = 0.5f * ((1.0f / Q) + FMath::Sqrt(1.0f / (Q*Q) + 4.0f));
430 const float OutBandwidth = 2.0f * FMath::LogX(2.0f, Arg);
439 const float OutQ = FMath::Sqrt(Temp) / (Temp - 1.0f);
482 const int32 NumPoints = Points.
Num();
483 for (
int32 i = 0; i < NumPoints; ++i)
486 for (
int32 j = 0; j < NumPoints; ++j)
523 OneMinusEase = 1.0f - EaseFactor;
524 EaseTimesTarget = TargetValue * EaseFactor;
529 return FMath::Abs(TargetValue - CurrentValue) < Threshold;
547 return CurrentValue = OneMinusEase * CurrentValue + EaseTimesTarget;
556 CurrentValue = OneMinusEase * CurrentValue + EaseTimesTarget;
571 OneMinusEase = 1.0f - EaseFactor;
582 EaseTimesTarget = EaseFactor * TargetValue;
585 CurrentValue = TargetValue;
614 float EaseTimesTarget;
625 , SampleRate(44100.0f)
627 , DefaultDurationTicks(0)
639 return CurrentTick >= DurationTicks;
651 CurrentValue = Start;
662 CurrentValue = DeltaValue * (
float)CurrentTick / (
float)DurationTicks + StartValue;
678 CurrentValue = DeltaValue * (
float)CurrentTick / (
float)DurationTicks + StartValue;
698 DurationTicks = DurationTicks - CurrentTick;
700 DeltaValue =
InValue - CurrentValue;
701 StartValue = CurrentValue;
718 if (DurationTicks == 0)
724 DeltaValue =
InValue - CurrentValue;
725 StartValue = CurrentValue;
735 int32 DefaultDurationTicks;
781 template <
typename SampleType>
789 template <
typename OtherSampleType>
832 template <
typename SampleType,
size_t Alignment = 16>
855 InternalBuffer =
InOther.InternalBuffer;
857 ReadCounter.
Set(
InOther.ReadCounter.GetValue());
858 WriteCounter.
Set(
InOther.WriteCounter.GetValue());
878 InternalBuffer.
Empty();
887 InternalBuffer.
Reset();
927 SampleType* DestBuffer = InternalBuffer.
GetData();
946 SampleType* DestBuffer = InternalBuffer.
GetData();
971 SampleType* DestBuffer = InternalBuffer.
GetData();
977 WriteCounter.
Set((WriteIndex + 1) % Capacity);
990 SampleType* DestBuffer = InternalBuffer.
GetData();
996 WriteCounter.
Set((WriteIndex + 1) % Capacity);
1004 const SampleType* SrcBuffer = InternalBuffer.
GetData();
1024 const SampleType* SrcBuffer = InternalBuffer.
GetData();
1048 SampleType* SrcBuffer = InternalBuffer.
GetData();
1102 SampleType* SrcBuffer = InternalBuffer.
GetData();
1106 ReadCounter.
Set((ReadCounter.
GetValue() + 1) % Capacity);
1115 check(NumSamples < Capacity);
1119 WriteCounter.
Set((ReadCounter.
GetValue() + NumSamples) % Capacity);
1139 if (WriteIndex >= ReadIndex)
1141 return WriteIndex - ReadIndex;
1145 return Capacity - ReadIndex + WriteIndex;
1158 return Capacity -
Num() - 1;
1165 template <
int Base,
int Exp>
1168 static_assert(Exp >= 0,
"TGetPower only supports positive exponents.");
1182 template <
typename SampleType,
uint32 Q = (
sizeof(SampleType) * 8 - 1)>
1187 template <
typename SampleTypeToCheck>
1188 static void CheckValidityOfSampleType()
1191 static_assert(
bIsTypeValid,
"Invalid sample type! TSampleRef only supports float or integer values.");
1194 template <
typename SampleTypeToCheck, u
int32 QToCheck>
1195 static void CheckValidityOfQ()
1199 static_assert(
bIsTypeValid,
"Invalid value for Q! TSampleRef only supports float or int types. For int types, Q must be smaller than the number of bits in the int type.");
1206 static constexpr float MaxValue =
TGetPower<2, (
sizeof(SampleType) * 8 - Q)>
::Value;
1218 template<
typename ReturnType =
float>
1225 return static_cast<ReturnType
>(Sample);
1230 return static_cast<ReturnType
>(Sample) / QFactor;
1235 return static_cast<ReturnType
>(Sample);
1239 template<
typename ReturnType,
uint32 ReturnQ = (
sizeof(SampleType) * 8 - 1)>
1249 return Sample << (Q -
ReturnQ);
1253 return Sample >> (
ReturnQ - Q);
1267 template <
typename OtherSampleType>
1272 if constexpr (std::is_same_v<SampleType, OtherSampleType>)
1280 Sample = ((SampleType)
InSample) / QFactor;
1286 Sample =
static_cast<SampleType
>(
InSample * QFactor);
1296 template <
typename OtherSampleType>
1307 return LHS.Sample * RHS;
1312 SampleType
FloatRHS = ((SampleType)RHS) / QFactor;
1330 return static_cast<SampleType
>(Result * QFactor);
1370 template <
typename SampleType,
uint32 Q = (
sizeof(SampleType) * 8 - 1)>
1375 template <
typename SampleTypeToCheck>
1376 static void CheckValidityOfSampleType()
1379 static_assert(
bIsTypeValid,
"Invalid sample type! TSampleRef only supports float or integer values.");
1382 template <
typename SampleTypeToCheck, u
int32 QToCheck>
1383 static void CheckValidityOfQ()
1387 static_assert(
bIsTypeValid,
"Invalid value for Q! TSampleRef only supports float or int types. For int types, Q must be smaller than the number of bits in the int type.");
1394 static constexpr float MaxValue =
TGetPower<2, (
sizeof(SampleType) * 8 - Q)>
::Value;
1406 template<
typename ReturnType =
float>
1413 return static_cast<ReturnType
>(Sample);
1418 return static_cast<ReturnType
>(Sample) / QFactor;
1423 return static_cast<ReturnType
>(Sample);
1427 template<
typename ReturnType,
uint32 ReturnQ = (
sizeof(SampleType) * 8 - 1)>
1438 return Sample << (Q -
ReturnQ);
1442 return Sample >> (
ReturnQ - Q);
1456 template <
typename OtherSampleType>
1461 if constexpr (std::is_same_v<SampleType, OtherSampleType>)
1469 Sample = ((SampleType)
InSample) / QFactor;
1475 Sample = (SampleType)(
InSample * QFactor);
1485 template <
typename OtherSampleType>
1496 return LHS.Sample * RHS;
1501 SampleType
FloatRHS = ((SampleType)RHS) / QFactor;
1519 return static_cast<SampleType
>(Result * QFactor);
1528 return static_cast<SampleType
>(Result * QFactor);
#define check(expr)
Definition AssertionMacros.h:314
#define checkNoEntry()
Definition AssertionMacros.h:316
#define ensure( InExpression)
Definition AssertionMacros.h:464
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
return true
Definition ExternalRpcRegistry.cpp:601
#define UE_REAL_TO_FLOAT(argument)
Definition LargeWorldCoordinates.h:30
#define UE_LOG(CategoryName, Verbosity, Format,...)
Definition LogMacros.h:270
USkinnedMeshComponent float
Definition SkinnedMeshComponent.h:60
FORCEINLINE VectorRegister4Float VectorSubtract(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:731
FORCEINLINE void VectorSinCos(VectorRegister4Float *RESTRICT VSinAngles, VectorRegister4Float *RESTRICT VCosAngles, const VectorRegister4Float *RESTRICT VAngles)
Definition UnrealMathFPU.h:2109
FORCEINLINE VectorRegister4Float VectorSetFloat1(float F)
Definition UnrealMathFPU.h:518
FORCEINLINE VectorRegister4Float VectorMultiply(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:758
FORCEINLINE VectorRegister4Float VectorLoadFloat1(const float *Ptr)
Definition UnrealMathFPU.h:468
FORCEINLINE void VectorStore(const VectorRegister4Float &Vec, float *Dst)
Definition UnrealMathFPU.h:566
FORCEINLINE VectorRegister4Float VectorAdd(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:704
FORCEINLINE VectorRegister4Float VectorZeroFloat(void)
Definition UnrealMathFPU.h:331
FORCEINLINE VectorRegister4Float VectorLoad(const float *Ptr)
Definition UnrealMathFPU.h:394
#define UE_PI
Definition UnrealMathUtility.h:129
#define UE_BIG_NUMBER
Definition UnrealMathUtility.h:132
#define UE_SMALL_NUMBER
Definition UnrealMathUtility.h:130
#define UE_KINDA_SMALL_NUMBER
Definition UnrealMathUtility.h:131
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTempIfPossible(T &&Obj) noexcept
Definition UnrealTemplate.h:538
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
FRWLock Lock
Definition UnversionedPropertySerialization.cpp:921
bool IsDone() const
Definition Dsp.h:527
void SetEaseFactor(const float InEaseFactor)
Definition Dsp.h:568
float GetNextValue(uint32 NumTicksToJumpAhead)
Definition Dsp.h:552
void operator=(const float &InValue)
Definition Dsp.h:574
FExponentialEase(float InInitValue=0.0f, float InEaseFactor=0.001f, float InThreshold=UE_KINDA_SMALL_NUMBER)
Definition Dsp.h:507
static float GetFactorForTau(float InTau, float InSampleRate)
Definition Dsp.h:591
void SetValue(const float InValue, const bool bIsInit=false)
Definition Dsp.h:579
void Init(float InInitValue, float InEaseFactor=0.001f)
Definition Dsp.h:517
float GetNextValue()
Definition Dsp.h:532
float PeekCurrentValue() const
Definition Dsp.h:563
float GetNextValue(int32 NumTicksToJumpAhead)
Definition Dsp.h:670
void Init(float InSampleRate)
Definition Dsp.h:642
void SetValueInterrupt(const float InValue)
Definition Dsp.h:690
float GetNextValue()
Definition Dsp.h:655
FLinearEase()
Definition Dsp.h:621
bool IsDone() const
Definition Dsp.h:637
~FLinearEase()
Definition Dsp.h:633
void SetValue(const float InValue, float InTimeSec=0.0f)
Definition Dsp.h:705
float PeekCurrentValue() const
Definition Dsp.h:683
void SetValueRange(const float Start, const float End, const float InTimeSec)
Definition Dsp.h:648
void GenerateBuffer(float SampleRate, float ClampedFrequency, float *Buffer, int32 BufferSampleCount)
Definition Dsp.h:145
FSinOsc2DRotation(float InStartingPhaseRadians=0.f)
Definition Dsp.h:128
int32 Peek(SampleType *OutBuffer, uint32 NumSamples) const
Definition Dsp.h:1002
TCircularAudioBuffer()
Definition Dsp.h:843
SampleType Pop()
Definition Dsp.h:1097
int32 Push(TArrayView< const SampleType > InBuffer)
Definition Dsp.h:917
bool Push(const SampleType &InElement)
Definition Dsp.h:963
TCircularAudioBuffer(uint32 InCapacity)
Definition Dsp.h:864
DisjointedArrayView< const SampleType > PopInPlace(uint32 NumSamples)
Definition Dsp.h:1071
bool Push(SampleType &&InElement)
Definition Dsp.h:982
void SetCapacity(uint32 InCapacity)
Definition Dsp.h:881
int32 Push(const SampleType *InBuffer, uint32 NumSamples)
Definition Dsp.h:925
uint32 Remainder() const
Definition Dsp.h:1156
TCircularAudioBuffer & operator=(const TCircularAudioBuffer< SampleType, Alignment > &InOther)
Definition Dsp.h:853
void Reserve(uint32 InMinimumCapacity, bool bRetainExistingSamples)
Definition Dsp.h:896
uint32 GetCapacity() const
Definition Dsp.h:1150
DisjointedArrayView< const SampleType > PeekInPlace(uint32 NumSamples) const
Definition Dsp.h:1022
uint32 Num() const
Definition Dsp.h:1134
void Empty()
Definition Dsp.h:874
int32 Pop(SampleType *OutBuffer, uint32 NumSamples)
Definition Dsp.h:1059
void SetNum(uint32 NumSamples, bool bRetainOldestSamples=false)
Definition Dsp.h:1113
TCircularAudioBuffer(const TCircularAudioBuffer< SampleType, Alignment > &InOther)
Definition Dsp.h:848
int32 PushZeros(uint32 NumSamplesOfZeros)
Definition Dsp.h:944
bool Peek(SampleType &OutElement) const
Definition Dsp.h:1040
void Reset(uint32 InCapacity=0)
Definition Dsp.h:869
int32 Pop(uint32 NumSamples)
Definition Dsp.h:1084
T CurrentParams
Definition Dsp.h:777
void SetParams(const T &InParams)
Definition Dsp.h:750
bool GetParams(T *OutParamsCopy)
Definition Dsp.h:758
void CopyParams(T &OutParamsCopy) const
Definition Dsp.h:770
bool bChanged
Definition Dsp.h:776
TParams()
Definition Dsp.h:745
FCriticalSection CritSect
Definition Dsp.h:778
TSampleRef(SampleType &InSample)
Definition Dsp.h:1399
ReturnType AsFixedPrecisionInt()
Definition Dsp.h:1428
friend SampleType operator*(const TSampleRef< SampleType > &LHS, const OtherSampleType &RHS)
Definition Dsp.h:1486
TSampleRef< SampleType, Q > & operator=(const OtherSampleType InSample)
Definition Dsp.h:1457
ReturnType AsFloat() const
Definition Dsp.h:1407
ReturnType AsFixedPrecisionInt()
Definition Dsp.h:1240
ReturnType AsFloat() const
Definition Dsp.h:1219
friend TSample< SampleType, Q > operator*(const TSample< SampleType, Q > &LHS, const OtherSampleType &RHS)
Definition Dsp.h:1297
TSample< SampleType, Q > & operator=(const OtherSampleType InSample)
Definition Dsp.h:1268
TSample(SampleType &InSample)
Definition Dsp.h:1211
Definition ScopeLock.h:141
Definition ThreadSafeCounter.h:14
int32 GetValue() const
Definition ThreadSafeCounter.h:120
int32 Set(int32 Value)
Definition ThreadSafeCounter.h:99
Definition ArrayView.h:139
UE_FORCEINLINE_HINT constexpr ElementType * GetData() const
Definition ArrayView.h:295
UE_FORCEINLINE_HINT constexpr SizeType Num() const
Definition ArrayView.h:380
UE_REWRITE SizeType Num() const
Definition Array.h:1144
void Reset(SizeType NewSize=0)
Definition Array.h:2246
UE_NODEBUG UE_FORCEINLINE_HINT ElementType * GetData() UE_LIFETIMEBOUND
Definition Array.h:1027
SizeType AddZeroed()
Definition Array.h:2755
void Empty(SizeType Slack=0)
Definition Array.h:2273
NO_LOGGING.
Definition AudioMixerPlatformAndroid.cpp:53
void CheckSample(float InSample, float Threshold=0.001f)
Definition Dsp.h:30
float GetGainFromVelocity(const float InVelocity)
Definition Dsp.h:62
float FastSin2(const float X)
Definition Dsp.h:79
float ConvertToDecibels(const float InLinear, const float InFloor=UE_SMALL_NUMBER)
Definition Dsp.h:50
float UnderflowClamp(const float InValue)
Definition Dsp.h:40
float FastSin(const float X)
Definition Dsp.h:73
void ConvertBipolarBufferToUnipolar(float *InAlignedBuffer, int32 NumSamples)
Definition Dsp.h:272
float LagrangianInterpolation(const TArray< FVector2D > Points, const float Alpha)
Definition Dsp.h:477
float GetBandwidthFromQ(const float InQ)
Definition Dsp.h:425
float FastTanh(float X)
Definition Dsp.h:242
float FastTan(float X)
Definition Dsp.h:251
float FastSin3(const float X)
Definition Dsp.h:89
TArray< float, FAudioBufferAlignedAllocator > FAlignedFloatBuffer
Definition AlignedBuffer.h:22
float GetSemitones(const float InMultiplier)
Definition Dsp.h:372
float GetUnipolar(const float X)
Definition Dsp.h:265
float GetLogFrequencyClamped(const float InValue, const FVector2D &Domain, const FVector2D &Range)
Definition Dsp.h:296
float GetFrequencyFromMidi(const float InMidiNote)
Definition Dsp.h:290
bool QuadraticPeakInterpolation(const float InValues[3], float &OutPeakLoc, float &OutPeakValue)
Definition Dsp.h:450
void GetStereoPan(const float InLinearPan, float &OutLeft, float &OutRight)
Definition Dsp.h:383
float ConvertToLinear(const float InDecibels)
Definition Dsp.h:56
float GetMidiFromFrequency(const float InFrequency)
Definition Dsp.h:346
float GetPitchScaleFromMIDINote(int32 BaseMidiNote, int32 TargetMidiNote)
Definition Dsp.h:352
float GetQFromBandwidth(const float InBandwidth)
Definition Dsp.h:435
void EncodeMidSide(const FAlignedFloatBuffer &InLeftChannel, const FAlignedFloatBuffer &InRightChannel, FAlignedFloatBuffer &OutMidChannel, FAlignedFloatBuffer &OutSideChannel)
Definition Dsp.cpp:9
float GetLinearFrequencyClamped(const float InFrequencyValue, const FVector2D &Domain, const FVector2D &Range)
Definition Dsp.h:321
float GetBipolar(const float X)
Definition Dsp.h:259
void DecodeMidSide(const FAlignedFloatBuffer &InMidChannel, const FAlignedFloatBuffer &InSideChannel, FAlignedFloatBuffer &OutLeftChannel, FAlignedFloatBuffer &OutRightChannel)
Definition Dsp.cpp:37
float GetFrequencyMultiplier(const float InPitchSemitones)
Definition Dsp.h:361
@ false
Definition radaudio_common.h:23
TArrayView< SampleType > SecondBuffer
Definition Dsp.h:823
DisjointedArrayView(TArrayView< SampleType > &&InFirstBuffer, TArrayView< SampleType > &&InSecondBuffer)
Definition Dsp.h:784
DisjointedArrayView< OtherSampleType > SplitOtherToMatch(OtherSampleType *Other, int32 InNum) const
Definition Dsp.h:790
int32 Num() const
Definition Dsp.h:819
int32 FirstNum() const
Definition Dsp.h:817
int32 CopyIntoBuffer(SampleType *InDestination, int32 InNumSamples)
Definition Dsp.h:801
int32 SecondNum() const
Definition Dsp.h:818
TArrayView< SampleType > FirstBuffer
Definition Dsp.h:822
static const int64 Value
Definition Dsp.h:1169
static UE_FORCEINLINE_HINT auto GetMappedRangeValueUnclamped(const UE::Math::TVector2< T > &InputRange, const UE::Math::TVector2< T > &OutputRange, const T2 Value)
Definition UnrealMathUtility.h:1086
static constexpr UE_FORCEINLINE_HINT T Clamp(const T X, const T MinValue, const T MaxValue)
Definition UnrealMathUtility.h:592
static float Log2(float Value)
Definition UnrealMathUtility.h:722
static UE_FORCEINLINE_HINT void * Memzero(void *Dest, SIZE_T Count)
Definition UnrealMemory.h:131
static UE_FORCEINLINE_HINT void * Memcpy(void *Dest, const void *Src, SIZE_T Count)
Definition UnrealMemory.h:160
Definition IsFloatingPoint.h:12
Definition IsIntegral.h:12
Definition NumericLimits.h:41
double FReal
Definition Vector2D.h:42
T Y
Definition Vector2D.h:52
T X
Definition Vector2D.h:49
Definition UnrealMathFPU.h:20