Sound Class / Sound Mix: category volume, Push/Pop, and overrides¶
At a glance
Sound Class: an asset that assigns sounds to a category and can inherit
through a parent/child tree ·
Sound Mix: an asset whose active adjusters multiply Sound Class volume
and pitch over time ·
Runtime nodes: Push Sound Mix Modifier, Pop Sound Mix Modifier,
Set Sound Mix Class Override, and Clear Sound Mix Class Override ·
Returns: execution only—no success Boolean and no mix-instance handle ·
Scope: the audio device resolved from the node's hidden World Context;
these calls do not replicate ·
Official pages: Set Sound Mix Class Override ·
Sound Classes ·
Sound Mix
The one-minute version¶
- Put each playable sound in a Sound Class such as
Master,Music,SFX,Dialogue, orUI. The class is the category identity; a Slider is not. - A Sound Mix is a runtime layer. While active, its Sound Class adjusters multiply the classes' authored volume and pitch. It does not rewrite the Sound Class or sound assets.
Push Sound Mix Modifieractivates one mix for this audio device.Popreleases one manual activation. The engine tracks reference counts, so every owner that pushes must release exactly once.Set Sound Mix Class Overridechanges—or creates—a runtime adjuster for one Sound Class inside that mix. It takes Volume, Pitch, Fade In Time, and Apply to Children, and returns no success result.Clear Sound Mix Class Overridefades that runtime override back to the mix's authored adjuster. It does not promise audible volume1.0because the Sound Class, its parents, other mixes, and each sound instance still contribute multipliers.- For an options screen, activate one long-lived user-volume mix once, update its class overrides for preview/applied state, and persist the plain volume numbers through your settings owner. Do not Push again on every Slider event.
- Several mixes can be active together.
EQ Prioritychooses between legacy equalizer settings; it is not a general “highest-priority mix wins” rule for Sound Class volume. - Category volume is local output policy. Replicate the gameplay event or state that should make a sound happen, then let each listening machine mix that sound at its own saved volume.
What it actually does¶
There are three different layers beginners often call “the volume”:
flowchart LR
Sound[Sound Wave / Cue / MetaSound] --> Class[Assigned Sound Class]
Class --> Tree[Sound Class parent/child tree]
Tree --> Mixes[Active Sound Mix adjusters]
Mixes --> Instance[Audio Component / play-node multiplier]
Instance --> Output[Local audio-device output]
Each layer is multiplicative. A music sound might have an authored asset
volume, inherit from Master, receive a Music = 0.40 user override, and play
through an Audio Component with its own multiplier. Changing any one layer
does not erase the others.
Sound Class is the category¶
A Sound Class is an asset referenced by playable sound assets. A useful small tree is:
SC_Master
├─ SC_Music
├─ SC_SFX
│ ├─ SC_Weapons
│ └─ SC_Footsteps
├─ SC_Dialogue
└─ SC_UI
The parent/child relationship can pass properties such as volume and pitch to children. That lets a Master control affect every inherited category while a Music control affects only music.
The tree does not classify sounds by name or folder. A sound must actually
resolve to the intended Sound Class. If a music asset still uses the default
class, changing SC_Music correctly changes nothing about that asset.
Sound Mix is an active adjustment layer¶
A Sound Mix asset can contain FSoundClassAdjuster entries. Each entry names a
Sound Class and supplies multiplier-style values including Volume, Pitch, and
Apply to Children. The mix also has timing such as Initial Delay, Fade In,
Fade Out, and Duration.
Conceptually:
pseudocode—mental model, not engine source
for each active Sound Mix:
interpolate the mix's current weight
for each Sound Class adjuster:
multiply the target class properties by the weighted adjuster
if Apply to Children:
include descendant Sound Classes
Multiple active mixes contribute to the result. An options mix, a temporary “underwater” mix, and a passive dialogue-ducking mix can all affect the same class at once.
The four Blueprint operations¶
| Node | Inputs that matter | Observable result | Return / failure pin |
|---|---|---|---|
| Push Sound Mix Modifier | Sound Mix asset | Adds one manual activation for that mix on the resolved audio device; authored timing controls its entrance | None |
| Pop Sound Mix Modifier | Sound Mix asset | Releases one manual activation; when no other active/base/passive ownership keeps it active, it follows its fade-out path | None |
| Set Sound Mix Class Override | Mix, Sound Class, Volume, Pitch, Fade In Time, Apply to Children | Replaces or adds the runtime override for that class in that mix and interpolates from its current value | None |
| Clear Sound Mix Class Override | Mix, Sound Class, Fade Out Time | Interpolates away the runtime override and restores the mix's non-override adjuster for that class | None |
The Mix and Sound Class inputs are asset references. The nodes do not return a new Sound Mix object, an activation token, an effective volume, or a success Boolean. The outgoing execution pin only means the call returned.
Set Sound Mix Class Override may add a runtime entry even when the mix asset
does not author that Sound Class in its Sound Class Effects array. That entry
belongs to the audio device's runtime override state; it does not dirty or save
the .uasset.
Volume, Pitch, Fade, and Apply to Children¶
- Volume is a scale, normally
1.0for unchanged,0.5for half the linear multiplier, and0.0for silence at this layer. It is not a decibel value and “half the number” is not perceived as exactly half as loud. - Pitch is also a multiplier. Use
1.0when an options control should change only category loudness. - Fade In Time is the interpolation time from the override's current values to the new ones. Repeated Set calls retarget the override; they do not create separately removable override instances.
- Apply to Children makes this override affect descendants of the chosen class. Use it for a Master control only when the hierarchy really represents every category that control should own.
- Fade Out Time on Clear is the transition back to the mix's authored adjuster—not necessarily back to the final audible default.
Validate the project-facing volume domain before calling the node. A beginner
options screen normally stores a clamped 0.0–1.0 value and keeps Pitch at
1.0; it should not pass arbitrary Slider output and hope an undocumented
clamp defines product behavior.
Push/Pop is ownership, not a toggle¶
The audio device stores separate active and passive reference counts for a Sound Mix. That makes this graph unsafe:
Every On Value Changed
-> Push SM_UserVolumes
-> Set Music override
Each Push adds ownership, while one later Pop releases only one manual reference. The mix can remain active long after the menu closes.
Use one explicit owner instead:
Audio/settings coordinator initialization
-> if UserVolumeMix not manually owned by coordinator:
Push Sound Mix Modifier(SM_UserVolumes)
bOwnsUserVolumeMix = true
Application shutdown / deliberate service teardown
-> if bOwnsUserVolumeMix:
Pop Sound Mix Modifier(SM_UserVolumes)
bOwnsUserVolumeMix = false
Several systems can legally refer to the same Sound Mix asset, but Push does not return an independently addressable instance. Centralize manual ownership or give each feature a distinct mix. A blind Pop from one widget can shorten another owner's activation; a missing Pop leaves the count elevated.
For a permanent project baseline, a configured base Sound Mix may be a better activation owner than a BeginPlay Push. For temporary state such as “pause menu ducking,” a balanced Push/Pop pair is appropriate.
Active mixes, stacking, and passive mixes¶
Several class adjusters can all matter¶
Suppose the current layers are:
| Layer | SC_Music volume contribution |
|---|---|
| Sound Class authored volume | 0.80 |
| User options mix | 0.50 |
| Dialogue ducking mix | 0.40 |
| Audio Component multiplier | 1.00 |
The important mental model is “all applicable multipliers contribute,” not
“the last mix wins.” Clearing the user override removes its 0.50 layer, but
the authored class volume and dialogue ducking still apply.
Parent and child adjusters can also overlap. If a Master override applies to children and a Music override targets the child, both are intentional layers. Avoid accidentally applying the same settings scalar at both levels.
EQ Priority is narrow¶
A Sound Mix's EQ Priority resolves which active mix supplies the legacy
equalizer (EQ) settings when those settings cannot be combined. It does not
turn the whole mix into an ordered override and does not make lower-priority
Sound Class volume adjusters disappear.
Passive mixes have their own trigger¶
A Sound Class can list Passive Sound Mix Modifiers. The audio engine activates one when a sound in that class plays within the configured volume thresholds; Blueprint does not have to Push it. Manual and passive ownership can refer to the same mix, which is another reason not to infer activation from one widget's local Boolean.
Use passive mixes for content-driven behavior such as dialogue ducking. Use a long-lived manual/base mix for user category volumes. Mixing both jobs in one asset makes ownership and restoration harder to reason about.
The options-screen pattern¶
Treat the runtime mix and saved numbers as separate owners:
Open options
-> Draft.MusicVolume = persisted/applied MusicVolume
-> AppliedSnapshot = Draft
Music Slider changed to 0.35
-> Draft.MusicVolume = 0.35
-> Set Sound Mix Class Override(
SM_UserVolumes, SC_Music,
Volume = 0.35, Pitch = 1.0,
Fade In Time = 0.05, Apply to Children = true)
-> this is preview; persisted value is still unchanged
Cancel
-> Set override back to AppliedSnapshot.MusicVolume
-> discard Draft
Apply
-> validate Draft
-> apply every category override through the audio coordinator
-> save the plain Draft volume values through the project settings owner
-> only after save policy succeeds, update AppliedSnapshot
Persist 0.35, not “the Sound Mix is currently pushed.” Sound Mix runtime
state belongs to the audio device and must be reconstructed on the next run.
See Options/settings screen architecture
for draft, applied, and persisted state.
Use a short fade for Slider preview so rapid changes do not click. Do not write a SaveGame/config file for every drag sample. Apply or a deliberate autosave boundary owns persistence.
Clearing is not the same as restoring the open snapshot¶
If the screen opened with the user's saved Music volume at 0.65, Cancel
should Set the override back to 0.65. Calling Clear instead restores the
mix's authored value, which may be 1.0 and is not necessarily the value that
was applied before the screen opened.
Use Clear when the project intentionally wants to stop owning that runtime override—for example, deleting a per-session ducking adjustment—not as a generic Cancel button.
Local output and multiplayer¶
These nodes resolve a World Context to an audio device. They are ordinary local calls, not remote procedure calls (RPCs), replicated variables, or server-authoritative settings.
- In a client process, change the mix used by that client's listener output.
- A listen-server host can also have local audio output, but remote clients do not inherit the host's mix changes.
- A dedicated server normally has no listener output to configure. Running user-volume code there cannot make clients quieter.
- In multi-process play-in-editor (PIE), each process has its own local settings and audio state. In one-process/multi-world tests, pass context from the correct play world rather than an editor utility or stale widget.
For a replicated explosion:
server validates explosion
-> replicated event/state reaches relevant clients
-> each client plays the explosion locally
-> each client's SC_SFX / Sound Mix policy determines its output volume
Never replicate a player's Music or Master volume merely to make the sound event replicate. Local preference and authoritative gameplay occurrence are different state.
When it fails (and what failure does)¶
The nodes have no failure execution pin and no success return. Common silent or misleading outcomes are:
- Mix or Sound Class is
None. The graph continues, but there is no valid target to adjust. - The World Context resolves no usable audio device. Editor utility, teardown, dedicated-server, or stale-world calls can have no audible result.
- The sound is assigned to another class. The override works; the tested sound simply is not in its category.
- The mix has no active ownership when your design expects one. Establish base/manual/passive activation deliberately and verify it at the owner.
- Another layer is already at zero or very low. Clearing one override cannot defeat a parent class, another active mix, an Audio Component multiplier, platform mute, or device volume.
- Apply to Children is wrong. A parent override misses descendants when false, or changes more categories than intended when true.
- Push/Pop calls are unbalanced. The mix stays active or fades out while another feature still assumes it owns it.
- A passive mix is participating. A playing class can reactivate or retain behavior independently of the widget's manual path.
The calls do not throw gameplay exceptions. For diagnosis, print the world and asset names, audition a known sound assigned to the exact class, temporarily use an obvious nonzero override, and inspect every active layer rather than calling Set repeatedly.
What these nodes do not do¶
- They do not assign a Sound Class to a sound asset.
- They do not edit or save Sound Mix/Sound Class assets at runtime.
- They do not return the final effective loudness of a playing sound.
- They do not stop playback, reset playback position, or destroy an Audio Component merely because a class multiplier reached zero.
- They do not persist user settings across launch.
- They do not provide per-local-player mixing inside one shared audio device as if each split-screen listener had an independent master output.
- They do not replicate sound events or local volume preferences.
- They do not make
EQ Prioritya general class-volume conflict resolver.
Lookalikes—which one do I want?¶
| Tool | Scope | Use when |
|---|---|---|
| Sound Class property | Authored defaults for a category/hierarchy | Establishing project-wide routing and baseline volume/pitch |
| Sound Mix class adjuster / override | Runtime category layer on an audio device | User category volume, ducking, or temporary mix state |
| Audio Component Set Volume Multiplier | One live sound instance | One engine loop, voice, or ambience needs its own level |
| Play-node Volume Multiplier | One new playback request | A single one-shot should start louder/quieter |
| Sound Submix | Routed audio signal and effects chain | Processing groups with dynamics, EQ/effects, recording, or sends |
| Audio Modulation / Control Bus Mix | Parameter-driven modern modulation graph | A larger project needs reusable controls, mixes, and modulation destinations |
| Stop / Fade Out Audio Component | Playback lifetime | The sound should actually end rather than merely become inaudible at one mix layer |
Rule of thumb: Sound Class says “which category?”, Sound Mix says “how is that category adjusted now?”, and Audio Component says “what happens to this one playing instance?”
Going deeper¶
- Options/settings screen architecture — preview, Apply, Cancel, persistence, and local-preference ownership.
- Slider / Check Box / Combo Box String — safe Slider domains and change-event behavior.
- Audio Component controls — per-instance Play, Stop, Fade, and volume.
- Play Sound 2D / at Location / Spawn Sound Attached — starting the sound that category mixing later affects.
- Sound Cue vs MetaSound vs Sound Wave — source-asset choice versus output-category policy.
- Official references: Sound Classes, Set Sound Mix Class Override, Clear Sound Mix Class Override, Push Sound Mix Modifier, and Pop Sound Mix Modifier.
- Engine source (requires engine access; we do not reproduce it):
UGameplayStatics::PushSoundMixModifier,PopSoundMixModifier,SetSoundMixClassOverride, andClearSoundMixClassOverrideinEngine/Source/Runtime/Engine/Private/GameplayStatics.cpp;FAudioDevice::PushSoundMixModifier,PopSoundMixModifier,SetSoundMixClassOverride,ClearSoundMixClassOverride, and Sound Class property application inEngine/Source/Runtime/Engine/Private/AudioDevice.cpp, with state declarations inEngine/Source/Runtime/Engine/Public/AudioDevice.h;USoundMix/FSoundClassAdjusterinEngine/Source/Runtime/Engine/Classes/Sound/SoundMix.h; andUSoundClass/FPassiveSoundMixModifierinEngine/Source/Runtime/Engine/Classes/Sound/SoundClass.h.