UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
AudioMixerClock.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
12
13#define UE_API AUDIOMIXER_API
14
15namespace Audio
16{
17 // forwards
18 class FMixerDevice;
19 class FQuartzClock;
20 class FMixerSourceManager;
21 class FQuartzClockManager;
22
26
50 {
51 public:
52 // ctor
54 FQuartzClockProxy(const FName& Name) : ClockId(Name){ } // conv ctor from FName
56
57 FName GetClockName() const { return ClockId; }
58
59 UE_API bool IsValid() const;
60 operator bool() const { return IsValid(); }
61
62 bool operator==(const FName& Name) const { return ClockId == Name; }
63
64 UE_API bool DoesClockExist() const;
65
66 UE_API bool IsClockRunning() const;
67
68 UE_API Audio::FQuartzClockTickRate GetTickRate() const;
69
71
73
75
77
78 // returns false if the clock is not valid or has shut down
80
81 // implicit cast to underlying ID (FName)
82 operator const FName&() const { return ClockId; }
83
84 private:
85 FName ClockId;
86
88
89 protected:
91
92 }; // class FQuartzClockProxy
93
94
95
110 class FQuartzClock : public FQuartzClockCommandQueueType::TConsumerBase<Audio::Quartz::IQuartzClock>
111 {
112 public:
113
114 // ctor
116
117 // dtor
118 UE_API virtual ~FQuartzClock() override;
119
120 // Transport Control:
121 // alter the tick rate (take by-value to make sample-rate adjustments in-place)
122 UE_API void ChangeTickRate(FQuartzClockTickRate InNewTickRate, int32 NumFramesLeft = 0);
123
125
126 UE_API virtual void Resume() override;
127
128 UE_API virtual void Pause() override;
129
130 UE_API virtual void Restart(bool bPause = true) override;
131
132 UE_API virtual void Stop(bool CancelPendingEvents) override; // Pause + Restart
133
135
137
138 // (used for StartOtherClock command to handle the sub-tick as the target clock)
140
141 // (used for StartOtherClock command to handle the sub-tick as the target clock)
143
144 UE_API void Shutdown();
145
146 // Getters:
147 UE_API FQuartzClockTickRate GetTickRate();
148
149 UE_API FName GetName() const;
150
151 UE_API bool IgnoresFlush() const;
152
154
155 UE_API bool HasPendingEvents() const;
156
158
159 UE_API bool IsRunning() const;
160
162
164
166
168
170
172
174
176
177 // Metronome Event Subscription:
178 UE_API virtual void SubscribeToTimeDivision(FQuartzGameThreadSubscriber InSubscriber, EQuartzCommandQuantization InQuantizationBoundary) override;
179
180 UE_API virtual void SubscribeToAllTimeDivisions(FQuartzGameThreadSubscriber InSubscriber) override;
181
182 UE_API virtual void UnsubscribeFromTimeDivision(FQuartzGameThreadSubscriber InSubscriber, EQuartzCommandQuantization InQuantizationBoundary) override;
183
184 UE_API virtual void UnsubscribeFromAllTimeDivisions(FQuartzGameThreadSubscriber InSubscriber) override;
185
186 // Quantized Command Management:
189
191
193
194 // low-resolution clock update
195 // (not sample-accurate!, useful when running without an Audio Device)
197
198 // sample accurate clock update
200
201 private:
202 // Contains the pending command and the number of frames it has to wait to fire
203 struct PendingCommand
204 {
205 // ctor
207 : Command(InCommand)
208 , NumFramesUntilExec(InNumFramesUntilExec)
209 {
210 }
211
212 // Quantized Command Object
214
215 // Countdown to execution
216 int32 NumFramesUntilExec{ 0 };
217 }; // struct PendingCommand
218
219 // mutex-protected update at the end of Tick()
220 FCriticalSection CachedClockStateCritSec;
221 void UpdateCachedState();
222
223 // data is cached when an FQuartzClock is ticked
224 struct FQuartzClockState
225 {
226 FQuartzClockTickRate TickRate;
228 float RunTimeInSeconds;
229 float MusicalDurationPhases[static_cast<int32>(EQuartzCommandQuantization::Count)] { 0 };
230 float MusicalDurationPhaseDeltas[static_cast<int32>(EQuartzCommandQuantization::Count)] { 0 };
231 uint64 LastCacheTickCpuCycles64 = 0;
232 uint64 LastCacheTickDeltaCpuCycles64 = 0;
233
234 } CachedClockState;
235
237
239
240 // don't allow default ctor, a clock needs to be ready to be used
241 // by the clock manager / FMixerDevice once constructed
242 FQuartzClock() = delete;
243
244 FQuartzMetronome Metronome;
245
246 FQuartzClockManager* OwningClockManagerPtr{ nullptr };
247
248 FName Name;
249
250 float ThreadLatencyInMilliseconds{ 40.f };
251
252 // Command queue handed out to GameThread objects to queue commands. These get executed at the top of Tick()
253 mutable FQuartzClockCommandQueuePtr PreTickCommands; // (mutable for lazy init in GetQuartzSubscriber())
254
255 // Container of external commands to be executed (TUniquePointer<QuantizedAudioCommand>)
256 TArray<PendingCommand> ClockAlteringPendingCommands;
257 TArray<PendingCommand> PendingCommands;
258
259 FThreadSafeBool bIsRunning{ true };
260
261 bool bIgnoresFlush{ false };
262
263 int32 TickDelayLengthInFrames{ 0 };
264
265 }; // class FQuartzClock
266} // namespace Audio
267
268#undef UE_API
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
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
const bool
Definition NetworkReplayStreaming.h:178
@ Restart
Definition PrecomputedVolumetricLightmapStreaming.cpp:25
@ Stop
Definition PrecomputedVolumetricLightmapStreaming.cpp:26
EQuartzCommandQuantization
Definition QuartzQuantizationUtilities.h:46
#define UE_API
Definition SColorGradingComponentViewer.h:12
@ Multiplier
Definition AudioMixerDevice.h:117
Definition AudioMixerSourceManager.h:192
Definition AudioMixerClockManager.h:18
Definition AudioMixerClock.h:50
FName GetClockName() const
Definition AudioMixerClock.h:57
FQuartzClockProxy()
Definition AudioMixerClock.h:53
TWeakPtr< FQuartzClock, ESPMode::ThreadSafe > ClockWeakPtr
Definition AudioMixerClock.h:90
UE_API bool SendCommandToClock(TFunction< void(FQuartzClock *)> InCommand)
Definition AudioMixerClock.cpp:107
bool operator==(const FName &Name) const
Definition AudioMixerClock.h:62
UE_API bool IsValid() const
Definition AudioMixerClock.cpp:29
UE_API bool IsClockRunning() const
Definition AudioMixerClock.cpp:39
UE_API Audio::FQuartzClockTickRate GetTickRate() const
Definition AudioMixerClock.cpp:73
UE_API float GetBeatProgressPercent(const EQuartzCommandQuantization &QuantizationType) const
Definition AudioMixerClock.cpp:61
UE_API bool DoesClockExist() const
Definition AudioMixerClock.cpp:34
FQuartzClockProxy(const FName &Name)
Definition AudioMixerClock.h:54
UE_API FQuartzTransportTimeStamp GetCurrentClockTimestamp() const
Definition AudioMixerClock.cpp:84
UE_API float GetDurationOfQuantizationTypeInSeconds(const EQuartzCommandQuantization &QuantizationType, float Multiplier) const
Definition AudioMixerClock.cpp:50
UE_API float GetEstimatedClockRunTimeSeconds() const
Definition AudioMixerClock.cpp:95
Definition AudioMixerClock.h:111
UE_API bool CancelQuantizedCommand(TSharedPtr< IQuartzQuantizedCommand > InCommandPtr)
Definition AudioMixerClock.cpp:524
UE_API int32 NumPendingEvents() const
Definition AudioMixerClock.cpp:540
UE_API bool DoesMatchSettings(const FQuartzClockSettings &InClockSettings) const
Definition AudioMixerClock.cpp:422
UE_API void Shutdown()
Definition AudioMixerClock.cpp:264
UE_API bool IsRunning() const
Definition AudioMixerClock.cpp:545
virtual UE_API void SubscribeToAllTimeDivisions(FQuartzGameThreadSubscriber InSubscriber) override
Definition AudioMixerClock.cpp:432
UE_API FQuartzTransportTimeStamp GetCurrentTimestamp()
Definition AudioMixerClock.cpp:592
UE_API void AddToTickDelay(int32 NumFramesOfDelayToAdd)
Definition AudioMixerClock.cpp:699
UE_API FName GetName() const
Definition AudioMixerClock.cpp:674
UE_API float GetEstimatedRunTime()
Definition AudioMixerClock.cpp:598
UE_API void SetSampleRate(float InNewSampleRate)
Definition AudioMixerClock.cpp:404
UE_API bool HasPendingEvents() const
Definition AudioMixerClock.cpp:534
virtual UE_API void Resume() override
Definition AudioMixerClock.cpp:195
UE_API void ChangeTimeSignature(const FQuartzTimeSignature &InNewTimeSignature)
Definition AudioMixerClock.cpp:189
virtual UE_API void Pause() override
Definition AudioMixerClock.cpp:238
virtual UE_API void UnsubscribeFromAllTimeDivisions(FQuartzGameThreadSubscriber InSubscriber) override
Definition AudioMixerClock.cpp:442
UE_API void LowResolutionTick(float InDeltaTimeSeconds)
Definition AudioMixerClock.cpp:280
UE_API FQuartzClockCommandQueueWeakPtr GetCommandQueue() const
Definition AudioMixerClock.cpp:326
UE_API FMixerDevice * GetMixerDevice()
Definition AudioMixerClock.cpp:604
UE_API float GetBeatProgressPercent(const EQuartzCommandQuantization &QuantizationType) const
Definition AudioMixerClock.cpp:576
virtual UE_API void UnsubscribeFromTimeDivision(FQuartzGameThreadSubscriber InSubscriber, EQuartzCommandQuantization InQuantizationBoundary) override
Definition AudioMixerClock.cpp:437
UE_API FMixerSourceManager * GetSourceManager()
Definition AudioMixerClock.cpp:655
UE_API void ResetTransport(const int32 NumFramesToTickBeforeReset=0)
Definition AudioMixerClock.cpp:689
UE_API void ChangeTickRate(FQuartzClockTickRate InNewTickRate, int32 NumFramesLeft=0)
Definition AudioMixerClock.cpp:150
UE_API FQuartzClockTickRate GetTickRate()
Definition AudioMixerClock.cpp:668
UE_API void SetTickDelay(int32 NumFramesOfDelay)
Definition AudioMixerClock.cpp:704
UE_API bool IgnoresFlush() const
Definition AudioMixerClock.cpp:417
UE_API float GetDurationOfQuantizationTypeInSeconds(const EQuartzCommandQuantization &QuantizationType, float Multiplier)
Definition AudioMixerClock.cpp:550
virtual UE_API void SubscribeToTimeDivision(FQuartzGameThreadSubscriber InSubscriber, EQuartzCommandQuantization InQuantizationBoundary) override
Definition AudioMixerClock.cpp:427
virtual UE_API void AddQuantizedCommand(FQuartzQuantizedRequestData &InQuantizedRequestData) override
Definition AudioMixerClock.cpp:615
virtual UE_API ~FQuartzClock() override
Definition AudioMixerClock.cpp:145
UE_API FQuartzClockManager * GetClockManager()
Definition AudioMixerClock.cpp:679
Definition QuartzMetronome.h:19
Definition QuartzCommandQueue.h:16
typename TVisitorPatternBase< Ts... >::template TElementBase< ConsumerInterfaces... > TConsumerBase
Definition QuartzCommandQueue.h:30
Definition NameTypes.h:617
Definition ThreadSafeBool.h:17
Definition Array.h:670
Definition AndroidPlatformMisc.h:14
NO_LOGGING.
Definition AudioMixerPlatformAndroid.cpp:53
Definition QuartzQuantizationUtilities.h:557
Definition QuartzQuantizationUtilities.h:543
Definition QuartzQuantizationUtilities.h:227
Definition QuartzQuantizationUtilities.h:489
Definition QuartzQuantizationUtilities.h:110
Definition QuartzQuantizationUtilities.h:142