← Back to Overview
Open Industry Specification · v1.2

AcoustX

The open, royalty-free API for hardware acoustic ray tracing. AcoustX defines what acoustic propagation hardware must do — not how any vendor builds it. Titles link one binary, target one header pair, and run on any conformant implementation. Intel's Sonoral™ is the first; the specification exists so it will not be the last.

Open Specification acx.dll / libacx.so Royalty-free acoustx/listener.h acoustx/compat.h
Specification · implementation · silicon
The layering you already trust: DirectX Raytracing defines the contract, RTX implements it. AcoustX defines source registration, traversal semantics, resolver behavior and IR delivery; each vendor supplies the machine underneath. A title written against acx.dll is written against all of them.
API Surface

Two headers. One contract.

acoustx/listener.h is the native surface: listener-out rendering, where the implementation traces, assembles the impulse response, and delivers ear-ready audio. acoustx/compat.h is the migration shim: source-out semantics matching the Steam-Audio-era model, where the title still owns its mix and the hardware accelerates what it can. Both link the same binary. Both hit the same Traversal Engine.

Capabilitylistener.hnative · listener-outcompat.hshim · source-out
Hardware BVH traversal TE — 8-band ray payloads, path-length delay taps✓✓
Distance / air absorption & Doppler resolvers✓✓
Material coefficient fetch .ablx 48-preset library✓✓
Hardware UTD edge diffraction DU✓—
Binaural divergence BDU — Woodworth ITD / head-shadow ILD per-ear fork✓—
Codec bridge Atmos / DTS:X objects from the parametric domain✓—
Occlusion query callbacks✓—
Parametric reverb-zone hints✓—

The split is principled, not promotional: everything listener-only exists downstream of the impulse response — and in the source-out model, the title, not the implementation, owns that stage. The moment an engine hands over the listener, the rest of the pipeline lights up.

Code

The same engine sound, both ways.

One emitter, registered through each header. The native path hands the listener to the implementation and receives ear-ready output; the compat path keeps the title's own mixer and receives per-source filtered buffers — with hardware traversal already applied.

C11 · links acx.dll / libacx.so
#include <acoustx/listener.h>          /* native listener-out surface */

acxScene*    scene    = acxSceneCreate(ACX_SCENE_FROM_TLAS);
acxListener* listener = acxListenerCreate(scene, &(acxListenerDesc){
    .headRadiusM = 0.0875f,                /* BDU runtime parameter  */
    .hrtfProfile = ACX_HRTF_DEVICE_DEFAULT,
});

acxSource* engine = acxSourceRegister(scene, &(acxSourceDesc){
    .position    = { 4.2f, 1.1f, -7.6f },
    .directivity = ACX_DIRECTIVITY_CARDIOID_SH,
    .bands       = ACX_BANDS_OCTAVE_8,
});

while (running) {
    acxSourceSetPosition(engine, world.enginePos);
    acxListenerSetPose(listener, cam.pos, cam.orient);
    acxSceneCommit(scene);     /* IR lands within one audio block */
}
#include <acoustx/compat.h>            /* source-out shim, Steam-Audio-era */

acxCompatContext* ctx = acxCompatInit(NULL);

acxCompatSource* engine = acxCompatAddSource(ctx, &(acxCompatSourceDesc){
    .position  = { 4.2f, 1.1f, -7.6f },
    .falloff   = ACX_COMPAT_FALLOFF_INVERSE,
    .occlusion = ACX_COMPAT_OCCLUSION_RAYCAST,
});

while (running) {
    acxCompatSetSourcePos(engine, world.enginePos);
    acxCompatSetListener(ctx, cam.pos, cam.orient);

    /* source-out: the title mixes. Hardware traversal, distance,
       air absorption and materials are already in the buffers.  */
    acxCompatProcess(ctx, inBufs, outBufs, frames);
}
Migration

Recompile first. Believe later.

AcoustX was specified so that adoption never requires an audio-engine rewrite. The path is a cascade, and every stage ships.

01

Recompile against compat.h

The shim mirrors source-out middleware semantics — sources, a listener, per-source processed buffers. For a Steam-Audio-era title this is a header swap and a link change, not a redesign. Raycast occlusion and falloff calls map one-to-one.

02

Ship it

Identical audible output to the software path at 94% lower power — traversal, distance resolution and material filtering have left the CPU. No new content, no new bake, no gameplay risk. This is the stage most catalogs stay at, and that is fine.

03

Adopt listener.h per feature

Native adoption is not all-or-nothing. Hand over the listener for cutscenes first; enable UTD diffraction on the levels that were baked for it; light up the codec bridge when the Atmos mix is ready. Both headers coexist in one process against one scene.

04

Full native

Listener-out end to end: hardware UTD, binaural divergence, occlusion callbacks, reverb-zone hints, objects encoded straight from the parametric domain. +9% power over compat — the entire physical acoustics feature set for nine percent.

Zero watts, from the API's side of the fence

There is no "AcoustX off" setting, because none is needed: a title that never links acx.dll never issues a source registration, the driver never maps the queues, and the traversal silicon's power domain never ungates. Absence of a caller is the power switch. Competitive titles that want the 2.9 ms raw path simply don't make the call.

API-Level Benchmark

Compat vs. native, measured.

The same content ported both ways through the same implementation (Sonoral, Core 500 tier). This comparison is a property of the API split, not of any one vendor's silicon — which is why it lives on this page.

PathAudible resultPower vs. software baselineFeature ceiling
Software baseline middleware, CPU Reference mix100% Faked diffraction, per-source occlusion rays
compat.h source-out shim Matches software output−94% Hardware traversal, distance, materials
listener.h native listener-out Full physical acoustics−94%, then +9% over compat + UTD diffraction, binaural divergence, codec bridge

Read the second row twice: the shim isn't a degraded mode, it's the same output for a twentieth of the power. The native premium buys physics the software path never had at any power.