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

CNA snapshot 009d40f5  ·  Known Issues › Functional gaps  ·  source links pinned to 009d40f5

✓

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

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.

The same subject is explained at several altitudes. These are the neighbouring pages at each one.