v0.3.3 — Bluetooth keepalive + stall self-heal
Bluetooth "haptics go dead" fix
Completes the wireless fix started in v0.3.2. That release stopped the
rapid reconnect loop, but some Bluetooth DualSense setups still lost
haptics after a while: the startup chime worked, then everything went
silent — test chime included — with a clean-looking log. Cause: some BT
audio stacks idle the link when the stream is digitally silent for long
enough, and never resume rendering.
What changed — three layers:
- Keepalive — the bridge now mixes an imperceptible pilot tone
(100 Hz at −56 dBFS) into the haptic channels so the stream is never
digitally silent and the Bluetooth link never idles. Disable with
--no-keepaliveif you ever need to. - Stall detection that can't misfire — the watchdog now monitors the
device's hardware render clock, which always advances while audio is
playing (even silence). If it freezes for ~3 seconds the endpoint has
genuinely stopped consuming audio, and the bridge reopens the session
(render clock frozenin the log). - Gentle recovery — if an endpoint keeps re-stalling, reopen attempts
back off (2s → 30s) instead of hammering it every few seconds, and
reset once a session stays healthy for a minute.
Also fixed: a stall during the startup chime could previously hang the
bridge's audio engine.
Log check: a healthy 0.3.3 session shows
Output: timer-driven, 100 ms latency, keepalive on and no
Reopening audio session lines. An occasional render clock frozen
reopen is the self-heal working.
Reminder for wireless users: if the tray dot is gray / no chime, DSX
isn't running or its BT Audio/Haptics toggle is off — Windows only
exposes the controller's audio endpoint while that's active.
Install: unzip over your Silksong folder, or replace both
BepInEx/plugins/SilksongPS5Haptics/SilksongPS5Haptics.dll and
BepInEx/plugins/SilksongPS5Haptics/HapticsBridge/HapticsBridge.exe.