CNA-GAP-045: XACT features FAudio never finished are unimplemented: QUEUE and REPLACE_QUIETEST limits, band-pass track filters, reverb sends and DSP-preset RPCs
Evidence basis: source-verified at the pinned commit; tests exist (not executed for this page). Claims on this page were checked by reading the CNA source at commit 009d40f5; unless a sentence says otherwise, nothing here was built or executed. Nothing on this page was executed unless the Evidence section says so.
CNA reproduces FAudio's shipped behaviour: QUEUE and REPLACE_QUIETEST evict the oldest cue, a cue-level limit picks its victim from the whole bank, band-pass filters cannot be decoded, and reverb and DSP-preset RPC targets do nothing.
- Identifier
CNA-GAP-045- Category
- Functional gap
- Subsystem
- Audio & media
- Status
- Open
- Verified against
- CNA
009d40f5(009d40f5dd085c4e674d3479675fac84b12b3e0a) - Evidence basis
- Source-verified: read at TARGET, not executed
- Tests touching this area
- Yes: see Current tests
- Affected contract
- AudioEngine category and cue instance limits; XACT sound-bank track filters; Cue RPC evaluation; SoundEffectInstance reverb
Expected behaviour
XACT defines FAIL, QUEUE, REPLACE_OLDEST, REPLACE_QUIETEST and REPLACE_LOWEST_PRIORITY instance-limit behaviours, per-track low-, high- and band-pass filters, a reverb send and DSP-preset RPC parameters.
Actual behaviour at TARGET
CheckCategoryInstanceLimit and CheckCueInstanceLimit in AudioEngine.cpp treat QUEUE and REPLACE_QUIETEST as REPLACE_OLDEST and, for a cue-level limit, search every live cue of the bank for the victim, matching FAudio's handle_instance_limit (whose own source carries a FIXME). XactParser.cpp decodes the filter type with FAudio's (filterData >> 1) & 0x02, which can yield only low- or high-pass. Cue::EvaluateRpc in Cue.cpp applies RPC targets 0 (volume), 1 (pitch), 3 (filter frequency) and 4 (filter Q) only: the reverb-send target (parameter 2) and every DSP-preset target (parameter 5 and above) are parsed but never applied, and SoundEffectInstance::INTERNAL_applyReverb is a documented no-op because the mixer has no aux-send bus. CHECKLIST.md records the instance-limit collapse, the low/high-only filter decode, the DSP-preset RPC gap and the reverb no-op as accepted deviations, and plan_audio20260717.md (P10-RPC-001) records the unapplied reverb-send RPC target.
Source locations
modules/audio/src/Xna/AudioEngine.cpp— CheckCategoryInstanceLimit, CheckCueInstanceLimitmodules/audio/src/Internal/XactParser.cpp— track filter decodemodules/audio/src/Xna/Cue.cpp— Cue::EvaluateRpc: parameters >= 5 unsupportedmodules/audio/src/Xna/SoundEffectInstance.cpp— INTERNAL_applyReverb no-op
Evidence
Checked by reading at 009d40f5; not executed. XACT's own engine is native and not in the XNA IL, so the reference for the intended behaviour is the XACT format, not a decompiled implementation.
Focused reproduction
No focused reproduction is known. Nothing has been invented here; the evidence above is what exists.
Current tests
AudioCategoryTests.cpp (the InstanceLimit* cases) and CueTests.cpp (CueInstanceLimitReplaceOldestEvictsOldestBankWideCueNotSameDefinitionSibling, the track-filter cases) pin the FAudio-parity behaviour; nothing tests QUEUE or REPLACE_QUIETEST as distinct behaviours.
Regression test
If implemented, per-behaviour tests (a queued cue starts when a slot frees; the quietest is replaced) and a band-pass fixture.
Blast radius
XACT projects that rely on these behaviours: cue limits pick different victims, band-pass filtered tracks play unfiltered or high-passed, reverb and DSP effects are absent.
Workaround
No workaround is known.
Related pages
The same subject is explained at several altitudes. These are the neighbouring pages at each one.
- Known issues
- Functional gap index