v1.5.4 - stability: 8 code-review fixes, remap fixes, auto-recovery.
What is in this release
- Remap no longer auto-executes. The key you press to assign a hotkey
used to fire the action right away (remapping Divide to Num2 opened the
menu). The poller now re-baselines after a suspend/rebind. - Num4/Num6 are remappable. Processing resolution up/down were missing
from the remapping page - all eight hotkeys are now listed, in all 12
languages. - NVENC codec fallback. Recording tried AV1 first and failed on RTX 30
(no AV1 NVENC encoder). The chain now falls back AV1 -> HEVC -> H.264,
probed at open time; close() cannot deadlock on a stuck encoder; frame
demand is gated to one frame per 30 fps slot. - Atomic config writes. A crash mid-save can no longer corrupt
config.json (temp + fsync + atomic replace). The menu layout save now
also persists the profile, the NR parameters and the monitor - they were
lost on relaunch. - Monitor identity by DXGI DeviceName. The saved monitor is remembered
by its device name, not by a positional index - after a cable unplug,
display reorder or laptop dock the program still captures the same
physical screen. - NGX result is not a boolean. 0x00000000 ("no frame this call") is no
longer treated as a crash - it used to restart the worker three times
and turn NR off (the laptop/iGPU pattern from issue #11). Only the
0xBAD00000 family is a real error. - Fence hardening. UINT64_MAX (device removed) is no longer a false
success, the completed value is re-checked after the event wait, and a
failed queue Signal surfaces instead of hanging every wait. - Auto-recovery. A transient worker failure (no-frame, driver hiccup,
TDR) now gets ONE automatic revive after a 30 s backoff instead of
leaving NR off until you press Num1. A hard failure (0xBAD00001 - the
GPU cannot run the pass at all) never auto-revives. - Audio format structs are byte-packed (the real ABI) and truncated
extensible formats are rejected. - Gray readback uses the driver's row pitch (320 is not a multiple of
256 - the packed pitch was undefined behaviour per D3D12).
Tests
43 tests, all green: new coverage for the remap fix, the codec fallback,
the atomic config, the monitor identity, the OUT statuses and the
recovery classifier.