UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
AudioMixerSubmixEffectDynamicsProcessor.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include "AudioDevice.h"
8#include "Misc/ScopeLock.h"
10#include "Sound/SoundSubmix.h"
12#include "Stats/Stats.h"
13
14#include "AudioMixerSubmixEffectDynamicsProcessor.generated.h"
15
16// The time it takes to process the master dynamics.
18
19namespace Audio
20{
21 // Forward Declarations
22 class FMixerDevice;
23}
24
25UENUM(BlueprintType)
35
36UENUM(BlueprintType)
44
45UENUM(BlueprintType)
53
54UENUM(BlueprintType)
56{
57 // Defaults to use local submix (input) as key
58 Default = 0,
59
60 // Uses audio bus as key
62
63 // Uses external submix as key
64 Submix,
65
67};
68
70{
72 int32 NumChannels = 0;
73 uint32 ObjectId = INDEX_NONE;
74
75 mutable FCriticalSection MutateSourceCritSection;
76
77public:
79
80 void Reset()
81 {
82 Patch.Reset();
83
84 {
85 const FScopeLock ScopeLock(&MutateSourceCritSection);
86 NumChannels = 0;
89 }
90 }
91
93 {
94 const FScopeLock ScopeLock(&MutateSourceCritSection);
95 return ObjectId;
96 }
97
99 {
100 const FScopeLock ScopeLock(&MutateSourceCritSection);
101 return NumChannels;
102 }
103
105 {
106 const FScopeLock ScopeLock(&MutateSourceCritSection);
107 return Type;
108 }
109
111 {
112 const FScopeLock ScopeLock(&MutateSourceCritSection);
113 NumChannels = InNumChannels;
114 }
115
117 {
118 bool bResetPatch = false;
119
120 {
121 const FScopeLock ScopeLock(&MutateSourceCritSection);
122 if (Type != InType || ObjectId != InObjectId || NumChannels != InNumChannels)
123 {
124 Type = InType;
126 NumChannels = InNumChannels;
127
128 bResetPatch = true;
129 }
130 }
131
132 if (bResetPatch)
133 {
134 Patch.Reset();
135 }
136 }
137};
138
139USTRUCT(BlueprintType)
141{
143
144 // Whether or not filter is enabled
145 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Filter, meta = (DisplayName = "Enabled"))
146 uint8 bEnabled : 1;
147
148 // The cutoff frequency of the HPF applied to key signal
149 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Filter, meta = (DisplayName = "Cutoff (Hz)", EditCondition = "bEnabled", ClampMin = "20.0", ClampMax = "20000.0", UIMin = "20.0", UIMax = "20000.0"))
150 float Cutoff;
151
152 // The gain of the filter shelf applied to the key signal
153 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Filter, meta = (DisplayName = "Gain (dB)", EditCondition = "bEnabled", ClampMin = "-60.0", ClampMax = "6.0", UIMin = "-60.0", UIMax = "6.0"))
154 float GainDb;
155
157 : bEnabled(false)
158 , Cutoff(20.0f)
159 , GainDb(0.0f)
160 {
161 }
162};
163
164// Submix dynamics processor settings
165USTRUCT(BlueprintType)
167{
169
170 // Type of processor to apply
171 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = General, meta = (DisplayName = "Type"))
173
174 // Mode of peak detection used on input key signal
175 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Dynamics, meta = (EditCondition = "!bBypass"))
177
178 // Mode of peak detection if key signal is multi-channel
179 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Dynamics, meta = (EditCondition = "!bBypass"))
181
182 // The input gain of the dynamics processor
183 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = General, meta = (DisplayName = "Input Gain (dB)", UIMin = "-12.0", UIMax = "20.0", EditCondition = "!bBypass"))
184 float InputGainDb = 0.0f;
185
186 // The threshold at which to perform a dynamics processing operation
187 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Dynamics, meta = (DisplayName = "Threshold (dB)", ClampMin = "-60.0", ClampMax = "0.0", UIMin = "-60.0", UIMax = "0.0", EditCondition = "!bBypass"))
188 float ThresholdDb = -6.0f;
189
190 // The dynamics processor ratio used for compression/expansion
191 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Dynamics, meta = (
192 EditCondition = "!bBypass && DynamicsProcessorType == ESubmixEffectDynamicsProcessorType::Compressor || DynamicsProcessorType == ESubmixEffectDynamicsProcessorType::Expander || DynamicsProcessorType == ESubmixEffectDynamicsProcessorType::UpwardsCompressor",
193 ClampMin = "1.0", ClampMax = "20.0", UIMin = "1.0", UIMax = "20.0"))
194 float Ratio = 1.5f;
195
196 // The knee bandwidth of the processor to use
197 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Dynamics, meta = (DisplayName = "Knee (dB)", ClampMin = "0.0", ClampMax = "20.0", UIMin = "0.0", UIMax = "20.0", EditCondition = "!bBypass"))
198 float KneeBandwidthDb = 10.0f;
199
200 // The amount of time to look ahead of the current audio (Allows for transients to be included in dynamics processing)
201 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Response, meta = (DisplayName = "Look Ahead (ms)", ClampMin = "0.0", ClampMax = "50.0", UIMin = "0.0", UIMax = "50.0", EditCondition = "!bBypass"))
202 float LookAheadMsec = 3.0f;
203
204 // The amount of time to ramp into any dynamics processing effect
205 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Response, meta = (DisplayName = "AttackTime (ms)", ClampMin = "1.0", ClampMax = "300.0", UIMin = "1.0", UIMax = "200.0", EditCondition = "!bBypass"))
206 float AttackTimeMsec = 10.0f;
207
208 // The amount of time to release the dynamics processing effect
209 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Response, meta = (DisplayName = "Release Time (ms)", ClampMin = "20.0", ClampMax = "5000.0", UIMin = "20.0", UIMax = "5000.0", EditCondition = "!bBypass"))
210 float ReleaseTimeMsec = 100.0f;
211
212 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Sidechain, meta = (EditCondition = "!bBypass"))
214
215 // If set, uses output of provided audio bus as modulator of input signal for dynamics processor (Uses input signal as default modulator)
216 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Sidechain, meta = (EditCondition = "!bBypass && KeySource == ESubmixEffectDynamicsKeySource::AudioBus", EditConditionHides))
217 TObjectPtr<UAudioBus> ExternalAudioBus = nullptr;
218
219 // If set, uses output of provided submix as modulator of input signal for dynamics processor (Uses input signal as default modulator)
220 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Sidechain, meta = (EditCondition = "!bBypass && KeySource == ESubmixEffectDynamicsKeySource::Submix", EditConditionHides))
221 TObjectPtr<USoundSubmix> ExternalSubmix = nullptr;
222
223 UPROPERTY()
224 uint8 bChannelLinked_DEPRECATED : 1;
225
226 // Toggles treating the attack and release envelopes as analog-style vs digital-style (Analog will respond a bit more naturally/slower)
227 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Response, meta = (EditCondition = "!bBypass"))
228 uint8 bAnalogMode : 1;
229
230 // Whether or not to bypass effect
231 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = General, meta = (DisplayName = "Bypass", DisplayAfter = "DynamicsProcessorType"))
232 uint8 bBypass : 1;
233
234 // Audition the key modulation signal, bypassing enveloping and processing the input signal.
235 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Sidechain, meta = (DisplayName = "Key Audition", EditCondition = "!bBypass"))
236 uint8 bKeyAudition : 1;
237
238 // Gain to apply to key signal if key source not set to default (input).
239 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Sidechain, meta = (
240 DisplayName = "External Input Gain (dB)",
241 EditCondition = "!bBypass && KeySource != ESubmixEffectDynamicsKeySource::Default",
242 UIMin = "-60.0", UIMax = "30.0")
243 )
244 float KeyGainDb = 0.0f;
245
246 // The output gain of the dynamics processor
247 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Output, meta = (DisplayName = "Output Gain (dB)", UIMin = "-60.0", UIMax = "30.0", EditCondition = "!bBypass"))
248 float OutputGainDb = 0.0f;
249
250 // High Shelf filter settings for key signal (external signal if supplied or input signal if not)
251 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Sidechain, meta = (DisplayName = "Key Highshelf", EditCondition = "!bBypass"))
253
254 // Low Shelf filter settings for key signal (external signal if supplied or input signal if not)
255 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Sidechain, meta = (DisplayName = "Key Lowshelf", EditCondition = "!bBypass"))
257
259 : bChannelLinked_DEPRECATED(true)
260 , bAnalogMode(true)
261 , bBypass(false)
262 , bKeyAudition(false)
263 {
264 KeyLowshelf.Cutoff = 20000.0f;
265 }
266};
267
268
270{
271public:
273
275
276 // Gets the effect's deviceId that owns it
278
279 // Called on an audio effect at initialization on audio thread before audio processing begins.
280 AUDIOMIXER_API virtual void Init(const FSoundEffectSubmixInitData& InInitData) override;
281
282 // Process the input block of audio. Called on audio render thread.
284
285 // Called when an audio effect preset is changed
286 AUDIOMIXER_API virtual void OnPresetChanged() override;
287
288
289protected:
291
295
298
300
302
303 bool bBypass = false;
304
305private:
306 FKeySource KeySource;
307 Audio::FDynamicsProcessor DynamicsProcessor;
308
309 FDelegateHandle DeviceCreatedHandle;
310 FDelegateHandle DeviceDestroyedHandle;
311
313};
314
315UCLASS(ClassGroup = AudioSourceEffect, meta = (BlueprintSpawnableComponent), MinimalAPI)
317{
319
320public:
322
323 AUDIOMIXER_API virtual void OnInit() override;
324
326
327#if WITH_EDITOR
329#endif // WITH_EDITOR
330
331 UFUNCTION(BlueprintCallable, Category = "Audio|Effects")
333
334 // Sets the source key input as the provided AudioBus' output. If no object is provided, key is set
335 // to effect's input.
336 UFUNCTION(BlueprintCallable, Category = "Audio|Effects")
338
339 // Sets the source key input as the provided Submix's output. If no object is provided, key is set
340 // to effect's input.
341 UFUNCTION(BlueprintCallable, Category = "Audio|Effects")
343
344 UFUNCTION(BlueprintCallable, Category = "Audio|Effects")
346
347 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = SubmixEffectPreset, meta = (ShowOnlyInnerProperties))
349
350private:
352};
ESubmixEffectDynamicsProcessorType
Definition AudioMixerSubmixEffectDynamicsProcessor.h:27
ESubmixEffectDynamicsChannelLinkMode
Definition AudioMixerSubmixEffectDynamicsProcessor.h:47
ESubmixEffectDynamicsKeySource
Definition AudioMixerSubmixEffectDynamicsProcessor.h:56
ESubmixEffectDynamicsPeakMode
Definition AudioMixerSubmixEffectDynamicsProcessor.h:38
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
#define DECLARE_CYCLE_STAT_EXTERN(CounterName, StatId, GroupId, API)
Definition Stats.h:679
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
auto Response
Definition ExternalRpcRegistry.cpp:598
void Init()
Definition LockFreeList.h:4
@ General
Definition MaterialExpressionFunctionInput.h:41
#define UPROPERTY(...)
UObject definition macros.
Definition ObjectMacros.h:744
#define GENERATED_BODY(...)
Definition ObjectMacros.h:765
#define UFUNCTION(...)
Definition ObjectMacros.h:745
#define UCLASS(...)
Definition ObjectMacros.h:776
#define UENUM(...)
Definition ObjectMacros.h:749
#define USTRUCT(...)
Definition ObjectMacros.h:746
#define GENERATED_USTRUCT_BODY(...)
Definition ObjectMacros.h:767
#define EFFECT_PRESET_METHODS(EFFECT_NAME)
Definition SoundEffectBase.h:34
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition DynamicsProcessor.h:37
Definition AudioMixerDevice.h:117
Definition IDelegateInstance.h:14
Definition AudioMixerSubmixEffectDynamicsProcessor.h:70
uint32 GetObjectId() const
Definition AudioMixerSubmixEffectDynamicsProcessor.h:92
void Update(ESubmixEffectDynamicsKeySource InType, uint32 InObjectId, int32 InNumChannels=0)
Definition AudioMixerSubmixEffectDynamicsProcessor.h:116
void SetNumChannels(const int32 InNumChannels)
Definition AudioMixerSubmixEffectDynamicsProcessor.h:110
int32 GetNumChannels() const
Definition AudioMixerSubmixEffectDynamicsProcessor.h:98
Audio::FPatchOutputStrongPtr Patch
Definition AudioMixerSubmixEffectDynamicsProcessor.h:78
ESubmixEffectDynamicsKeySource GetType() const
Definition AudioMixerSubmixEffectDynamicsProcessor.h:104
void Reset()
Definition AudioMixerSubmixEffectDynamicsProcessor.h:80
Definition ScopeLock.h:141
Definition SoundEffectSubmix.h:86
Definition StructuredArchiveSlots.h:144
Definition AudioMixerSubmixEffectDynamicsProcessor.h:270
virtual AUDIOMIXER_API ~FSubmixEffectDynamicsProcessor()
Definition AudioMixerSubmixEffectDynamicsProcessor.cpp:32
AUDIOMIXER_API void OnDeviceCreated(Audio::FDeviceId InDeviceId)
Definition AudioMixerSubmixEffectDynamicsProcessor.cpp:392
Audio::FDeviceId DeviceId
Definition AudioMixerSubmixEffectDynamicsProcessor.h:301
AUDIOMIXER_API void OnDeviceDestroyed(Audio::FDeviceId InDeviceId)
Definition AudioMixerSubmixEffectDynamicsProcessor.cpp:403
AUDIOMIXER_API Audio::FMixerDevice * GetMixerDevice()
Definition AudioMixerSubmixEffectDynamicsProcessor.cpp:160
AUDIOMIXER_API FSubmixEffectDynamicsProcessor()
Definition AudioMixerSubmixEffectDynamicsProcessor.cpp:26
virtual AUDIOMIXER_API void OnProcessAudio(const FSoundEffectSubmixInputData &InData, FSoundEffectSubmixOutputData &OutData) override
Definition AudioMixerSubmixEffectDynamicsProcessor.cpp:278
virtual AUDIOMIXER_API void OnPresetChanged() override
Definition AudioMixerSubmixEffectDynamicsProcessor.cpp:89
bool bBypass
Definition AudioMixerSubmixEffectDynamicsProcessor.h:303
AUDIOMIXER_API bool UpdateKeySourcePatch()
Definition AudioMixerSubmixEffectDynamicsProcessor.cpp:170
Audio::FAlignedFloatBuffer AudioExternal
Definition AudioMixerSubmixEffectDynamicsProcessor.h:299
AUDIOMIXER_API void UpdateKeyFromSettings(const FSubmixEffectDynamicsProcessorSettings &InSettings)
Definition AudioMixerSubmixEffectDynamicsProcessor.cpp:358
AUDIOMIXER_API Audio::FDeviceId GetDeviceId() const
Definition AudioMixerSubmixEffectDynamicsProcessor.cpp:40
AUDIOMIXER_API void ResetKey()
Definition AudioMixerSubmixEffectDynamicsProcessor.cpp:84
UE_FORCEINLINE_HINT void Reset()
Definition SharedPointer.h:1120
Definition AudioBus.h:76
Definition Object.h:95
Definition SoundEffectSubmix.h:26
Definition SoundSubmix.h:334
Definition AudioMixerSubmixEffectDynamicsProcessor.h:317
virtual AUDIOMIXER_API void OnInit() override
Definition AudioMixerSubmixEffectDynamicsProcessor.cpp:414
AUDIOMIXER_API void SetExternalSubmix(USoundSubmix *Submix)
Definition AudioMixerSubmixEffectDynamicsProcessor.cpp:508
AUDIOMIXER_API void SetAudioBus(UAudioBus *AudioBus)
Definition AudioMixerSubmixEffectDynamicsProcessor.cpp:494
AUDIOMIXER_API void ResetKey()
Definition AudioMixerSubmixEffectDynamicsProcessor.cpp:486
FSubmixEffectDynamicsProcessorSettings Settings
Definition AudioMixerSubmixEffectDynamicsProcessor.h:348
AUDIOMIXER_API void SetSettings(const FSubmixEffectDynamicsProcessorSettings &Settings)
Definition AudioMixerSubmixEffectDynamicsProcessor.cpp:531
NO_LOGGING.
Definition AudioMixerPlatformAndroid.cpp:53
uint32 FDeviceId
Definition AudioDefines.h:66
@ false
Definition radaudio_common.h:23
Definition UnrealType.h:7001
Definition SoundEffectSubmix.h:35
Definition SoundEffectSubmix.h:44
Definition SoundEffectSubmix.h:77
Definition AudioMixerSubmixEffectDynamicsProcessor.h:141
Definition AudioMixerSubmixEffectDynamicsProcessor.h:167
Definition ObjectPtr.h:488