10#include "Containers/Map.h"
11#include "Containers/Queue.h"
14#include "QuartzQuantizationUtilities.generated.h"
20struct FQuartzClockTickRate;
30 class IQuartzQuantizedCommand;
36 struct FQuartzQuantizedCommandDelegateData;
37 struct FQuartzMetronomeDelegateData;
38 struct FQuartzQueueCommandData;
39 struct FQuartzQuantizedCommandInitInfo;
47 Bar
UMETA(DisplayName =
"Bar",
ToolTip =
"(dependent on time signature)"),
48 Beat
UMETA(DisplayName =
"Beat",
ToolTip =
"(dependent on time signature and Pulse Override)"),
50 ThirtySecondNote
UMETA(DisplayName =
"1/32"),
51 SixteenthNote
UMETA(DisplayName =
"1/16"),
52 EighthNote
UMETA(DisplayName =
"1/8"),
53 QuarterNote
UMETA(DisplayName =
"1/4"),
54 HalfNote
UMETA(DisplayName =
"Half"),
63 SixteenthNoteTriplet
UMETA(DisplayName =
"1/16 (triplet)"),
64 EighthNoteTriplet
UMETA(DisplayName =
"1/8 (triplet)"),
65 QuarterNoteTriplet
UMETA(DisplayName =
"1/4 (triplet)"),
66 HalfNoteTriplet
UMETA(DisplayName =
"1/2 (triplet)"),
68 Tick UMETA(DisplayName =
"On Tick (Smallest Value, same as 1/32)",
ToolTip =
"(same as 1/32)"),
80 HalfNote
UMETA(DisplayName =
"/2"),
81 QuarterNote
UMETA(DisplayName =
"/4"),
82 EighthNote
UMETA(DisplayName =
"/8"),
83 SixteenthNote
UMETA(DisplayName =
"/16"),
84 ThirtySecondNote
UMETA(DisplayName =
"/32"),
98 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category =
"Quantized Audio Clock Time Signature")
102 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category =
"Quantized Audio Clock Time Signature")
117 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category =
"Quantized Audio Clock Time Signature", meta = (ClampMin =
"1", UIMin =
"1"))
121 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category =
"Quantized Audio Clock Time Signature")
125 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category =
"Quantized Audio Clock Time Signature")
146 UPROPERTY(EditAnywhere, BlueprintReadOnly, Category =
"Quantized Audio TimeStamp")
150 UPROPERTY(EditAnywhere, BlueprintReadOnly, Category =
"Quantized Audio TimeStamp")
154 UPROPERTY(EditAnywhere, BlueprintReadOnly, Category =
"Quantized Audio TimeStamp")
158 UPROPERTY(EditAnywhere, BlueprintReadOnly, Category =
"Quantized Audio TimeStamp")
179UENUM(BlueprintType, meta = (DisplayName=
"EQuartz Quantization Reference"))
182 BarRelative UMETA(DisplayName =
"Bar Relative",
ToolTip =
"Will occur on the next occurence of this duration from the start of a bar (i.e. On beat 3)"),
183 TransportRelative UMETA(DisplayName =
"Transport Relative",
ToolTip =
"Will occur on the next multiple of this duration since the clock started ticking (i.e. on the next 4 bar boundary)"),
184 CurrentTimeRelative UMETA(DisplayName =
"Current Time Relative",
ToolTip =
"Will occur on the next multiple of this duration from the current time (i.e. In three beats)"),
193 CommandOnFailedToQueue UMETA(DisplayName =
"Failed To Queue",
ToolTip =
"The command will not execute (i.e. Clock doesn't exist or PlayQuantized failed concurrency)"),
206 PlaySound
UMETA(DisplayName =
"Play Sound",
ToolTip =
"Play a sound on a spample-accurate boundary (taking a voice slot immediately)"),
207 QueueSoundToPlay UMETA(DisplayName =
"Queue Sound To Play",
ToolTip =
"Queue a sound to play when it gets closer to its quantization boundary (avoids stealing a voice slot right away)"),
208 RetriggerSound UMETA(DisplayName =
"Re-trigger Sound",
ToolTip =
"Quantized looping of the target sound (event tells the AudioComponent to play the sound again)"),
210 TransportReset UMETA(DisplayName =
"Transport Reset",
ToolTip =
"Quantized reset of the clocks transport (back to time = 0 on the boundary)"),
211 StartOtherClock
UMETA(DisplayName =
"Start Other Clock",
ToolTip =
"Quantized start of another clock. Useful for sample accurate synchronization of clocks (i.e. to handle time signature changes)"),
212 Notify
UMETA(DisplayName =
"Quantized Notify",
ToolTip =
"Command used only to get delegates for timing information (basically an empty command)"),
218DECLARE_DYNAMIC_MULTICAST_DELEGATE_FiveParams(
FOnQuartzMetronomeEvent,
FName, ClockName,
EQuartzCommandQuantization,
QuantizationType,
int32,
NumBars,
int32, Beat,
float, BeatFraction);
219DECLARE_DYNAMIC_DELEGATE_FiveParams(
FOnQuartzMetronomeEventBP,
FName, ClockName,
EQuartzCommandQuantization,
QuantizationType,
int32,
NumBars,
int32, Beat,
float, BeatFraction);
231 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category =
"Quantized Audio Clock Settings")
236 bool bIgnoreLevelChange{
false };
258 void PushSingleResult(
const double&
InResult);
264 int64 NumEntries{ 0 };
266 float LifetimeAverage{ 0.f };
282 struct FQuartzClockTickRate
303 double GetFramesPerTick()
const {
return FramesPerTick; }
305 double GetMillisecondsPerTick()
const {
return MillisecondsPerTick; }
307 double GetSecondsPerTick()
const {
return SecondsPerTick; }
309 double GetThirtySecondNotesPerMinute()
const {
return ThirtySecondNotesPerMinute; }
311 double GetBeatsPerMinute()
const {
return BeatsPerMinute; }
313 double GetSampleRate()
const {
return SampleRate; }
328 double FramesPerTick{ 1.0 };
329 double MillisecondsPerTick{ 1.0 };
330 double SecondsPerTick{ 1.0 };
331 double ThirtySecondNotesPerMinute{ 1.0 };
332 double BeatsPerMinute{ 0.0 };
333 double SampleRate{ 44100.0 };
335 ENGINE_API void RecalculateDurationsBasedOnFramesPerTick();
340 class FQuartzLatencyTimer
374 int64 JourneyStartCycles;
376 int64 JourneyEndCycles;
380 class FQuartzCrossThreadMessage :
public FQuartzLatencyTimer
389 ENGINE_API double GetResultsMilliseconds()
const;
391 ENGINE_API double GetCurrentTimeMilliseconds()
const;
394 mutable FQuartzLatencyTimer Timer;
409 bool IsSet()
const {
return IsSetAsMilliseconds() || IsSetAsMusicalDuration(); }
413 ENGINE_API bool IsSetAsMusicalDuration()
const;
429 class IQueueCommandListener;
430 class ICommandListener;
431 class IMetronomeEventListener;
437 struct FQuartzGameThreadSubscriber
439 FQuartzGameThreadSubscriber() =
default;
443 FQuartzGameThreadSubscriber(
const Quartz::FQuartzGameThreadCommandQueuePtr&
InQueuePtr)
449 FQuartzGameThreadSubscriber(
const Quartz::FQuartzGameThreadCommandQueuePtr&
InQueuePtr, FQuartzOffset InOffset)
455 void SetOffset(FQuartzOffset InOffset) {
Offset =
MoveTemp(InOffset); }
457 bool HasBeenNotifiedOfAboutToStart()
const {
return bHasBeenNotifiedOfAboutToStart; }
463 ENGINE_API void PushEvent(
const FQuartzQuantizedCommandDelegateData& Data);
464 ENGINE_API void PushEvent(
const FQuartzMetronomeDelegateData& Data);
465 ENGINE_API void PushEvent(
const FQuartzQueueCommandData& Data);
468 operator Quartz::FQuartzGameThreadCommandQueuePtr()
const {
return Queue; }
478 Quartz::FQuartzGameThreadCommandQueuePtr Queue;
479 bool bOffsetConvertedToFrames =
false;
480 bool bHasBeenNotifiedOfAboutToStart =
false;
481 int32 OffsetInAudioFrames = 0;
493 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category =
"Quantized Audio Clock Settings")
497 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category =
"Quantized Audio Clock Settings", meta = (ClampMin =
"1.0"))
500 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category =
"Quantized Audio Clock Settings")
504 UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category =
"Quantized Audio Clock Settings")
505 bool bFireOnClockStart{
true };
508 UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category =
"Quantized Audio Clock Settings")
509 bool bCancelCommandIfClockIsNotRunning{
false };
512 UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category =
"Quantized Audio Clock Settings")
513 bool bResetClockOnQueued{
false };
516 UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category =
"Quantized Audio Clock Settings")
517 bool bResumeClockOnQueued{
false };
647 virtual void FailedToQueueCustom() {}
648 virtual void AboutToStartCustom() {}
650 virtual void OnClockPausedCustom() {}
651 virtual void OnClockStartedCustom() {}
652 virtual void CancelCustom() {}
656 int32 GameThreadDelegateID{ -1 };
#define ensure( InExpression)
Definition AssertionMacros.h:464
@ INDEX_NONE
Definition CoreMiscDefines.h:150
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(DelegateName, Param1Type, Param1Name, Param2Type, Param2Name)
Definition DelegateCombinations.h:62
#define DECLARE_DYNAMIC_MULTICAST_DELEGATE_FiveParams(DelegateName, Param1Type, Param1Name, Param2Type, Param2Name, Param3Type, Param3Name, Param4Type, Param4Name, Param5Type, Param5Name)
Definition DelegateCombinations.h:89
#define DECLARE_DYNAMIC_DELEGATE_FiveParams(DelegateName, Param1Type, Param1Name, Param2Type, Param2Name, Param3Type, Param3Name, Param4Type, Param4Name, Param5Type, Param5Name)
Definition DelegateCombinations.h:88
#define DECLARE_DYNAMIC_DELEGATE_TwoParams(DelegateName, Param1Type, Param1Name, Param2Type, Param2Name)
Definition DelegateCombinations.h:61
#define DECLARE_LOG_CATEGORY_EXTERN(CategoryName, DefaultVerbosity, CompileTimeVerbosity)
Definition LogMacros.h:361
const bool
Definition NetworkReplayStreaming.h:178
#define UPROPERTY(...)
UObject definition macros.
Definition ObjectMacros.h:744
#define GENERATED_BODY(...)
Definition ObjectMacros.h:765
#define UENUM(...)
Definition ObjectMacros.h:749
#define USTRUCT(...)
Definition ObjectMacros.h:746
EQuarztQuantizationReference
Definition QuartzQuantizationUtilities.h:181
EQuartzCommandType
Definition QuartzQuantizationUtilities.h:205
EQuartzCommandQuantization
Definition QuartzQuantizationUtilities.h:46
EQuartzCommandQuantization ENGINE_API TimeSignatureQuantizationToCommandQuantization(const EQuartzTimeSignatureQuantization &BeatType)
Definition QuartzQuantizationUtilities.cpp:14
EQuartzDelegateType
Definition QuartzQuantizationUtilities.h:170
EQuartzCommandDelegateSubType
Definition QuartzQuantizationUtilities.h:192
EQuartzTimeSignatureQuantization
Definition QuartzQuantizationUtilities.h:79
USkinnedMeshComponent float
Definition SkinnedMeshComponent.h:60
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition AudioMixerDevice.h:117
Definition QuartzQuantizationUtilities.h:588
virtual bool RequiresAudioDevice() const
Definition QuartzQuantizationUtilities.h:638
ENGINE_API void OnScheduled(const FQuartzClockTickRate &InTickRate)
Definition QuartzQuantizationUtilities.cpp:519
ENGINE_API IQuartzQuantizedCommand()
virtual bool ShouldDeadlineIgnoresBpmChanges()
Definition QuartzQuantizationUtilities.h:637
ENGINE_API void AboutToStart()
Definition QuartzQuantizationUtilities.cpp:572
virtual ENGINE_API ~IQuartzQuantizedCommand()
ENGINE_API void AddSubscriber(FQuartzGameThreadSubscriber InSubscriber)
Definition QuartzQuantizationUtilities.cpp:484
virtual bool IsClockAltering()
Definition QuartzQuantizationUtilities.h:636
virtual int32 OverrideFramesUntilExec(int32 NumFramesUntilExec)
Definition QuartzQuantizationUtilities.h:633
ENGINE_API void OnFinalCallback(int32 InNumFramesLeft)
Definition QuartzQuantizationUtilities.cpp:594
ENGINE_API void FailedToQueue(FQuartzQuantizedRequestData &InGameThreadData)
Definition QuartzQuantizationUtilities.cpp:548
virtual EQuartzCommandType GetCommandType() const =0
ENGINE_API void Cancel()
Definition QuartzQuantizationUtilities.cpp:629
ENGINE_API void OnQueued(const FQuartzQuantizedCommandInitInfo &InCommandInitInfo)
Definition QuartzQuantizationUtilities.cpp:489
ENGINE_API void OnClockPaused()
Definition QuartzQuantizationUtilities.cpp:615
virtual FName GetCommandName() const =0
ENGINE_API void OnClockStarted()
Definition QuartzQuantizationUtilities.cpp:622
virtual ENGINE_API TSharedPtr< IQuartzQuantizedCommand > GetDeepCopyOfDerivedObject() const
Definition QuartzQuantizationUtilities.cpp:477
Definition QuartzCommandQueue.h:16
Definition NameTypes.h:617
Definition QuartzQuantizationUtilities.h:245
ENGINE_API float GetLifetimeAverageLatency()
Definition QuartzQuantizationUtilities.cpp:100
ENGINE_API void PushLatencyTrackerResult(const double &InResult)
Definition QuartzQuantizationUtilities.cpp:88
ENGINE_API FQuartLatencyTracker()
Definition QuartzQuantizationUtilities.cpp:82
ENGINE_API float GetMaxLatency()
Definition QuartzQuantizationUtilities.cpp:120
ENGINE_API float GetMinLatency()
Definition QuartzQuantizationUtilities.cpp:110
Definition QuartzSubscription.h:49
Definition SharedPointer.h:692
NO_LOGGING.
Definition AudioMixerPlatformAndroid.cpp:53
const FVector Offset(0, 0, 20)
bool operator==(const FCachedAssetKey &A, const FCachedAssetKey &B)
Definition AssetDataMap.h:501
VERSECOMPILER_API bool IsSet()
Definition CommandLine.cpp:63
Definition QuartzQuantizationUtilities.h:662
TSharedPtr< IQuartzQuantizedCommand > CommandPtr
Definition QuartzQuantizationUtilities.h:664
ENGINE_API bool Cancel()
Definition QuartzQuantizationUtilities.cpp:648
ENGINE_API void Reset()
Definition QuartzQuantizationUtilities.cpp:662
FMixerDevice * MixerDevice
Definition QuartzQuantizationUtilities.h:665
FName OwningClockName
Definition QuartzQuantizationUtilities.h:663
Definition QuartzQuantizationUtilities.h:557
TArray< FQuartzGameThreadSubscriber > GameThreadSubscribers
Definition QuartzQuantizationUtilities.h:574
FQuartzQuantizationBoundary QuantizationBoundary
Definition QuartzQuantizationUtilities.h:573
TSharedPtr< IQuartzQuantizedCommand > QuantizedCommandPtr
Definition QuartzQuantizationUtilities.h:572
FName OtherClockName
Definition QuartzQuantizationUtilities.h:571
float SampleRate
Definition QuartzQuantizationUtilities.h:579
int32 SourceID
Definition QuartzQuantizationUtilities.h:580
FName ClockName
Definition QuartzQuantizationUtilities.h:570
int32 GameThreadDelegateID
Definition QuartzQuantizationUtilities.h:575
TSharedPtr< Audio::FQuartzClock > OwningClockPointer
Definition QuartzQuantizationUtilities.h:578
FQuartzQuantizedCommandInitInfo()=default
int32 FrameOverrideAmount
Definition QuartzQuantizationUtilities.h:583
void SetOwningClockPtr(TSharedPtr< Audio::FQuartzClock > InClockPointer)
Definition QuartzQuantizationUtilities.h:563
Definition QuartzQuantizationUtilities.h:543
FName ClockName
Definition QuartzQuantizationUtilities.h:545
TArray< FQuartzGameThreadSubscriber > GameThreadSubscribers
Definition QuartzQuantizationUtilities.h:549
FName OtherClockName
Definition QuartzQuantizationUtilities.h:546
TSharedPtr< IQuartzQuantizedCommand > QuantizedCommandPtr
Definition QuartzQuantizationUtilities.h:547
FQuartzQuantizationBoundary QuantizationBoundary
Definition QuartzQuantizationUtilities.h:548
int32 GameThreadDelegateID
Definition QuartzQuantizationUtilities.h:550
Definition QuartzQuantizationUtilities.h:676
FAudioComponentCommandInfo()
Definition QuartzQuantizationUtilities.h:677
Audio::FQuartzGameThreadSubscriber Subscriber
Definition QuartzQuantizationUtilities.h:687
FQuartzQuantizationBoundary AnticipatoryBoundary
Definition QuartzQuantizationUtilities.h:688
FAudioComponentCommandInfo(Audio::FQuartzGameThreadSubscriber InSubscriber, FQuartzQuantizationBoundary InAnticaptoryBoundary)
Definition QuartzQuantizationUtilities.h:679
uint32 CommandID
Definition QuartzQuantizationUtilities.h:689
Definition QuartzQuantizationUtilities.h:227
Definition QuartzQuantizationUtilities.h:94
Definition QuartzQuantizationUtilities.h:489
TArray< Audio::FQuartzGameThreadSubscriber > GameThreadSubscribers
Definition QuartzQuantizationUtilities.h:520
FQuartzQuantizationBoundary(EQuartzCommandQuantization InQuantization=EQuartzCommandQuantization::None, float InMultiplier=1.0f, EQuarztQuantizationReference InReferencePoint=EQuarztQuantizationReference::BarRelative, bool bInFireOnClockStart=true)
Definition QuartzQuantizationUtilities.h:523
Definition QuartzQuantizationUtilities.h:110
Definition QuartzQuantizationUtilities.h:142
Definition Optional.h:131