Skip to content

DirectAudio v1.3.0 — soft-knee limiter, honest exclusive mode, daprobe

Choose a tag to compare

@github-actions github-actions released this 14 Aug 17:17
· 11 commits to main since this release

Native Wine → Android AAudio audio driver. A Wine mmdevapi backend that carries guest WASAPI audio straight to Android AAudio — no PulseAudio daemon and no ALSA server in the path. All per-stream mixing happens in-process, inside the driver.

v1.3.0 is a quality-and-honesty release: it fixes the one thing on the downmix path you could actually hear, stops the driver from lying about a capability it never had, and ships a tool to see what the audio stack is really doing.

What's new

🎚️ Soft-knee limiter on the surround downmix.
The 5.1 → stereo fold is a correct ITU-style mix (centre and surrounds at −3 dB), but it had no headroom — loud surround content could peak at ~2.41× full scale and hard-clip. It now passes through a soft-knee limiter, so surround downmix no longer clips, at no latency cost. This was the highest-value item on the roadmap ("downmix headroom") and it's now done.

🔎 Honest exclusive-mode reporting.
create_stream used to register every stream as an ordinary shared mixer voice while still advertising EXCLUSIVE support it didn't provide. That false claim is gone. The open log now prints the granted sharing mode alongside the requested one, so BANNER_AUDIO_DIRECT_EXCLUSIVE=1 is truthful about what the device actually gave back:

DirectAudio: open: buffer 576 frames (12 ms) burst 192 cap 4800 perf 12 sharing req=0 got=0 period 10 ms

sharing got=1 means a genuine exclusive stream was granted — the one path that bypasses AudioFlinger's 21 ms mixer and can take total latency below 25 ms on hardware that allows it. AAudio silently falls back to shared where it can't.

🧪 daprobe — a WASAPI capability probe.
A small probe .exe (built on its own workflow) that reports the three answers a game can get and confuse: what's accepted in shared mode (mmdevapi converts, so nearly everything), what's natively openable in exclusive mode (the honest answer), and what's actually rendered (GetMixFormat — 48 kHz float stereo). It's the measuring instrument for the surround work still ahead.

Carried forward from v1.2.2

The 12 ms / 33 ms shipped default (was 62.5 ms / 83 ms), adaptive decay (a grown buffer comes back down when calm), and the full millisecond latency knobs (_MS / _MAXMS / _PERIOD_MS, etc.). See the README for every environment variable.

Compatibility

ABI-matched to Wine 11.0 (ge-proton11-5-bionic-staging). The mmdevapi unixlib vtable is index-based; a single build cannot span Proton 10 and 11 — pin per Wine major version. MIDI is delegated to winealsa.drv. Verified on Adreno 750 / Android 14 across D3D9/11/12+VKD3D and WASAPI/FAudio/XAudio2/DirectSound. Mali GPUs untested. No microphone capture or true multichannel output yet.

Assets

Each zip is a flat winedirectaudio.so (unixlib) + winedirectaudio.drv (arm64ec PE) pair.

asset build device
directaudio-arm64ec-sdk28.zip release 4 KB-page (most devices)
directaudio-arm64ec-sdk35.zip release 16 KB-page
directaudio-v1.3.0-diagnostics-arm64ec-sdk28.zip diagnostics (23 logcat probes) 4 KB-page
directaudio-v1.3.0-diagnostics-arm64ec-sdk35.zip diagnostics 16 KB-page

Install (hot-swap into the device Proton layer):

winedirectaudio.so   → lib/wine/aarch64-unix/
winedirectaudio.drv  → lib/wine/aarch64-windows/

The diagnostics builds are byte-for-byte the release logic plus per-callback logcat tracing (tag DirectAudio); use them to trace on-device, ship the release ones.

Roadmap after this

Route-change format handling (re-derive the resampler ratio on a new route) → real surround (Android Spatializer 5.1) → microphone capture. Plus Mali verification and a lower host-app preset rung.


DirectAudio by The412Banner · LGPL-2.1-or-later