UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
QuartzMetronome.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Containers/Array.h"
6#include "HAL/Platform.h"
9#include "UObject/NameTypes.h"
10
12
13namespace Audio
14{
15 using MetronomeCommandQueuePtr = Quartz::FQuartzGameThreadCommandQueuePtr; // todo: rename, "GameThread is not accurate"
16
17 // Class to track the passage of musical time, and allow subscribers to be notified when these musical events take place
19 {
20 public:
21 // ctor
24
25 // dtor
27
28 // Transport Control:
30
31 void SetTickRate(FQuartzClockTickRate InNewTickRate, int32 NumFramesLeft = 0);
32
34
36
37 void ResetTransport();
38
39 // Getters
40 const FQuartzClockTickRate& GetTickRate() const { return CurrentTickRate; }
41
43
44 const FQuartzTimeSignature & GetTimeSignature() const { return CurrentTimeSignature; }
45
46 FQuartzTransportTimeStamp GetTimeStamp() const { return CurrentTimeStamp; }
47
48 double GetTimeSinceStart() const { return TimeSinceStart; }
49
50 uint64 GetLastTickCpuCycles64() const { return LastTickCpuCycles64; }
51
52 void CalculateDurationPhases(float (&OutPhases)[static_cast<int32>(EQuartzCommandQuantization::Count)]) const;
53
54 // Event Subscription
56
58
60
62
63
64 private:
65
66 // Helpers:
67 void RecalculateDurations();
68
69 void FireEvents();
70
71 float CountNumSubdivisionsPerBar(EQuartzCommandQuantization InSubdivision) const;
72
73 float CountNumSubdivisionsSinceBarStart(EQuartzCommandQuantization InSubdivision) const;
74
75 float CountNumSubdivisionsSinceStart(EQuartzCommandQuantization InSubdivision) const;
76
77 uint64 LastTickCpuCycles64{ 0 };
78
79 int32 ListenerFlags{ 0 };
80
81 FQuartzTransportTimeStamp CurrentTimeStamp;
82
83 FQuartzTimeSignature CurrentTimeSignature;
84
85 FQuartzClockTickRate CurrentTickRate;
86
87 TArray<MetronomeCommandQueuePtr> MetronomeSubscriptionMatrix[static_cast<int32>(EQuartzCommandQuantization::Count)];
88
89 // wrapper around our array so it can be indexed into by different Enums that represent musical time
90 struct FFramesInTimeValue
91 {
92 void Reset();
93
94 double& operator[](EQuartzCommandQuantization InTimeValue);
95 const double& operator[](EQuartzCommandQuantization InTimeValue) const;
96 double& operator[](int32 Index);
97 const double& operator[](int32 Index) const;
98
99 double FramesInTimeValueInternal[static_cast<int32>(EQuartzCommandQuantization::Count)]{ 0.0 };
100 };
101
102 struct FMetronomeEventEntry
103 {
104 TArray<int32> EventFrames;
105 void Reset();
106 };
107
108 struct FPendingMetronomeEvents
109 {
111 void Reset();
112 bool HasPendingEvent(const EQuartzCommandQuantization InDuration) const;
113
114 FMetronomeEventEntry CurrentMetronomeEvents[static_cast<int32>(EQuartzCommandQuantization::Count)];
115 } PendingMetronomeEvents;
116
117 // array of lengths of musical durations (in audio frames)
118 FFramesInTimeValue MusicalDurationsInFrames;
119
120 // array of the number of audio frames left until the respective musical duration
121 FFramesInTimeValue FramesLeftInMusicalDuration;
122
123 // optional array of pulse duration overrides (for odd meters)
124 TArray<double> PulseDurations;
125
126 // the index of the active pulse duration override
127 int32 PulseDurationIndex{ -1 };
128
129 int32 LastFramesOfLatency{ 0 };
130
131 //Keeps track of time in seconds since the Clock was last reset
132 double TimeSinceStart;
133
134 FName ClockName;
135
136 }; // class QuartzMetronome
137} // namespace Audio
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
EQuartzCommandQuantization
Definition QuartzQuantizationUtilities.h:46
Definition QuartzMetronome.h:19
const FQuartzClockTickRate & GetTickRate() const
Definition QuartzMetronome.h:40
void ResetTransport()
Definition QuartzMetronome.cpp:399
void SubscribeToAllTimeDivisions(MetronomeCommandQueuePtr InListenerQueue)
Definition QuartzMetronome.cpp:363
double GetFramesUntilBoundary(FQuartzQuantizationBoundary InQuantizationBoundary) const
Definition QuartzMetronome.cpp:130
const FQuartzTimeSignature & GetTimeSignature() const
Definition QuartzMetronome.h:44
void SetTickRate(FQuartzClockTickRate InNewTickRate, int32 NumFramesLeft=0)
Definition QuartzMetronome.cpp:95
void SetTimeSignature(const FQuartzTimeSignature &InNewTimeSignature)
Definition QuartzMetronome.cpp:124
FQuartzTransportTimeStamp GetTimeStamp() const
Definition QuartzMetronome.h:46
~FQuartzMetronome()
Definition QuartzMetronome.cpp:20
double GetTimeSinceStart() const
Definition QuartzMetronome.h:48
void SetSampleRate(float InNewSampleRate)
Definition QuartzMetronome.cpp:118
void CalculateDurationPhases(float(&OutPhases)[static_cast< int32 >(EQuartzCommandQuantization::Count)]) const
Definition QuartzMetronome.cpp:349
void UnsubscribeFromAllTimeDivisions(MetronomeCommandQueuePtr InListenerQueue)
Definition QuartzMetronome.cpp:383
void SubscribeToTimeDivision(MetronomeCommandQueuePtr InListenerQueue, EQuartzCommandQuantization InQuantizationBoundary)
Definition QuartzMetronome.cpp:357
uint64 GetLastTickCpuCycles64() const
Definition QuartzMetronome.h:50
void UnsubscribeFromTimeDivision(MetronomeCommandQueuePtr InListenerQueue, EQuartzCommandQuantization InQuantizationBoundary)
Definition QuartzMetronome.cpp:373
Definition NameTypes.h:617
Definition QuartzSubscription.h:49
Definition Array.h:670
NO_LOGGING.
Definition AudioMixerPlatformAndroid.cpp:53
U16 Index
Definition radfft.cpp:71
Definition QuartzQuantizationUtilities.h:489
Definition QuartzQuantizationUtilities.h:110
Definition QuartzQuantizationUtilities.h:142