diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..38e5ba0a --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,1209 @@ +# Changelog + +Historical upstream release records, consolidated without discarding their detail. See [Releases](https://github.com/hbashton/DS4Windows/releases) for current downloads. + +## Inherited release records + +The following records preserve the original release descriptions and their +limitations. They are historical context, not current setup instructions. + + + +### RELEASE_CANDIDATE_4_1 + +Original record: `docs/RELEASE_CANDIDATE_4_1.md`. Instructions and validation claims apply to that release. + +### Release Candidate 4.1 — Bugfixes and Lower-Latency Audio/Vibration + +RC4.1 is a reliability-focused update for DS4Windows 5. It tightens the +real-time controller path, fixes several first-run and profile-switching +regressions, and makes the new offline installer safer and easier to recover. + +#### Faster, more consistent controller feedback + +- DualSense game haptics, Audio Haptics, speaker audio, and controller state + now share a preallocated real-time path with fewer queue handoffs. Feedback + is no longer discarded merely because a scheduling deadline was missed. +- The virtual DualSense input ceiling is now 1,000 Hz. DS4Windows submits only + fresh mapped input, allowing each physical controller to run at its observed + rate without manufacturing duplicate reports or forcing a 200/250 Hz cap. +- Native game haptics, lightbar/player LEDs, adaptive triggers, rumble, and + DS4Windows overrides are merged atomically so state is not replayed, lost, + or applied to the wrong media frame. +- Game ownership now begins only after meaningful output, survives brief idle + periods, and ends with the owning game process. Closing a game immediately + restores the profile lightbar, player LEDs, triggers, and rumble. +- Rumble preview and game-rumble delivery are synchronized across the new + worker threads, fixing missing beats, stuck vibration, and stop/start races. +- Per-app audio and Audio Haptics capture recover after source changes, app + restarts, speaker/headset changes, and stalled loopback sessions. The source + list also has an explicit Refresh action. + +#### User-facing bug fixes + +- Rapid profile changes are latest-wins. Stale virtual-device transitions and + UI callbacks are discarded instead of replaying slowly, keeping Quick + Settings, audio routing, and the emulated controller synchronized. +- Two-finger profile swipes track both contacts and issue one switch per + gesture, while Auto Profiles recover from transient evaluation failures and + safely ignore disconnected slots. +- Fresh light/default-theme installations no longer crash on launch because + of a missing `InverseBoolConverter` resource. +- VIIPER microphone status monitoring owns its timeout for the entire request, + preventing profile transitions from disposing a wait handle still used by a + background callback. +- Closed dropdowns no longer change profile, audio, or haptics settings when + the mouse wheel is used to scroll the page. +- The automatic audio source is labeled **Game Audio** and identifies the + exact virtual playback endpoint currently assigned to the controller. + +#### Safer all-in-one installation and updates + +- `DS4Windows_5.0.1.0_Setup_x64.exe` is a self-contained offline installer for + DS4Windows, .NET, VIIPER 0.0.8, and usbip-win2 0.9.7.7. HidHide and + FakerInput remain optional checkboxes. The portable ZIP remains separate. +- Unsupported USB-IP versions, mismatched driver files, ABI failures, unsafe + Citrix USB filters, and an incorrect VIIPER binary always open mandatory + guided repair; a saved “do not show again” choice cannot suppress a broken + backend. +- The 0.9.7.8 to 0.9.7.7 USB-IP correction is split safely across a required + reboot. Startup tasks remain disabled until the next boot verifies driver + removal, exact hashes, ABI compatibility, and the VIIPER API. +- Install, update, repair, uninstall, and in-app infrastructure repair are + serialized. Duplicate button clicks and duplicate Burn Plan requests are + ignored, while a competing transaction returns Windows Installer busy + instead of mutating the same files or processes. +- Process preflight now owns the same infrastructure lock as VIIPER repair, so + one setup cannot terminate DS4Windows or VIIPER while another setup is + replacing or validating them. +- Helper logs include a unique start record and matching completion/exit-code + record. Concurrent append attempts are retried, and failure diagnostics stay + available under `%ProgramData%\DS4Windows\Installer`. +- Package composition rejects a stale or mixed `DS4Windows.release` identity + before running WiX. The verified manifest is published before the installer + EXE, making the EXE the final atomic release commit point. +- Updates replace only manifest-owned files. Profiles, settings, logs, and + unrecognized user files are preserved, while partial success never receives + the Ready marker or enabled startup tasks. + +#### Validation completed + +- 738 automated regression tests passed; two live audio-capture tests were + skipped because they require an interactive application session. +- The clean self-contained x64 publish, setup helper, custom bootstrapper, + WiX MSI ICE checks, and Burn bundle all built successfully. +- Payload hashes, package ownership, unsafe path checks, optional dependency + conditions, offline layout, clean/update/repair/uninstall ordering, + cancellation, downgrade blocking, collision handling, failure rollback, and + reboot/resume were validated. +- The 0.9.7.8 to 0.9.7.7 reboot-boundary simulation passed, and deliberate + overlapping installer/build attempts failed closed without changing the + completed package manifest. + +#### Downloads + +- **Recommended:** `DS4Windows_5.0.1.0_Setup_x64.exe` +- **Portable:** `DS4Windows_VIIPER_x64.zip` + +The installer requests a restart only when USB-IP must be safely installed or +replaced. + + + +### RELEASE_CANDIDATE_4_2 + +Original record: `docs/RELEASE_CANDIDATE_4_2.md`. Instructions and validation claims apply to that release. + +### Release Candidate 4.2 — Reduce CPU Usage + +RC4.2 cuts VIIPER's controller-emulation overhead while preserving responsive +input, Game Bar navigation, Bluetooth ownership, and clean application-audio +routing. + +#### Highlights + +- **Much lower VIIPER CPU usage.** Virtual Xbox 360, DualShock 4, DualSense, + and Switch 2 Pro input writers use adaptive, thread-safe latest-state + delivery instead of busy-looping redundant reports. Fresh input retains a + 1,000 Hz ceiling without manufacturing duplicate traffic. +- **Stable Xbox 360 and Game Bar input.** Profile changes retire temporary Game + Bar companions before a native Xbox pad appears, so the overlay cannot bind + a stale controller that is about to be removed. +- **Lower-latency input without stale queues.** Mapped controller state uses a + bounded latest-wins writer instead of replaying obsolete reports under load. +- **Reliable DualShock 4 Bluetooth ownership.** A temporary HID read drought + no longer tears down a controller that Windows still reports as present. +- **Correct per-app DS4 audio.** Process loopback now consumes exactly one + 8 ms source quantum per encoder tick; PCM is no longer silently discarded, + malformed, or replayed at the wrong effective rate. +- **Game-safe app speaker overrides.** A selected application remains the + controller speaker source when a native PS5 game takes feedback ownership. + Game triggers, LEDs, lightbar, rumble, and haptics are merged atomically + without replacing the app's PCM generation. Audio Haptics Replace remains + authoritative; Mix combines the captured and native game haptics. +- **Stronger capture recovery.** Selected-app speaker audio and Audio Haptics + recover cleanly after source changes, process restarts, and headset/speaker + transitions. +- **Prerelease updates that follow the installed channel.** Release-candidate + users automatically receive newer prereleases; stable users remain on stable + builds, and a newer stable release still takes priority. +- **Cleaner layouts.** Scrollable Audio Haptics, Trigger Lab, Auto Profiles, + and log views no longer place their scrollbar over controls or text. + +#### Included software + +- DS4Windows **5.0.2.0** (self-contained x64) +- VIIPER **0.0.9** +- usbip-win2 **0.9.7.7** +- Optional offline HidHide and FakerInput installers + +The standard installer preserves profiles and settings while upgrading only +package-owned files. Portable users can continue using the release ZIP. + + + +### RELEASE_CANDIDATE_4_3 + +Original record: `docs/RELEASE_CANDIDATE_4_3.md`. Instructions and validation claims apply to that release. + +### Release Candidate 4.3 - Installer Reliability + +RC4.3 pairs DS4Windows 5.0.3.0 with VIIPER 0.1.0 and tightens every standard, +portable, update, repair, and uninstall path around one verified offline +package. + +#### Highlights + +- **VIIPER 0.1.0 everywhere.** The tray, Windows executable metadata, API + version, release package, DS4Windows compatibility gate, and both installer + paths all identify the same production backend build. +- **Exact portable compatibility.** A portable VIIPER can run from any + location when its executable matches this release's pinned SHA-256. Users + are not forced into Program Files merely because DS4Windows is portable. +- **Deterministic updates.** Stale installer registrations are retired rather + than relaunched or allowed to block the current package. +- **Fail-closed backend checks.** Missing, outdated, or modified VIIPER + binaries cannot silently start. Repair uses the exact bundled offline + payload and verifies it before virtual controllers are enabled. +- **Safer shared infrastructure.** Updates preserve healthy VIIPER and USB-IP + infrastructure. Uninstall removes only files and tasks owned by the managed + installation. +- **Broader release gates.** Clean install, upgrade, repair, internal repair, + USB-IP removal and recovery, uninstall, reinstall, payload integrity, and + startup behavior are validated before publication. + +#### Included software + +- DS4Windows **5.0.3.0** (self-contained x64) +- VIIPER **0.1.0** +- usbip-win2 **0.9.7.7** +- Optional offline HidHide and FakerInput installers + +The standard installer preserves profiles and settings while upgrading only +package-owned files. Portable users can continue using the release ZIP. + + + +### RELEASE_CANDIDATE_4_4 + +Original record: `docs/RELEASE_CANDIDATE_4_4.md`. Instructions and validation claims apply to that release. + +### Release Candidate 4.4 - Input Fidelity, Audio Efficiency, and Mute Controls + +RC4.4 pairs DS4Windows 5.0.4.0 with VIIPER 0.1.2. This candidate focuses on +faithful DualSense input transport, lower handoff latency, bounded DualShock 4 +Bluetooth audio ownership, explicit mute behavior, and safer controller and +installer lifecycle handling. + +#### Highlights + +- **Ordered DualSense RAW trigger fidelity.** The VIIPER V5 input scheduler + preserves complete press, peak, settled-status, release, and failed-write + retry states instead of collapsing meaningful trigger transitions into one + latest value. Independently timed L2 and R2 peaks remain chronological; the + transport does not synthesize a combined state that the physical controller + never reported. +- **Complete negotiated RAW metadata.** A negotiated raw-input alias receives + the 53-byte V5 state: the established 33-byte mapped state plus validity and + controller-layout flags, the same report's sensor timestamp, and normalized + physical bytes 41 through 55. Legacy aliases keep their established 33-byte + contract. The physical report's authentication tail is intentionally not + copied because mapped virtual reports cannot reuse that authentication tag. +- **Lower-latency input handoff.** DualSense input keeps exactly one HID read + ahead and arms the alternate fixed buffer before parsing, mapping, callbacks, + or virtual publication. The V5 writer wakes for fresh work and prioritizes + ordered edges; it does not hold reads for a four-millisecond coalescing tick + or manufacture duplicate reports. The virtual USB interrupt endpoint remains + the backend's normal one-millisecond presentation opportunity. +- **More efficient DualShock 4 Bluetooth audio.** Enabling controller-speaker + audio creates one bounded owner for capture, encoding, reusable timing, and + HID output. Its 8 ms production clock blocks instead of busy-spinning. + Disabling audio closes capture, joins the encoder, cancels and drains pending + output, sends the ordered audio-off state when possible, and disposes the HID + lane and wait handles before a replacement generation can start. +- **A narrow SteelSeries Sonar capture path.** Ordinary render devices keep the + standard Windows loopback implementation. Only an endpoint with both + SteelSeries Sonar product identity and the Sonar `ROOT\MEDIA` software-adapter + projection selects the short polling loopback path. That path requests a + 4 ms buffer and preserves extensible 32-bit float PCM as float; Windows may + negotiate a different final buffer size. +- **Profile-controlled mute targets.** The new **Mute Button Mutes + Input/Output** master option can target the controller microphone and + built-in speaker independently through their own profile checkboxes. A target + changes only when both its checkbox and the master option are enabled. The + mute LED follows the conventional state: on means muted and off means live. + Enabling this mode disables and greys out mute-button profile switching so + one button press cannot own both actions. +- **Fenced profile-lightbar restoration after game exit.** When the exact + retained foreground lifecycle candidate is confirmed to have exited, + DS4Windows can restore only the configured profile lightbar and player LEDs, + even when the game's final native report was neutral. The candidate must + first have been positively associated with a visual claim while its exact + Process was still running; its physical target, VIIPER stream, feedback + admission, final nonvisual report, and newest native revision must all still + match. A newer or unverified visual writer wins. Game Bar and shell hosts are + negative capture filters, not proof of who wrote a report: if an overlay owns + the foreground window while a new visual claim arrives, DS4Windows safely + leaves that visual state alone. Triggers, rumble, haptics, audio, + microphone/mute, and pacer state remain untouched. The separate exact SDL + bootstrap signature may expire only before any real feedback epoch; neither + policy is sender-PID attribution. +- **Quieter routine logging.** Native-session, idle-report hex, foreground PID + association, and normal process-exit messages no longer crowd the GUI log. +- **Reconnect-safe wired HidHide ownership.** DS4Windows records the live HID + identity before PnP removal and removes only persistent entries that it + inserted. A wired controller that returns under a new HID instance can + enumerate before the new generation is hidden, while user-created rules and + mixed controller/audio USB container nodes remain untouched. +- **More compatible startup repair.** Elevated startup tasks are registered + from schema-validated XML that retains the exact target-user SID, avoiding + ambiguous local-account normalization on affected Windows installations. + Task discovery enumerates and matches the exact root task, so a task that has + not been created is normal absence rather than a failed CIM query. A missing + `VIIPER` Run value is likewise treated as normal first-run state, and foreign + same-name tasks remain protected from replacement or cleanup. +- **VIIPER 0.1.2 throughout the package.** The standard installer and portable + archive use the same pinned production backend build and dependency-license + notice for the supported virtual-controller, microphone, speaker, haptics, + and adaptive-trigger paths. + +#### Included software + +- DS4Windows **5.0.4.0** (self-contained x64) +- VIIPER **0.1.2** +- usbip-win2 **0.9.7.7** +- Optional offline HidHide and FakerInput installers + +The standard installer preserves profiles and settings while upgrading only +package-owned files. Portable users can continue using the release ZIP. + +#### Validation + +Release coverage exercises ordered trigger epochs, raw-alias negotiation, +failed-write retry, USB and Bluetooth input parsing, the read-ahead lifecycle, +audio start/stop and reconnect races, Sonar endpoint selection and PCM format, +mute persistence and runtime policy, confirmed-exit and unknown-liveness LED +fences, same-process stream/target rebinding, first-command and failed-write USB +ordering, Bluetooth combined-admission ordering, absence of routine lifecycle +logging, HidHide generation changes, and startup-task ownership. Publication +also gates on the Release build and regression suite, installer state-machine +and restart simulations, package manifests, pinned payload hashes, and public +signing requirements. + +#### Downloads + +- **Recommended:** `DS4Windows_5.0.4.0_Setup_x64.exe` is the self-contained + offline x64 installer for DS4Windows, VIIPER, and usbip-win2, with optional + HidHide and FakerInput selections. +- **Portable:** `DS4Windows_VIIPER_x64.zip` contains the same DS4Windows and + pinned VIIPER versions without installing DS4Windows itself. + +Download either asset from the +[DS4Windows Releases page](https://github.com/hbashton/DS4Windows/releases). + + + +### RELEASE_CANDIDATE_4_5 + +Original record: `docs/RELEASE_CANDIDATE_4_5.md`. Instructions and validation claims apply to that release. + +### Release Candidate 4.5 — More Ways to Play + +#### The short version + +Switch 2 controllers meet Xbox One / Series emulation, Joy-Cons become more +flexible, and DS4Windows gets a substantial round of everyday reliability and +usability improvements. + +This is the cumulative change from **RC4.3**, including the work developed for +RC4.4. The highlights are Switch 2 Pro support over USB and Bluetooth, wireless +Joy-Con 2 support on their own or as a pair, more expressive feedback conversion, +and a dedicated Switch 2 settings page built around how you actually play. + +It is a **tester release candidate**. There is real Windows and physical-controller +evidence behind important paths, alongside extensive automated coverage; that +does not mean every controller, game and connection combination is certified. +Bluetooth headset audio is not a supported feature of this candidate. + +#### Your controller, more choices + +**Xbox One / Series is a virtual-output choice, not a Switch 2-only feature.** +The existing supported physical-controller families can select it through the +normal profile system. Switch 2 input also uses that same mapper and the existing +virtual-output choices, including Xbox 360, DualShock 4, DualSense and Switch 2 +Pro. Existing button assignments and profile tools remain the place to customize +your controls. + +The new Xbox path carries separate body-rumble and left/right impulse-trigger +feedback. Supported DualSense targets can use the existing opt-in trigger +controls; Switch 2 targets convert that extra detail into HD rumble. Controllers +with conventional motors receive a capability-appropriate approximation rather +than being assumed to have hardware they do not contain. + +Windows testing has demonstrated changing USB Pro input, mapped GL/GR rear +buttons, and independently exercised all four Xbox feedback channels. Separate +Windows tests also demonstrated two distinct virtual Xbox controllers at once, +with removal of one leaving the other usable. That is meaningful progress beyond +an output selector or a successful connection message, but not a claim of +universal game compatibility or Xbox-console authentication. + +#### Joy-Cons that fit the way you play + +- **One half is a controller.** A remembered Joy-Con can activate on its own; + you do not have to wait for its partner or manually activate it each time. + First-time Bluetooth association remains explicit. +- **Automatic or manual joining.** Automatic pairing combines compatible left + and right halves. With it disabled, use the labeled **Link** buttons: select + one half, then its opposite. Click again to cancel. **Unlink** separates a + pair without forgetting its Bluetooth association. +- **Keep the pad you already had.** Joining retains the selected half's virtual + pad and active profile instead of rebuilding both outputs. Unlinking retains + the pair's output for one half. Physical reconnection still takes time; this + is not advertised as a seamless or instantaneous transition. +- **Upright or sideways.** A single Joy-Con's artwork, mapping targets and + shoulder-button presentation follow its selected holding style. The app does + not pretend to infer that preference from how you happen to move it. +- **Mouse and motion options with context.** Desk-mouse controls are separate + from motion aiming. Gyro output and activation settings sit beside their + explanations, and **Aim with both Joy-Cons (DJG)** is an easy-to-find toggle. + Bluetooth startup now enables the real optical and motion sensors; both + halves have supplied changing sensor data through the profile mapper. + +A newly diagnosed disconnect bug also gets a concrete fix: valid Joy-Con reports +could reset their internal counter and be mistaken for invalid input, tearing +down an otherwise connected half or pair. The corrected handling preserves +connection and timing checks while accepting those legitimate counter changes. + +#### Feedback with more of the detail left in + +Switch 2 HD-rumble conversion now pays closer attention to **which side**, **which +frequency band**, and **when an effect peaks**. + +DualSense audio-haptic conversion keeps left and right separate, measures short +attacks within each part of the received audio window, and reduces the chance +that a small ordinary-rumble contribution overrides a stronger authored effect. +Xbox body and impulse effects have more room to overlap without immediately +collapsing to the same maximum strength. Independent controls let you choose +whether to convert DualSense audio haptics, supported adaptive-trigger effects, +and Xbox impulse-trigger detail. + +Held profile and preview rumble now stays serviced instead of expiring after a +brief pulse. Sustained effects receive the refreshes their physical packets need; +finished audio slices are not looped into an unwanted buzz. Stop, profile changes +and replacement effects retain their ordering, including when a write is already +in progress. Shutdown handles a short overlap without falsely abandoning a +healthy controller, while a real timeout still blocks unsafe cleanup. + +These are better-defined, tested conversions—not lossless waveform reproduction. +Switch 2 controllers cannot reproduce a DualSense trigger's mechanical resistance, +and tactile tuning remains something to assess with real games and controllers. + +#### Less guesswork in the interface + +Switch 2 controls have their own illustrated, task-based section: desk mouse, +motion aiming, two-hand aiming, feedback, button layers, sticks and calibration. +**Give buttons a second job** includes a control picker and shortcuts into the +existing mapping editor instead of leaving you to locate the next setting. + +Joy-Con artwork now has a fuller, more dimensional silhouette, with matching +hover/highlight areas and uncropped thumbnails. Switch 2 Pro images no longer +resolve as missing files when opening a profile. The C button has its missing +remapping target, and sideways Capture is labeled as Capture without silently +changing its default assignment. + +Readability improvements include themed tooltips that remain legible, clearer +physical-button names, and explicit Link/Unlink labels. Controller Readings now +uses the selected Switch 2 device's live snapshot; Pro gyro-axis handling is +corrected without changing your saved inversion preferences. If you previously +inverted an axis to work around the old behavior, check that preference again. + +Switch 2 controllers also receive distinct, persistent local IDs for display and +**Link Profile/ID**, replacing indistinguishable zero-address labels. A joined +pair has an identity based on its members. These are local installation/Windows +identities—not fabricated Nintendo serial numbers—and USB and Bluetooth remain +separate where a trustworthy cross-transport match is unavailable. + +#### The fixes that make the features easier to live with + +- **Connecting, switching and disconnecting:** corrected slot collisions, + stale controller rows after virtual-output replacement, and cross-controller + blocking during another pad's setup. Unnecessary repeated startup-recovery + waits and retired USB/IP reconnect attempts have been reduced or cleaned up. + Real Windows enumeration still sets a floor on switch time. +- **Sony feedback and mute controls:** the cumulative update adds independent + microphone/speaker mute targets, conventional mute-LED behavior, and mutual + exclusion with mute-button profile switching. It also corrects a reproduced + RC4.4 native-media fallback that could unintentionally select ordinary rumble, + plus normal Bluetooth DS4 effect routing. The reported Hades II advanced-haptic + regression still needs its specific game/transport acceptance check. +- **Profile effects after preview:** ending Trigger Lab preview restores the + active profile's ordinary trigger settings when no Lab override is active. +- **Lightbar and audio housekeeping:** guarded profile-lightbar restoration + after a verified game exit, quieter routine logs, more efficient DS4 Bluetooth + audio ownership, and the targeted SteelSeries Sonar capture correction. +- **Safer startup and setup:** startup choices are preserved, renamed application + setup is handled consistently, uninstall-only helpers are cached for future + removal, and VIIPER's tray can recover when Explorer is not ready at login. +- **Updates that move forward:** a newer release candidate is no longer offered + an older RC as an update. Release-candidate ordering is checked separately + from the application's Windows version number. +- **Profiles and persistence:** corrected legacy color-channel loading, more + reliable date/localization handling, calibration-save contention, original + Switch Pro startup/calibration failures, and options-dialog failures involving + multiple Switch 2 controllers. Steam/HidHide reclaim no longer uses the + identified restart-loop path. + +#### The portable ZIP brings its own broker + +The portable ZIP now includes `viiper.exe` beside DS4Windows. Opening that +portable package starts its matching broker automatically when needed. A +verified, compatible instance already running from the same portable folder +can be reused; simply being already open is not an error. + +A different or incompatible broker produces a clear close-and-relaunch +message. DS4Windows does not terminate that other instance. It stops only a +broker it started itself when its own session ends, after controller cleanup; +a reused broker remains running. The portable session uses local broker data +and leaves the installed broker and its startup task alone. USB/IP drivers +still need to be installed and pass the existing checks. If Windows denies +driver access, the portable app may need to be run as administrator. + +This behavior belongs to the normal portable ZIP, not a special lab launch. +The managed installer retains its normal backend layout. + +Portable updates currently use a fresh ZIP extracted into a new folder after +closing both apps. The older standalone updater can kill DS4Windows before +broker cleanup and cannot safely replace the bundled running broker in place; +the app explains the safe manual update path instead of launching it. Normal +managed-install update behavior is preserved, including recognition of an +installed folder if an older ZIP updater copied a portable marker into it. + +For managed installs, prefer the full installer. The existing standalone +DS4Updater v2.0.4 has a pre-existing final verification mismatch: it compares +the RC tag number with the Windows file version, so `4.5` and `5.0.5.0` can +produce a false replacement-failure message after a successful copy. Its normal +auto-launch path can still reopen the updated application. This external updater +limitation is not fixed by RC4.5; it does not justify changing either version +scheme or pointing an exact-tag download at a nonexistent numeric release. + +#### USB headset output: verified, with clear limits + +The Switch 2 Pro's native Windows USB headphone output was physically verified +through its 3.5 mm jack, including left/right channel assignment and start/stop. +The Switch 2 page explains how to select that endpoint and provides a Windows +Sound settings shortcut. It does not silently replace your default audio device. + +This is the physical controller's USB audio endpoint, not an emulated Xbox +headset. **Headset microphone capture has not been verified. Bluetooth headphone +and microphone audio remain unsupported:** successful Bluetooth command replies +and experimental packet writes did not establish audible output. + +#### What the testing does—and does not—say + +The earlier local portable RC4.5 checkpoint passed **4,516 tests twice**, with zero failures and +11 existing opt-in skips each time. A separate run passed all **152 +allocation-named tests**. Existing CI exclusions remained unchanged; failed +intermediate runs led to investigated fixes, not relaxed assertions. The +[portable startup qualification](docs/validation/2026-09-08-portable-broker-startup.md) +records these runs and replacement packages. The earlier +[qualification record](docs/validation/2026-09-08-rc45-qualification.md) preserves +the initial 4,463-test RC4.5 checkpoint, distinct from the older 4,426-test +controller checkpoint. + +The later publication checkpoint, with release-policy coverage and the verified +GitHub-built VIIPER artifact, passed **4,536 CI-filtered tests** and then **4,539 +unfiltered local tests**, with zero failures and the same 11 opt-in skips. The +three extra cases are legacy profile/settings tests. The [publication record](docs/validation/2026-09-09-github-rc45-publication.md) +distinguishes these final broker pins from the earlier local kit and records +the complete broker CI and installer lifecycle gates. + +All eight opt-in Xbox client/broker process-integration cases also passed +separately at the recorded broker source checkpoints. Those use isolated loopback +connections and simulated native attachment; they do not count as additional +physical-controller tests. + +Physical evidence includes USB Pro input and feedback, Bluetooth controller and +sensor activity, native USB headphone output, and Windows virtual-pad lifecycle +checks. Newest UI, disconnect, sustained-rumble and combined-package changes +still need fresh tester acceptance. Test results are not a measurement of +controller-to-game latency. + +The shipping path remains **VIIPER plus USB/IP**. This candidate does not claim +a completed native-driver backend, 0.125 ms input latency, a measured +multi-controller latency cure, or zero-time virtual-pad switching. Joy-Con 2 USB +support and the complete source/target/game matrix are not certified here. + +For the most useful feedback, include the physical controller, USB or Bluetooth, +selected virtual pad, profile, game, and what happened immediately before the +problem. Try single and joined Joy-Cons, profile/output switching, held rumble +followed by Stop, and power-off/reconnect. Those everyday transitions are where +this candidate most needs to earn its release status. + +#### Evidence behind this assessment + +This assessment covers `VIIPERRC4.3` through the RC4.5 source preparation, +including the [RC4.4 feature set](CHANGELOG.md#inherited-release-candidate-4-4). Detailed records: + +- [Current controller fixes, repeated full-suite results and remaining acceptance](docs/validation/2026-09-08-controller-followup-rollup.md) +- [Reported-bug fixes](docs/validation/2026-09-08-github-reported-bugs.md) and [startup/setup/tray follow-up](docs/validation/2026-09-08-reported-issues-follow-up.md) +- [Installer registration regression and existing-machine cleanup](docs/validation/2026-09-08-installer-duplicate-arp-entries.md) +- [Joy-Con standalone activation](docs/protocols/switch2-joycon-automatic-activation.md), [Link/Unlink handoff](docs/validation/2026-09-06-joycon-link-handoff.md), and [Windows multi-pad evidence](docs/protocols/switch2-cross-slot-and-pad-switch-recovery.md) +- [Switch 2 playstyle interface](docs/validation/2026-09-06-switch2-playstyle.md) and [physical Bluetooth sensor observations](docs/validation/2026-09-06-joycon-bluetooth-sensors.md) +- [Haptic detail conversion](docs/protocols/switch2-haptic-detail-rendering.md), [held-rumble and shutdown validation](docs/validation/2026-09-08-switch2-held-rumble-maintenance.md), and [Xbox feedback capabilities](docs/protocols/xbox-one-physical-output-policy.md) +- [Physical USB headphone evidence](docs/validation/2026-09-06-switch2-pro-usb-audio.md), [Bluetooth audio limits](docs/validation/2026-09-08-switch2-bt-receiver-plans.md), and [DualSense regression scope](docs/dualsense-rc43-rc44-native-haptics-regression.md) + +Reference implementations and protocol research—including Switch2Connect, SDL, +PadForge/HIDMaestro, and Nintendo/Microsoft protocol work—were used where +relevant. Their demonstrated behavior informed the implementation; a feature +working upstream was not counted as a DS4Windows hardware test. + + + +### RELEASE_CANDIDATE_4_5_1 + +Original record: `docs/RELEASE_CANDIDATE_4_5_1.md`. Instructions and validation claims apply to that release. + +### RC4.5.1 — Switch 2 Rumble Hotfix + +This hotfix addresses Switch 2 rumble regressions introduced in RC4.5 and +completes the Xbox One/Series configuration in both download packages. + +> I highly recommend using an Emulated Dualsense controller with a Switch 2 Pro controller: it provides the best haptic feedback and playing experience + +#### Fixes + +- **Gentler connection and identification cues:** finite effects no longer + repeat as sustained rumble. The original effect strengths and frequencies + are preserved. +- **More consistent sustained rumble:** recover promptly from brief output + contention without sending duplicate packets too quickly or replaying a + backlog. This targets the avoidable gaps affecting Test Heavy, Test Light, + and held game rumble over USB and Bluetooth. +- **Safer retries:** a queued Bluetooth one-shot is retried as the same effect + instead of being enqueued again. Temporary timing or worker failures no + longer permanently stop held-output maintenance. +- **Complete Xbox output configuration:** both the installer and portable ZIP + include the selected Windows Xbox One/Series identity configuration, fixing + the missing-file output-validation failure that could reject Joy-Con + activation when its profile selected Xbox output. + +DualSense PCM haptics, adaptive-trigger translation, Xbox impulse feedback, +left/right routing, and immediate Stop handling retain their existing paths. +This is a timing and effect-lifetime correction, not a new rumble intensity +curve or codec. + +#### Downloads and upgrading + +- **Installer:** `DS4Windows_5.0.5.1_Setup_x64.exe` — complete offline setup. +- **Portable:** `DS4Windows_VIIPER_x64.zip` — extract the entire folder and run + `DS4Windows.exe`; the included VIIPER starts automatically. Close other + DS4Windows/VIIPER copies before launching a different portable folder. + +Windows build **5.0.5.1**, release **VIIPERRC4.5.1**. VIIPER remains the +hash-pinned **0.1.3-rc4.5** build, and USB/IP remains **0.9.7.7**. +Use the standard installer EXE for managed upgrades rather than installing +the embedded MSI directly. + +This is an **unsigned release candidate**, not a signed stable release. +Xbox emulation targets Windows; it does not provide authentication for a +physical Xbox console. The included synthetic emulation identity is not a +claim of hardware certification or universal game compatibility. + +Automated tests and artifact checks validate the covered code and package +paths. Please report remaining stutter with the controller model, USB or +Bluetooth connection, virtual output type, and whether it occurs in the +Heavy/Light tests or a specific game. Physical feel can vary and remains part +of release-candidate testing. + + + +### release-notes-rc4.5.6 + +Original record: `docs/release-notes-rc4.5.6.md`. Instructions and validation claims apply to that release. + +### RC4.5.6 — Steadier Feedback & Safer Startup + +This stabilization update brings together the feedback-delivery work since 4.5.5 with fixes for initialization, recovery and setup ownership. + +#### What's improved + +- **More dependable startup.** Windows 10 can use the encrypted VIIPER connection without requiring Windows 11's native encryption provider. Authentication stays enabled. Portable startup now reports the failed connection stage and releases its own unsuccessful broker before showing the error. +- **Safer installation and recovery.** Installer cleanup and repair share the same setup lock. VIIPER releases listeners it opened if initialization fails partway through, so an unsuccessful attempt does not leave its ports occupied. +- **Better feedback delivery.** Native DualSense commands retain their order through busy USB and Bluetooth writers, with bounded retries instead of prematurely acknowledging undelivered state. Sustained Switch 2 rumble uses the referenced first-active-subframe framing. +- **Audio Haptics for Switch 2 Pro and Joy-Con 2.** Turn application or system audio into stereo HD rumble, using Mix or Replace alongside game feedback. Both application pickers find audio sessions across active outputs, including separate Sonar routes. System audio follows the Windows default output. +- **Clean audio recovery and stopping.** Capture failures roll back fully so they can recover. Source changes discard stale audio. Writer failures stop the affected runtime, retire its resources and clear its owned feedback without overwriting untouched native game feedback. +- **Complete matching downloads.** Both packages include VIIPER 0.1.4-rc4.5.6, the Windows 10 encryption dependency, Xbox emulation identity, runtime files and notices. DS4Updater 2.0.6 remains compatible; no separate updater replacement is needed. + +#### Downloads and updating + +Use **DS4Windows_5.0.5.6_Setup_x64.exe** for the standard installation, or extract the **entire portable ZIP** into its own folder. Do not copy only DS4Windows.exe. Close DS4Windows and VIIPER before replacing an existing installation's files; keep your profiles. + +This is an **unsigned release candidate**, published under the existing VIIPERRC policy. Source archives, license notices, SHA-256 checksums and the CI build record accompany the downloads. + +#### Validation and remaining limits + +Release checks cover the full automated x64 suite, startup/Stop ownership, installer failure simulations, complete offline packaging, and hosted MSI install/repair/uninstall plus an upgrade from the published 4.5.5 package with profile-preservation checks. Matching broker tests run on Windows and Linux; the updater suite is also checked. + +These checks do not guarantee every controller/game combination. Final subjective Joy-Con smoothness and GTA V Enhanced rapid-fire feedback still need tester confirmation on USB and Bluetooth. Bluetooth Switch 2 headset audio remains unsupported. No native-driver backend or new end-to-end latency guarantee is claimed. + + + +### release-notes-rc4.5.7 + +Original record: `docs/release-notes-rc4.5.7.md`. Instructions and validation claims apply to that release. + +### RC4.5.7 Hotfix — Sorry, broke Vibration/Triggers + +4.5.6 introduced a Bluetooth DualSense feedback-delivery regression. Sorry about that. This hotfix addresses the command backlog and startup stalls behind delayed or incorrect vibration and trigger effects. + +#### What's fixed + +- **Bluetooth DualSense game feedback:** queued game commands can now progress between audio packets while preserving their order, rather than falling behind the audio clock. +- **Feedback startup:** a partially filled audio buffer can no longer prevent the commands and audio needed to finish starting the stream. +- **Trigger Lab delivery:** live trigger changes now reach the Bluetooth output while speaker/audio passthrough is active. Unrelated profile edits do not clear the game's trigger effects. +- **Per-trigger control stays intact:** enabled Trigger Lab effects override the corresponding trigger; the other trigger continues to receive native game effects. + +This is a targeted transport fix, not a gain boost. PCM encoding, audio cadence and input buffering are unchanged. It does not introduce a new controller backend or change Nintendo rumble tuning. + +#### Downloads + +- **Installer:** `DS4Windows_5.0.5.7_Setup_x64.exe` +- **Portable:** `DS4Windows_VIIPER_x64.zip` — extract the entire ZIP, not just the EXE. + +Both include the complete matching **VIIPER 0.1.4-rc4.5.6** package. No new VIIPER release is required for this fix. **DS4Updater 2.0.6 remains compatible.** Close DS4Windows and VIIPER before replacing their files, and keep your profiles. + +#### Validation + +The fix passed the full automated x64 suite: **5,394 passed, zero failed**, with 11 hardware/environment-gated skips. Regression tests verify exact trigger command ordering, retry under a busy writer, startup progress, and unchanged PCM content through the output-writing code using simulated device I/O. + +The private candidate was tested for haptics on a physical Bluetooth DualSense. Adaptive triggers still need confirmation in a trigger-supporting game; automated transport coverage is not a claim that every game/controller combination has been physically tested. + +Published as an **unsigned release candidate** under the existing `VIIPERRC` policy. Matching source archives, notices, checksums and the GitHub Actions build record accompany the downloads. + + + +### release-notes-rc4.5.8 + +Original record: `docs/release-notes-rc4.5.8.md`. Instructions and validation claims apply to that release. + +### Release Candidate 4.5.8 Hotfix — Bluetooth Haptics & Disconnect Recovery + +This update fixes a native DualSense rumble regression traced to RC4.4 and a separate queued-disconnect shutdown deadlock. It keeps the subsequent feedback, Trigger Lab, Nintendo, audio, input, and installer improvements intact. + +#### What's fixed + +- **Native Bluetooth rumble:** continuing audio packets no longer clear the game's legacy or improved rumble mode immediately after a valid command. The mode and motor values remain active until an explicit change or stop. +- **Feedback ownership:** local trigger/LED updates cannot accidentally cancel native rumble, and stale media templates cannot overwrite a newer accepted motor command. Adaptive-trigger and LED one-shot updates are still consumed once. +- **Disconnect recovery:** a disconnect queued on the controller worker now hands off to the lifecycle owner without a circular wait. Final output retirement and completion waits for external callers remain enforced. + +This is not a gain boost or a rollback. PCM sample content, audio cadence, native command ordering and retry, per-trigger Trigger Lab priority, and Nintendo feedback tuning remain unchanged. + +#### Downloads + +- **Installer:** `DS4Windows_5.0.5.8_Setup_x64.exe` +- **Portable:** `DS4Windows_VIIPER_x64.zip` — extract the entire ZIP, not just the EXE. + +Both include the unchanged, complete **VIIPER 0.1.4-rc4.5.6** package. No broker code changed and no new VIIPER release is required. **DS4Updater 2.0.6 remains compatible.** Close DS4Windows and VIIPER before replacing their files, and keep your profiles. + +#### Validation and limits + +The rebuilt x64 suite passed **5,413 tests with zero failures** and 11 hardware/environment-gated skips, including **2,646 Nintendo tests**. Allocation checks remained enabled and passed. Real-helper tests with simulated device I/O cover continuous rumble, explicit stops, command ordering, busy retry, microphone boundaries, unchanged PCM/gain, and disconnect completion. + +The private candidate connected a physical Bluetooth DualSense, associated virtual DualSense output, and started speaker passthrough. These are startup observations, **not confirmation of in-game haptics or adaptive-trigger feel**. Physical game acceptance remains pending; no complete Hades II, Expedition 33, GTA, or all-game compatibility claim is made. + +Published as an **unsigned release candidate** under the existing draft-first `VIIPERRC` policy. Matching sources, notices, checksums, and the verified GitHub Actions build record accompany the downloads. + + + +### release-notes-rc4.5.9 + +Original record: `docs/release-notes-rc4.5.9.md`. Instructions and validation claims apply to that release. + +### Release Candidate 4.5.9 Hotfix — Faster Feedback, Same Detail + +Rapid feedback should stay responsive, not build up a delay during sustained action. This hotfix targets the DualSense Bluetooth feedback backlog reported in #81 while retaining the RC4.5.8 haptics and disconnect fixes. + +#### What's improved + +- **Faster native feedback dispatch:** game feedback now has a separate 500 Hz / 2 ms software pacing ceiling instead of sharing the 200 Hz / 5 ms local-settings cadence. Distinct effects and stops remain ordered; audio and microphone scheduling retain their existing boundaries. +- **No unnecessary repeat backlog:** consecutive byte-identical, known state-setting commands may share an unclaimed pending queue entry. Changed effects, A-to-B-to-A transitions, stops, unknown commands, extra trigger bytes, and ownership changes are preserved. +- **Adaptive-trigger commands use the faster path too.** Automated tests verify trigger changes, complete trigger payloads, and release commands remain intact. Live validation covered body rumble, not in-game adaptive triggers; this addresses the shared queue-delay cause, not every possible cause of trigger skipping. + +This is not a gain boost or a rollback. PCM samples, codec settings, audio cadence, native rumble-mode ownership, per-trigger Trigger Lab priority, and Nintendo HD-rumble tuning are unchanged. Existing Switch 2 and Joy-Con functionality remains included. + +#### Measured on a Bluetooth DualSense + +In a controlled one-second 250 Hz body-rumble burst, all **251 changes, including the final stop**, reached the physical Bluetooth writer in order. Against RC4.5.8, the final-stop submission delay fell from **252 ms to about 0.18 ms**. Two additional candidate runs preserved all 251 changes, with final-stop submission delays of **0.15–0.18 ms**. + +These are **host-side source-write-to-physical-writer measurements**, not radio acknowledgments, actuator latency, guaranteed 500 Hz hardware throughput, or proof of every game's behavior. GTA rapid-fire gameplay and adaptive-trigger feel still need in-game confirmation. Short input checks showed no consistent report-interval worsening during these bounded bursts. + +#### Downloads + +- **Installer:** `DS4Windows_5.0.5.9_Setup_x64.exe` +- **Portable:** `DS4Windows_VIIPER_x64.zip` — extract the entire ZIP, not just the EXE. + +Both include the complete, unchanged **VIIPER 0.1.4-rc4.5.6** package and Xbox output identity. No new broker release is required. **DS4Updater 2.0.6 remains compatible**; the portable bootstrap obtains the published updater rather than bundling an outdated copy. Close DS4Windows and VIIPER before replacing files, and keep your profiles. + +#### Validation + +The rebuilt x64 suite passed **5,539 tests with zero failures** and 11 existing hardware/environment-gated skips. Allocation assertions remained enabled, including a new intentional-allocation control. Coverage includes ordered native feedback, trigger payload preservation, media/PCM continuity, transport retry and completion handling, and existing Nintendo behavior. + +Published as an **unsigned release candidate** under the existing draft-first `VIIPERRC` policy. Matching sources, notices, checksums, and the GitHub Actions build record accompany the downloads. Detailed evidence is recorded in [the feedback cadence validation](https://github.com/hbashton/DS4Windows/blob/VIIPERRC4.5.9/docs/validation/2026-09-12-issue81-native-rate.md). + + + +### release-notes-rc4.6.1 + +Original record: `docs/release-notes-rc4.6.1.md`. Instructions and validation claims apply to that release. + +### Release Candidate 4.6.1 Hotfix — Dial In Your Aim, Safer HidHide + +RC4.6.1 adds a simple way to dial in flick-stick aiming, cleans up trigger settings, prevents the startup-task failures reported in #98 and #103 from aborting setup, and protects against the confirmed HidHide configuration-client crash caused by Windows app-execution aliases. + +#### Dial in a full 360° turn + +- Open **Axis Config → LS or RS → Output Mode: Flick Stick** and choose a **360° test button** beside Real World Calibration. +- Save the profile, face a recognizable landmark in-game, and tap your chosen button. Increase Real World Calibration if the turn falls short; decrease it if it goes too far. +- Each tap requests one approximately one-second turn. Holding the button does not repeat, and extra taps during a turn do not build a queue. +- The test button's normal mapping is reserved while configured. Choose **Not assigned** when finished to restore it; your original binding is never deleted. A trigger assignment reserves both its soft and full-pull outputs. +- Changes to the profile, stick mode, assigned button, or controller connection cancel unfinished turns. Flick Stick also safely handles a controller disappearing during mapping. + +This is a manual calibration aid for games that accept **mouse look**, not automatic camera tracking. Use a spare button and keep other aiming inputs still for a repeatable result. The setting is in **Axis Config**, not button remapping or Special Actions. + +#### Cleaner trigger settings + +- Removed the legacy **Trigger Effect**, **Trigger Start**, and **Trigger Strength** controls from Axis Config. **Trigger Lab** remains the place to configure adaptive effects. +- Normal trigger dead zones, curves and sensitivity remain available. Existing saved trigger effects, Trigger Lab restoration and native game-provided feedback are preserved. + +#### Safer HidHide configuration + +- Prevent DS4Windows from registering Windows app-execution aliases that can crash HidHide's Applications list. +- Check the configuration before opening HidHide through DS4Windows, with clear feedback when it cannot be read safely. +- If unsafe aliases are found, offer a **confirmation-based, backed-up repair** that removes only those entries. Other applications, hidden-device rules and hiding settings are preserved. Unsafe or changed configurations block the repair instead of guessing. + +This addresses the confirmed alias-related crash, not every possible HidHide failure. An external tool can still add an unsafe entry; launch HidHide through DS4Windows to use the guard. + +#### Startup-task recovery (#98 and #103) + +- Setup keeps the original **RunVIIPER** and **RunDS4Windows** names. Existing definitions at those two reserved root names are backed up before replacement, including manually created or incomplete tasks. No alternate task names are introduced. +- Registration, verification or Task Scheduler access failures produce a startup warning instead of canceling installation. Setup can start the verified executables directly; automatic logon startup may need a later Repair. +- Verification diagnostics identify the mismatched fields instead of reporting only a generic failure. The #98 log proves verification failed, but does not contain the task definition needed to establish which field failed on that PC. +- Launch and uninstall still check the task's contents. An unsuccessful repair never authorizes running an arbitrary task just because its name matches. + +Backups are stored under **%ProgramData%\\DS4Windows\\Installer\\task-backups**. Tasks outside the two reserved root names are untouched. Windows can still refuse registration; this release makes that failure non-fatal, not invisible. Driver integrity, pending-reboot, USB/IP compatibility and VIIPER API checks remain required. + +#### Packages and updates + +- Release/update tag: **VIIPERRC4.6.1**. Windows application, MSI and installer version: **5.0.7.0**, advanced for reliable upgrade ordering. +- Complete offline x64 installer and portable ZIP, including **VIIPER 0.1.5-rc4.6**, the required Xbox output identity, and matching source/notices. Portable users should extract the entire folder. +- **DS4Updater 2.0.6** remains compatible; no separate updater or broker upgrade is required for this hotfix. USB/IP remains **0.9.7.7**. +- Audio, haptics, adaptive-trigger transport, and Nintendo rumble tuning are unchanged from RC4.6. + +#### Validation + +This is an **unsigned release candidate**. The complete local x64 suite passed **5,991 tests with zero failures**, with 11 explicitly gated tests skipped. Calibration uses the canonical mapper and recording test outputs; no input is injected into the desktop by the tests. Calibration light/dark UI layouts were inspected at normal and 150% scale. Existing profile, trigger restoration, native feedback and Nintendo regression checks remain enabled. + +In-game calibration still depends on mouse sensitivity and acceleration. Hardware/gameplay acceptance is not replaced by automated tests, and this release makes no new claim about the previously unattributed rare movement interruption or issue #81 gameplay acceptance. + +Source evidence: [calibration and trigger UI](https://github.com/hbashton/DS4Windows/blob/VIIPERRC4.6.1/docs/validation/2026-09-14-axis-calibration-and-trigger-ui.md), [calibration guide](https://github.com/hbashton/DS4Windows/blob/VIIPERRC4.6.1/docs/flick-stick-calibration.md), [startup-task collision](https://github.com/hbashton/DS4Windows/blob/VIIPERRC4.6.1/docs/validation/2026-09-14-issue103-startup-task-collision.md), and [HidHide safeguard](https://github.com/hbashton/DS4Windows/blob/VIIPERRC4.6.1/docs/validation/2026-09-14-hidhide-client-alias-guard.md). + + + +### release-notes-rc4.6.2 + +Original record: `docs/release-notes-rc4.6.2.md`. Instructions and validation claims apply to that release. + +### Release Candidate 4.6.2 — Game Mods, Safer Updates & Startup + +RC4.6.2 adds optional DSX game-mod support for DualSense triggers and lights, fixes custom-named portable updates, and improves startup recovery and shifted profile settings. + +#### Let supported game mods control triggers and lights + +- New **Settings → Game mod support (DSX)** option for physical **DualSense and DualSense Edge** controllers. It starts **off**; enable it only when using a compatible mod. +- Local mods can control adaptive triggers, lightbar, player lights and the microphone light through the DSX UDP protocol. The default address is **127.0.0.1:6969**; connection details and **Apply / Retry** make a busy port easier to resolve. +- **Trigger Lab takes priority on each enabled trigger.** A mod can control one trigger without blocking the other, and temporary mod settings do not overwrite your profile. +- Resetting the mod, disabling support, stopping DS4Windows or removing the controller releases its overrides and restores the underlying state. +- Native trigger commands retain their order and exact effect data. Repeated trigger-command flags, stale duplicate tracking after a reset, and old callbacks affecting replacement controllers are covered by new regression tests. + +This is **local trigger/light compatibility**, not full DSX replacement or audio/PCM haptics support. Some legacy effects and input-threshold instructions remain unsupported rather than sending guessed commands. Mods should send reset when exiting; disabling the option also releases a held override. See the [setup and compatibility guide](https://github.com/hbashton/DS4Windows/blob/VIIPERRC4.6.2/docs/DSX-game-mod-support.md). + +#### Portable updates keep your custom name (#99) + +- **DS4Updater 2.0.7** preserves the selected application EXE name without adding another canonical `DS4Windows.exe` to a compatible target installation. +- Required DLLs and runtime files retain their correct names. An old default EXE is removed only when the package owns it; unrelated files and profiles are preserved. +- Renaming, clearing a saved name, rollback, and protected setup staging use matching application identities. Unsafe collisions stop before file replacement. +- The new custom-only layout requires **RC4.6.2 / Windows version 5.0.8.0 or newer**. The updater checks the verified target version; it is not locked to one release tag. +- RC4.6.2 requests updater **2.0.7 or newer**, including future verified versions. Portable users should always extract the complete ZIP when updating manually. + +#### Clearer startup recovery (#77) + +- Keep your requested startup preference separate from tasks temporarily disabled while setup needs repair or a reboot. +- Show clearer requested-versus-active startup status and the appropriate next action. +- Stage a protected, narrowly scoped continuation for the next logon after a required reboot, with account, boot, package and hash checks before continuing setup. +- Preserve the original **RunDS4Windows** and **RunVIIPER** task names and explicit startup opt-outs. Driver and broker readiness checks remain required. + +Windows can still deny permissions or require manual repair. Automated recovery tests pass; a complete physical reboot/logon/UAC acceptance test for this change remains outstanding. + +#### Profile reliability and regression coverage (#46) + +- Extras-only shifted bindings keep their activation button through save/load and repeated saves. +- Shift extras can activate without replacing the button's normal action, and release correctly when the source or modifier is released. +- Add non-default settings, culture-independent date, macro value-band and historical profile-migration tests. +- Thanks to **Gabarsolon** for the DSX feature contribution and **anagnorisis2peripeteia / Cameron Beeley** for settings, macro and migration contributions. + +#### Packages and validation + +- Tag: **VIIPERRC4.6.2**. Windows application/MSI/installer version: **5.0.8.0**, advanced for correct upgrade ordering. +- Complete offline x64 installer and portable ZIP, including unchanged **VIIPER 0.1.5-rc4.6**, **USB/IP 0.9.7.7**, the required Xbox output identity, matching sources and notices. No separate broker upgrade is needed. +- Companion updater: **DS4Updater 2.0.7**. Earlier release assets remain unchanged. +- The release candidate passed **6,367 tests with zero failures**, with 11 explicitly gated skips. The warmed native-shadow check measures **zero allocations**; the allocation assertion was not relaxed. +- This is an **unsigned release candidate**. Automated tests, hosted MSI lifecycle checks and package verification do not replace physical controller/game-mod acceptance. Nintendo rumble gain/cadence and PCM audio encoding are not retuned in this release. + +Technical evidence: [PR review](https://github.com/hbashton/DS4Windows/blob/VIIPERRC4.6.2/docs/validation/2026-09-14-pull-request-review.md) and [startup, updater and profile fixes](https://github.com/hbashton/DS4Windows/blob/VIIPERRC4.6.2/docs/validation/2026-09-14-issues-99-77-46.md). + + + +### release-notes-rc4.6.3 + +Original record: `docs/release-notes-rc4.6.3.md`. Instructions and validation claims apply to that release. + +### Release Candidate 4.6.3 — Smooth Profile Switching & Mouse Clicks + +RC4.6.3 fixes temporary-profile switching regressions and overlapping mouse-button bindings and macros. It is built from published main, without the earlier unshipped haptics experiments. + +#### What changed + +- Fix repeated profile loads while holding a temporary-profile switch. Releasing before activation finishes now cancels that activation instead of applying it late. +- Keep the current mapping reporting during profile preparation, and publish the prepared mapping at a guarded boundary. Backend and audio refresh work no longer runs on the physical input queue. +- Preserve held keys through automatic profile press/release transitions. A switch no longer directly releases a key that another held binding still owns. +- Preserve the existing virtual pad for same-output profile changes. There is no fixed activation delay; changing the virtual controller type still requires a real device transition. +- Fence delayed switches and refreshes against disconnects, replacement connections and newer profile selections. +- Keep mouse-toggle state separate for each binding, so unrelated toggled actions cannot block mouse-button presses or releases. +- Keep a mouse button held while any mapped binding or macro still owns it. Ending one macro no longer releases another owner's click. +- Correct FakerInput's X1/X2 side-button event translation. +- Preserve held mouse buttons when switching output backends, and retire old macro input safely on disconnect or Stop. + +#### Validation and limitations + +Targeted regression checks cover temporary-profile press/release with held movement and clicks, early release, rapid re-press, nested temporary profiles, stale connection work, overlapping mouse holds, independent toggles, macro completion and side-button translation. Ordinary **R2 → Left Mouse** combined with cursor movement or keyboard input already passes the baseline tests; it is not newly enabled by this release. + +Local validation: **6,681 tests passed, 0 failed**, with 12 opt-in hardware cases skipped. The profile-switch simulations use the real mapper, serialized profile worker and registered report admission with recording output sinks. They do not claim hardware/game acceptance. See the [profile-switch validation ledger](https://github.com/hbashton/DS4Windows/blob/VIIPERRC4.6.3/docs/validation/2026-09-21-temporary-profile-input-continuity.md). + +The reporter's machine and game have **not** been validated. These fixes do not establish the cause of that report or guarantee that every game accepts simultaneous controller and mouse/keyboard input. See [Troubleshooting mapped mouse clicks](https://github.com/hbashton/DS4Windows/blob/VIIPERRC4.6.3/docs/troubleshooting-mouse-clicks.md) for conditional Windows touchpad guidance and game-specific checks. DS4Windows does not automatically change Windows touchpad settings. + +#### Packages + +- Tag: **VIIPERRC4.6.3**. Windows application/MSI/installer version: **5.0.9.0**, advanced for correct upgrade ordering. +- Complete offline x64 installer and portable ZIP, with unchanged **VIIPER 0.1.5-rc4.6**, **USB/IP 0.9.7.7** and Xbox output identity. No separate broker update is required. +- **DS4Updater 2.0.7** remains compatible; its minimum-version requirement is unchanged. Extract the complete ZIP for manual portable updates. +- This is an **unsigned release candidate**. Publication is gated on exact-source CI, installer lifecycle and downloaded-package checks; automated validation does not replace acceptance on the reporter's hardware and game. + + + +### release-notes-rc4.6.4 + +Original record: `docs/release-notes-rc4.6.4.md`. Instructions and validation claims apply to that release. + +### Release Candidate 4.6.4 — Smoother DualSense Haptics + +Enjoy more detailed, consistent feedback from your DualSense over Bluetooth. This update focuses on keeping both advanced haptics and traditional rumble smooth through busy action scenes. + +#### Improvements and fixes + +- **More faithful advanced haptics:** improved Bluetooth haptic conversion helps preserve the detail and character of supported games' effects. +- **Fewer interrupted effects:** fixes brief gaps that could make closely spaced haptic effects feel incomplete or skippy. +- **Rumble that lasts as intended:** fixes a settings update that could cut an active rumble effect short. Genuine stop commands still stop the effect normally. +- **Adaptive triggers stay responsive:** trigger and lighting updates continue alongside rumble without unnecessarily interrupting it. +- **Matching VIIPER included:** the installer and portable ZIP include the updated backend required for these improvements. + +These improvements apply to DualSense and DualSense Edge over Bluetooth when emulating a DualSense. Advanced haptics require a game that supports them. + +#### Install or update + +##### Recommended: all-in-one installer + +1. Close your games, exit DS4Windows, and quit VIIPER from its tray icon. +2. Download and run **DS4Windows_5.0.10.0_Setup_x64.exe** from the assets below. +3. Follow setup, then reopen DS4Windows and reconnect your controller. Existing profiles are retained. + +##### Portable version + +1. Close your games, exit DS4Windows, and quit VIIPER. +2. Download **DS4Windows_VIIPER_x64.zip** and extract the **entire** ZIP into a new folder. Do not replace just the EXE. +3. Keep a backup of your existing profiles and settings. If you store them beside DS4Windows, copy them into the new folder before launching. +4. Start DS4Windows from the extracted folder. It will start the bundled VIIPER when no other copy is running. On a new PC, complete the driver setup when prompted. + +**For the best experience:** select **DualSense** as your emulated controller, enable controller audio/speaker support for advanced haptics, and restart the game after changing controller emulation. Game support and individual effects vary. + +This is an **unsigned Windows x64 release candidate**. Download only from this repository's release page. No new USB/IP version is required; the supported version remains **0.9.7.7**. + +Thanks for your feedback and patience. Enjoy the update! + + + +### release-notes-rc4.6.5 + +Original record: `docs/release-notes-rc4.6.5.md`. Instructions and validation claims apply to that release. + +A small update to make everyday use smoother. Thanks for helping us catch these issues! + +#### What's fixed + +- Fixed a freeze when opening **Log** after long sessions. +- Made scrolling, clearing and exporting the Log page more reliable. +- Fixed cases where the **DualSense lightbar** did not return to your profile color after closing a game. +- Fixed an update issue that could leave setup stuck on **another installation finishing**. +- **VIIPER repair now keeps DS4Windows open.** Missing or mismatched versions are restored automatically, with the correct download used when needed. +- **Portable stays portable.** VIIPER is repaired beside DS4Windows, without moving your files or changing another installation. +- Removed VIIPER's separate update pop-ups. The matching version now comes with DS4Windows updates. +- Refreshed the [getting-started guide](https://github.com/hbashton/DS4Windows/blob/main/docs/getting-started.md) to make setup easier to follow. + +#### How to update + +1. Close your games, DS4Windows and VIIPER. +2. **Recommended:** download and run **DS4Windows_5.0.11.0_Setup_x64.exe**. Your saved profiles are kept. +3. **Portable:** back up your profiles and settings, then extract the whole **DS4Windows_VIIPER_x64.zip** into your existing portable folder, replacing the packaged app files. Keep your profiles, settings and `portable-data` folder. + +Both downloads include the matching VIIPER. No separate VIIPER update is needed for this hotfix. + +This is an unsigned Windows x64 release candidate, so Windows may show a publisher warning. + +Enjoy, and thanks for your feedback! + + + +### release-notes-rc4.6.6 + +Original record: `docs/release-notes-rc4.6.6.md`. Instructions and validation claims apply to that release. + +A smoother start, easier updates, and better DualSense Edge support. Thanks for helping make DS4Windows more dependable! + +#### What's improved + +- **More reliable VIIPER startup and repair.** Slow startup checks are given time to finish, failed attempts clean up more safely, and retries keep DS4Windows open. +- **Clearer error messages.** If VIIPER cannot start, DS4Windows explains which startup check failed instead of showing only a generic error. +- **Safer app startup.** Opening DS4Windows twice at the same time no longer lets two installed instances compete for your controllers. +- **Fixed the `-autolaunch` update error.** Installed copies use the matching installer; portable copies stay in their own folder. Profiles and settings are preserved. +- **Better DualSense Edge compatibility.** Improved controller identification, motion calibration checks and virtual-controller reports. +- **Native DualSense feedback across both models.** Standard DualSense and DualSense Edge can use the shared advanced haptics and adaptive-trigger path with either emulated model. +- **Safer Edge settings handling.** Unsupported onboard-profile commands are rejected instead of appearing to work or applying incomplete settings. Virtual onboard-profile editing is not included. + +The matching VIIPER is included. You do not need to update it separately. + +#### How to update + +1. Close your games, DS4Windows and VIIPER. +2. **Installer:** download and run **DS4Windows_5.0.12.0_Setup_x64.exe**. Your saved profiles are kept. +3. **Portable:** back up your profiles and settings, then extract the complete **DS4Windows_VIIPER_x64.zip** into your portable folder, replacing the packaged app files. Keep your profiles, settings and `portable-data` folder. + +If your older version shows the `-autolaunch` error when checking for updates, use the installer or complete portable ZIP once to get the corrected update path. + +This is an unsigned Windows x64 release candidate, so Windows may show a publisher warning. Not every Edge feature has been verified on hardware over both USB and Bluetooth; please report any remaining issues with your controller model, connection type and log. + +Enjoy, and thank you for your feedback! + + + +### release-notes-rc4.6 + +Original record: `docs/release-notes-rc4.6.md`. Instructions and validation claims apply to that release. + +### Release Candidate 4.6 Hotfix — Clearer Audio, Reliable Feedback & Disconnects + +RC4.6 brings together the fixes since RC4.5.9: more reliable controller audio, safer feedback delivery under load, and cleaner Bluetooth disconnects. The faster DualSense feedback path from RC4.5.9 stays in place. + +#### Controller audio that starts and stays on the right source + +- **DualSense speaker recovery:** restarting or switching audio sources no longer stalls speaker warmup because an earlier session's counters were reused. +- **Sonar compatibility:** physical DualSense USB and Bluetooth capture use the established Sonar-compatible endpoint capture policy, including audio from an emulated DualShock 4 headset. +- **Keep the source quality:** app and external-endpoint capture for DualSense uses 48 kHz floating-point audio. The virtual DualShock 4 headset endpoint remains at its native 32 kHz; physical DualShock 4 Bluetooth audio keeps its existing codec and rate. +- **Correct USB playback:** different source rates are converted to the physical DualSense output rate instead of being copied frame-for-frame. Large callbacks are no longer truncated, and small callbacks are processed without waiting to fill an extra block. +- **Safer source changes:** old callbacks and buffered samples cannot leak into a replacement source. Capture shutdown and shared-app capture retirement no longer hold the manager lock while waiting on callbacks. + +#### Feedback delivery beyond DualSense + +- **Physical DualShock 4:** fresh motor changes and explicit stops can pass immediately during Bluetooth audio instead of waiting behind the unchanged-state maintenance interval. +- **Physical DualShock 3:** a failed output write remains pending for retry; a newer stop can replace the failed active effect. +- **Switch 2 Pro and Joy-Con 2:** eligible identical commands at an unclaimed pending queue tail can share an entry. Changed effects and stops, A-to-B-to-A sequences, PCM and timed feedback are not folded together. This is a delivery change, not a rumble gain, encoding or cadence retune. +- **Virtual DualShock 4 / VIIPER:** the V3 speaker-output path reserves room for a motor-stop command, preserves ordered changes, and reports a full distinct-command queue instead of silently accepting and dropping its contents. Reconnecting feedback readers cannot let an old connection retire the new owner's state. + +#### Disconnect and profile safeguards + +- **No stale controller row after manual Bluetooth disconnect:** the controller-list and tray commands now request complete removal, rather than depending on a later HID read failure after transport cleanup has already finished. +- **Reject stale Game Bar activation:** delayed compatibility activation rechecks the current profile policy before allocating or rerouting output. Switching to Xbox output, disabling compatibility or selecting input-only mode prevents an old activation request from taking over. + +#### Packages and updating + +- DS4Windows **VIIPERRC4.6**, Windows file/installer version **5.0.6.0**. +- Bundled **VIIPER 0.1.5-rc4.6**, with matching source and notices. USB/IP remains **0.9.7.7**. +- Complete offline installer and portable ZIP, including VIIPER and the required Xbox output identity. Portable users should extract the entire folder. +- The published **DS4Updater 2.0.6** remains compatible; no replacement updater is needed for this version. + +#### Validation and limits + +This is an **unsigned release candidate**. The rebuilt local x64 suite passed **5,717 tests with zero failures**, including eight isolated DS4Windows-to-VIIPER process tests; three live-audio tests remain explicitly gated. Regression coverage exercises speaker priming, sample-rate continuity and channel placement, source retirement, feedback order and stop admission, reconnect ownership, manual removal, and Game Bar activation policy. Allocation-sensitive assertions remain enabled; a traced GC-counter measurement issue was corrected in the test harness without raising the zero-byte limit or changing production behavior. + +Software tests are not a promise of unlimited controller output rates or zero physical latency. Final audio listening, disconnect behavior and gameplay feel still need tester confirmation. The rare once-in-a-day movement interruption remains unattributed; the Game Bar safeguard is not being presented as proof that incident is solved. Genuine disconnect and shutdown neutral-report safety remains intact. + +Detailed source evidence: [cross-controller feedback](https://github.com/hbashton/DS4Windows/blob/VIIPERRC4.6/docs/validation/2026-09-12-cross-controller-feedback.md), [audio and Sonar](https://github.com/hbashton/DS4Windows/blob/VIIPERRC4.6/docs/validation/2026-09-12-sonar-ds4-dualsense-audio.md), [manual disconnect](https://github.com/hbashton/DS4Windows/blob/VIIPERRC4.6/docs/validation/2026-09-14-dualsense-manual-disconnect.md), and [rare input investigation](https://github.com/hbashton/DS4Windows/blob/VIIPERRC4.6/docs/validation/2026-09-14-rare-input-neutral-investigation.md). + + + +### 2026-09-09-rc452-release-notes + +Original record: `docs/validation/2026-09-09-rc452-release-notes.md`. Instructions and validation claims apply to that release. + +### Release Candidate 4.5.2 Hotfix — Joy-Con 1 & Nintendo Options + +Original Joy-Cons join the new Nintendo experience, with easier linking, clearer settings, and live feedback while you remap. This hotfix also corrects stale DualSense compatibility-rumble state associated with the reported Hades II pulsing on a Switch 2 Pro. + +#### Original Joy-Cons, familiar controls + +- Use one original Joy-Con on its own, or link a left and right through the same Controllers-page Link/Unlink buttons used by Joy-Con 2. +- The magnet checkbox now controls automatic pairing for both generations. The old separate Joy-Con global options have been removed. +- Linking keeps the first-selected controller's profile and virtual pad. Saved pairs are remembered; unlinking or losing a half releases held input safely. +- Choose Horizontal or Vertical manually from the controller card. Stick direction and controller artwork follow your choice. +- Use applicable Nintendo profile features with original Joy-Cons: per-hand gyro aiming, aim activation, mode shifting, stick-to-mouse tools, and translated Xbox/DualSense feedback. + +#### Nintendo Options and easier remapping + +- **Switch 2 Controls is now Nintendo Options.** Profiles remain universal: settings stay visible and saved even on controllers that cannot use a particular feature. +- A **Show live preview** button adds controller readings while remapping, without permanently filling the screen. +- Clearer dual-Joy-Con aiming labels explain side swapping, pausing, and the separate aim-activation setting. +- Special Actions now expose the missing C, GL/GR, Capture, Mute, Edge function/paddle, and individual Joy-Con rail buttons as selectable triggers. +- Capture and side-button trigger selections survive reopening. Unrecognized saved trigger names are preserved instead of silently weakening an action's trigger combination. + +#### Rumble and reliability fixes + +- Fixed stale DualSense compatibility rumble being restarted by later non-rumble control reports on Nintendo controllers. This corrects the stale-state path identified in the Hades II diagnostic dump. +- Fresh control commands select the appropriate rumble source; cached audio snapshots cannot bring an old compatibility effect back. +- A fresh zero-motor stop remains stopped even when later audio packets carry an older motor snapshot. Mixed audio/adaptive effects no longer replay old audio samples as sustained vibration. +- **Translate Xbox impulse-trigger vibration** is a separate Advanced option for every controller, independent of Trigger Lab. The Nintendo Options checkbox controls the same saved setting. +- DualSense and DualSense Edge can send Xbox impulses to their adaptive triggers or blend them into body rumble. Turning impulse translation off leaves ordinary body rumble enabled. +- Fixed original Joy-Con paired disconnect behavior and unlinking a session-only pair when its saved-pair file is damaged. +- Fixed upright right-Joy-Con stick-assist input selection while preserving fine axis precision. + +#### Portable updates + +- Safe portable updating uses **DS4Updater 2.0.5**: checked downloads, staged replacement, preserved profiles and pairing data, and rollback on supported failures. +- The updater waits for the relevant apps to close rather than force-killing unrelated copies. Long portable-folder paths are supported. +- The portable ZIP remains complete, including the matching `viiper.exe`, Xbox emulation identity, required runtime, and offline dependency installers. + +#### Before you update + +Close DS4Windows before installing or replacing files, and keep a backup of your profiles. Portable users coming from RC4.5.1 or older should use this ZIP for the initial upgrade; the new safe updater entry point is delivered in 4.5.2. + +Original Joy-Cons do not gain Joy-Con 2's optical mouse or extra hardware. Pairing is within the same generation; mixed original/Joy-Con 2 pairs are not supported. Original holding-style changes save to the current profile; Joy-Con 2 retains its per-controller choice. Original HD rumble approximates translated effects within its packet format, and the new raw-stick calibration wizard is not supported for original Joy-Cons. + +This is an **unsigned release candidate**, not a signed stable release. It uses Windows file version **5.0.5.2**. VIIPER remains the matching **0.1.3-rc4.5** build; a new broker installation is not required solely for this rumble correction. + +Automated regression and packet/lifecycle tests cover these changes. Fresh physical Hades II rumble acceptance, original Joy-Con feedback feel, and a launched-worker end-to-end portable update have not yet been confirmed; please report any problems with the connection type, virtual controller type, and logs. + + + +### 2026-09-09-rc453-release-notes + +Original record: `docs/validation/2026-09-09-rc453-release-notes.md`. Instructions and validation claims apply to that release. + +### Release Candidate 4.5.3 Hotfix — Reliable Stop & Reconnect + +This hotfix addresses a shutdown deadlock that could leave **Stop** disabled until DS4Windows restarted, sometimes alongside a `read failure: 995` message. It also protects a newly reconnected controller from delayed cleanup belonging to its previous connection. + +#### What's fixed + +- Controller-removal callbacks no longer block a worker that Stop is waiting to finish. Cleanup remains serialized and tied to the exact connection. +- DS4 and DualSense recognize error 995 caused by their own deliberate Stop cancellation. Unexpected 995 errors and other read failures still retain their diagnostics and removal handling. +- A worker calling Stop cannot try to join or interrupt itself. +- Delayed removal cannot delete a replacement controller that reused the same device path or address. Hotplug also rejects controllers already being removed. + +#### Before you update + +Close DS4Windows before installing or replacing files, and back up your profiles. Extract the complete portable ZIP; do not replace only `DS4Windows.exe`. Portable users on RC4.5.1 or older should use the ZIP for the initial upgrade—the safe updater entry point arrived in RC4.5.2. + +The portable package remains complete, with the unchanged **VIIPER 0.1.3-rc4.5**, matching `viiper.exe`, Xbox emulation identity, required runtime, and offline dependency installers. No new broker installation is required solely for this hotfix. Portable updating to RC4.5.3 uses **DS4Updater 2.0.6**. + +#### Validation and limits + +The versioned build passed **4,918 automated tests**, with **zero failures** and **11 existing opt-in skips**. This includes **29 new shutdown/reconnect regression cases** and three release-ordering checks. Tests reproduce the stop/removal race and verify cancellation and reconnect ownership; they do not establish physical confirmation of the reporter's session. + +This is an **unsigned prerelease**, not a signed stable release. Release tag: **VIIPERRC4.5.3**. Windows file version: **5.0.5.3**. + + + +### 2026-09-09-rc454-release-notes + +Original record: `docs/validation/2026-09-09-rc454-release-notes.md`. Instructions and validation claims apply to that release. + +### Release Candidate 4.5.4 Hotfix — Read Failure Recovery + +This follow-up makes DS4 Bluetooth recovery safer after an unexpected read failure, including failures that happen **before pressing Stop**. + +#### What's fixed + +- After a terminal Bluetooth read failure, DS4Windows no longer forces another physical output write before removing the failed controller. A stalled output request must not block that recovery path. +- Failed-read cleanup also avoids publishing a fresh effect into the Bluetooth audio lane. +- Normal rumble, lightbar, CopyCat settings and the working control-pipe behavior from issue #84 are unchanged. +- Includes 4.5.3's Stop/removal deadlock and reconnect-ownership fixes. A new regression test verifies the corrected sequence: unexpected read error first, then Stop. + +This fixes application recovery behavior. It does **not** suppress unexpected errors or claim to prevent every Windows read failure. The initiating cause of the reporter's particular 995 remains unconfirmed. + +Validation: **4,927 automated tests passed**, zero failures, with 11 existing opt-in tests skipped. The new recovery regressions failed against their previous behavior before passing with the fixes. + +#### Updating + +Close DS4Windows before updating and back up your profiles. The installer and complete portable ZIP include the required runtime, VIIPER **0.1.3-rc4.5**, Xbox emulation identity and offline dependency installers. + +Portable RC4.5.2 and newer use the already-published [DS4Updater 2.0.6](https://github.com/hbashton/DS4Updater/releases/tag/v2.0.6). Its verified-metadata version handling supports this release without another updater code change. For an initial upgrade from RC4.5.1 or older, extract the complete ZIP into a new folder and copy your settings/profiles. + +Release tag: **VIIPERRC4.5.4**. Windows file version: **5.0.5.4**. This is an **unsigned prerelease**. + + + +### 2026-09-09-rc455-release-notes + +Original record: `docs/validation/2026-09-09-rc455-release-notes.md`. Instructions and validation claims apply to that release. + +### Release Candidate 4.5.5 Hotfix — Reliable Setup & Startup + +This hotfix repairs a setup/startup conflict that could stop an upgrade with **VIIPER/USB-IP setup failed (0x80070001)**, even though the USB/IP driver was healthy. + +#### What's fixed + +- Setup can recover the verified older VIIPER startup registration left behind by the affected build, including a recognized portable-broker target. It saves the original task before changing it. +- DS4Windows no longer redirects the installed startup task to a portable runtime preference or removes the task's ownership marker. +- With installed startup enabled, runtime selection follows the verified installed broker too, so an old portable preference cannot put the next sign-in into a repair loop. +- The app and installer now agree on the broker's startup priority, preventing repeated unnecessary task replacement. +- Owned tasks are updated in place instead of being deleted before replacement. Unrelated startup tasks are preserved. +- When setup cannot safely recover a task, the error identifies the task conflict instead of hiding it behind a generic dependency failure. Retry diagnostics refer to the current attempt. + +Includes the earlier 4.5.3/4.5.4 Stop and read-failure recovery fixes. This hotfix does not change controller input, rumble or USB/IP transport behavior. + +Validation: **4,958 automated tests passed**, zero failures, with 11 existing opt-in skips. Startup ownership/recovery, durable backup and setup-error regression checks also passed. Allocation assertions remain enabled. + +#### Updating + +Close DS4Windows before updating and back up your profiles. The installer and complete portable ZIP include the runtime, VIIPER **0.1.3-rc4.5**, Xbox emulation identity and offline dependency installers. No separate broker update is required. + +Portable RC4.5.2 and newer can use the already-published [DS4Updater 2.0.6](https://github.com/hbashton/DS4Updater/releases/tag/v2.0.6). For an initial upgrade from RC4.5.1 or older, extract the complete ZIP into a new folder and copy your settings/profiles. + +Release tag: **VIIPERRC4.5.5**. Windows file version: **5.0.5.5**. This is an **unsigned prerelease**. diff --git a/README.md b/README.md index df226975..da67f43f 100644 --- a/README.md +++ b/README.md @@ -2,135 +2,56 @@ # DS4Windows 5 -### Feel more. Play your way. +Controller remapping, advanced feedback, and per-game profiles for Windows. -Game-authored DualSense haptics over Bluetooth. Switch 2 controllers on PC. -Profiles that follow the game you're playing. - -**Free and open source.** - -[**Download**](https://github.com/hbashton/DS4Windows/releases) · [Getting started](docs/getting-started.md) · [Community](https://www.reddit.com/r/DS4Windows/) +[**Download**](https://github.com/hbashton/DS4Windows/releases) · [Documentation](docs/README.md) · [Changelog](CHANGELOG.md) · [Community](https://www.reddit.com/r/DS4Windows/) [![Releases](https://img.shields.io/github/v/release/hbashton/DS4Windows?include_prereleases&logo=github&label=release)](https://github.com/hbashton/DS4Windows/releases) [![Main build](https://github.com/hbashton/DS4Windows/actions/workflows/ci-build.yml/badge.svg?branch=main)](https://github.com/hbashton/DS4Windows/actions/workflows/ci-build.yml?query=branch%3Amain) +[![Required USB/IP: usbip-win2 0.9.7.7](https://img.shields.io/badge/USB%2FIP_required-0.9.7.7-blue)](https://github.com/vadimgrn/usbip-win2/releases/tag/v.0.9.7.7) -DS4Windows overview with a connected controller, profile selection, and quick controls - - - -DS4Windows brings controller remapping, native game feedback, and per-game -settings together. Use the controller you enjoy, choose the controller your -game expects, and make the controls your own. - -## Keep the detail. Lose the cable. - -Enjoy accurate, game-authored **DualSense advanced haptics and adaptive -triggers** on DualSense and DualSense Edge—even over Bluetooth. Emulate a -DualSense to receive native feedback from supported PC games, with advanced -haptics kept distinct from ordinary rumble. - -Want to create your own trigger feel? **Trigger Lab** lets you design, preview, -and save effects independently for each trigger, right in your profile. - -## Bring your Switch 2 controller to PC - -Use **Switch 2 Pro over USB or Bluetooth**, or **Joy-Con 2 over Bluetooth**, -with remapping, gyro aiming, and HD rumble. Play with one Joy-Con, link a pair, -or let automatic pairing bring them together. Original Switch Pro and Joy-Con -controllers are supported too. - -**Try DualSense emulation with your Switch 2 Pro or Joy-Con 2:** compatible -games' advanced haptics can be translated into HD rumble. Xbox rumble and -impulse-trigger vibration can be translated too. The result is adapted to -Nintendo's motors; it does not reproduce physical adaptive-trigger resistance. - -## A setup for every game +![DS4Windows VIIPER](docs/images/promo/DS4Windows.webp) -Gyro aiming for a shooter. Different stick curves for a racer. A comfortable -layout for an RPG. Save your mappings, emulated controller, lighting, and -feedback preferences in profiles, then use **Auto Profiles** to switch by -game or application. You can match an executable or window title and assign -profiles to individual controller slots. +DS4Windows overview with a connected controller and profile controls -Import, export, and share your profiles—or switch them yourself whenever -you want. - -## More ways to make it yours - -- **Remap with a live preview.** Assign controller buttons, keyboard keys, - mouse clicks, macros, and special actions while checking your inputs. -- **Aim your way.** Gyro mouse, flick stick, touchpad controls, and dual-Joy-Con - aiming. Joy-Con 2 also supports its optical mouse input. -- **Feel your audio.** Turn game, app, or system audio into haptics on - DualSense and HD rumble on Switch 2 Pro / Joy-Con 2. -- **Put controller audio to work.** Speaker, headset, and microphone routing - for supported PlayStation controllers, including Bluetooth audio. -- **Keep everyday play convenient.** Searchable profiles, HidHide integration - to prevent double input, and Game Bar compatibility. - -Features depend on the physical controller and connection. Native advanced -haptics and game-controlled adaptive triggers also require game support. - -## Your controller in. Your choice out. - -**Physical controllers:** DualShock 4, DualSense, DualSense Edge, DualShock 3, -Switch Pro, Joy-Con, Switch 2 Pro, and Joy-Con 2. Compatible third-party devices -and optional Moonlight/Sunshine input are also supported where their reports -match a supported controller type. - -**Emulated controllers:** Xbox 360, Xbox One / Series, DualShock 4, DualSense, -DualSense Edge, and Switch 2 Pro. Choose the output in your profile; available -inputs and feedback still depend on the controller in your hands. - -## Get playing - -1. Download the newest **release candidate** from [Releases](https://github.com/hbashton/DS4Windows/releases). - Choose the **x64 Setup EXE** for the easiest installation. -2. Follow setup. The matching VIIPER backend and USB/IP driver are bundled; - select **HidHide** to help prevent double input. Restart if prompted. -3. Connect your controller and choose a profile. For Switch 2 Bluetooth, - use DS4Windows' discovery and association controls in **Settings**. -4. Choose your emulated controller. For native DualSense feedback, select - **DualSense** and enable controller audio/speaker support. Turn off - overlapping Steam Input remapping for that game, then launch it. - -**Requirements:** Windows 10 or 11 **x64** and the -[Visual C++ x64 runtime](https://aka.ms/vs/17/release/vc_redist.x64.exe). -The .NET runtime is included. Current builds are release candidates; read the -release notes for known limitations and signing status. - -Prefer portable? Download `DS4Windows_VIIPER_x64.zip` and extract the **entire** -package. See [setup, updates, and troubleshooting](docs/getting-started.md) for -driver requirements and keeping your profiles. + -## Take a closer look +DS4Windows builds on the work of its maintainers, earlier projects and the controller community. -
-Preview button mapping, Auto Profiles, and Trigger Lab +## Features -### Button mapping +- Remap buttons, sticks, touchpad, keyboard, mouse, macros, and special actions. +- Accept supported Moonlight/Sunshine virtual controllers, with an optional direct bridge for a matching Sunshine backend. +- Save per-game profiles and switch them automatically by application or window title. +- Configure gyro aiming, lighting, rumble, audio haptics, and adaptive triggers. +- Receive native DualSense advanced haptics and adaptive-trigger feedback in supported games, including over Bluetooth. -Controller-aware profile editor and button mapping +Supported inputs include DualShock 3/4, DualSense/Edge, Switch Pro, Joy-Con, +Switch 2 Pro, and Joy-Con 2. Outputs include Xbox 360, Xbox One/Series, +DualShock 4, DualSense/Edge, and Switch 2 Pro. Features depend on the +controller, connection, and game. -### Auto Profiles +## Get started -Game and application rules for automatic profile selection +1. Download the **x64 Setup EXE** from [Releases](https://github.com/hbashton/DS4Windows/releases). +2. Follow setup to install the bundled VIIPER backend and USB/IP driver. HidHide helps prevent double input; restart if prompted. +3. Connect your controller and choose a profile and emulated controller. Avoid overlapping Steam Input remapping for the same game. -### Trigger Lab +**Requirements:** Windows 10 or 11 x64 and the [Visual C++ x64 runtime](https://aka.ms/vs/17/release/vc_redist.x64.exe). The .NET runtime is included. -Trigger Lab with independent left and right adaptive-trigger controls +For portable use, extract the entire `DS4Windows__x64.zip`, keeping the +`Lang` folder with the app. See [Documentation](docs/README.md) for +setup, update instructions, and troubleshooting. Read the release notes for +signing status and known limitations. -
+## Project links -## Join in +[Support development](https://www.paypal.com/paypalme/hbashton) · [Report a bug](https://github.com/hbashton/DS4Windows/issues) · [Contribute](contributing.md) · [VIIPER backend](https://github.com/hbashton/VIIPER) · [DS4Updater](https://github.com/hbashton/DS4Updater) -[Report a bug](https://github.com/hbashton/DS4Windows/issues) · -[Share your setup](https://www.reddit.com/r/DS4Windows/) · -[Contribute](contributing.md) · -[Support development](https://www.paypal.com/paypalme/hbashton) +Use the matching backend bundled with DS4Windows. The updater is optional +when downloading and installing updates manually. -This hbashton fork builds on the work of Jays2Kings, Ryochan7, Schmaldeo, and -the DS4Windows community, with thanks to VIIPER, HidHide, usbip-win2, and the -wider controller-research community. +Thanks to hbashton, Jays2Kings, Ryochan7, Schmaldeo, the DS4Windows community, +and the contributors to VIIPER, HidHide, usbip-win2, and controller research. Licensed under [GPL-3.0](COPYING). See [third-party notices](NOTICE.txt). diff --git a/TODO.md b/TODO.md deleted file mode 100644 index 2bed4214..00000000 --- a/TODO.md +++ /dev/null @@ -1,14 +0,0 @@ -# TODO - -* ~~Change stick coordinate clamping for JoyCon. Make initial center offset on first input?~~ -* ~~Expose extra SL and SR buttons for JoyCon Joined mode. Keep using normal SL and SR for Split mode~~ -* ~~Add hooks to keep track of active display monitors for Absolute Mouse~~ -* ~~Figure out desired options for Absolute Mouse support~~ -* ~~Add absolute mouse options for various output types (Sticks and Touchpad)~~ -* ~~Add more localization ready strings~~ -* Try to add some form of Action Set support. Really missing playing Mass Effect 1 and 2 -* ~~Add rotation option for Touchpad Mouse Joystick~~ -* ~~Experiment with XmlSerializer class for reading Profiles.xml data~~ -* ~~Re-check Switch Pro and JoyCon rumble frequency interpretation~~ -* ~~Attempt to add stick delta acceleration for mouse output. Kind of missing that option from my old experiments~~ - diff --git a/contributing.md b/contributing.md index da241862..adaf7b0a 100644 --- a/contributing.md +++ b/contributing.md @@ -1,8 +1,36 @@ -## Pull Requests - -Pull requests for DS4Windows are welcome. Before making a pull request, please -test your changes to ensure that the changes made do not negatively affect -the performance of other parts of the application. Some consideration will -be made during code review to try to tweak the changes in order to improve -application performance. However, there is a chance that a pull request will be -rejected if no reasonable solution can be found to incorporate code changes. \ No newline at end of file +# Contributing to DS4Windows + +Use [this project's issues](https://github.com/hbashton/DS4Windows/issues) and +[pull requests](https://github.com/hbashton/DS4Windows/pulls). +Credit upstream contributors when importing fixes; keep upstream issue links +explicit so readers know which repository they belong to. + +## Report a bug + +Check [Troubleshooting](docs/troubleshooting.md) and search existing reports. +Include app version, Windows build, controller model, USB/Bluetooth connection, +virtual output, installation type, steps and relevant logs. Review logs for +personal data. A reproducible small case is more useful than a long speculation. + +## Propose a change + +Start from the current default branch. Explain the concrete problem, resulting +behaviour and validation. Keep unrelated changes separate. For controller and +audio changes, describe ownership, ordering and performance implications where +relevant. Tests must exercise behaviour rather than merely duplicate implementation. + +Use [Development](docs/development.md) for build/test commands and +[Technical reference](docs/reference.md) for runtime contracts. State which +hardware was tested and which checks remain unverified. Documentation-only +changes need link and content checks; they do not require installing software. + +## Documentation and releases + +- Keep README short and point readers to the documentation index. +- Put user instructions in the maintained guide rather than another root-level copy. +- Keep release history in CHANGELOG.md; retain dated validation as evidence. +- Mark design proposals and historical records clearly. Age alone does not make + an implementation contract obsolete. +- Keep source, package and installer versions coordinated through the + [release workflow](.github/workflows/release.yml). +- Preserve licensing notices and credits. Do not imply that an unsigned build is signed. diff --git a/docs/CONTROLLER_PLATFORM_CHECKPOINT_2026_09_06.md b/docs/CONTROLLER_PLATFORM_CHECKPOINT_2026_09_06.md index 486cde7e..71df7622 100644 --- a/docs/CONTROLLER_PLATFORM_CHECKPOINT_2026_09_06.md +++ b/docs/CONTROLLER_PLATFORM_CHECKPOINT_2026_09_06.md @@ -1,5 +1,8 @@ # Controller platform source checkpoint, 2026-09-06 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](README.md). + + This checkpoint preserves the accumulated Switch 2 Pro/Joy-Con USB/Bluetooth, canonical mapping, feedback/HD-rumble, profile/lifecycle and Xbox One VIIPER output work on `feature/native-udecx-landing-zone`. It is not a release tag or diff --git a/docs/DSX-game-mod-support.md b/docs/DSX-game-mod-support.md index 1854749b..0b35320a 100644 --- a/docs/DSX-game-mod-support.md +++ b/docs/DSX-game-mod-support.md @@ -63,7 +63,7 @@ output semantics are verified. Calibration commands are never forwarded. Mods that require these unsupported modes or DSX-specific app discovery need further compatibility work; they should not be advertised as already supported. -`test_dsx_mod.ps1` queries status by default. Its explicit `-TestEffects` switch +[utils/test_dsx_mod.ps1](../test_dsx_mod.ps1) queries status by default. Its explicit `-TestEffects` switch briefly tests low-force right-trigger resistance and light output, then requests reset. Do not run effect tests while gaming. Unit tests use fake devices and ephemeral loopback ports, not physical controllers. diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..df830aae --- /dev/null +++ b/docs/README.md @@ -0,0 +1,43 @@ +# DS4Windows documentation + +For the current Windows x64 app. Start with the user guides; implementation +contracts and dated validation records are intended for contributors. + +## Explore the app + +![DS4Windows overview](images/tour/overview.png) + +The [illustrated user guide](user-guide.md) walks through +[controllers](user-guide.md#controllers), [profiles and remapping](user-guide.md#profiles), +[Audio Haptics](user-guide.md#audio-haptics), [Trigger Lab](user-guide.md#trigger-lab), +[Auto Profiles](user-guide.md#auto-profiles), [Output Slots](user-guide.md#output-slots) +and [Settings](user-guide.md#settings). Screenshots sit beside the controls they explain. + +## Use DS4Windows + +| Guide | What it covers | +| --- | --- | +| [Getting started](getting-started.md) | Requirements, installation, portable setup, updates and profiles | +| [User guide](user-guide.md) | Controllers, profile editing, auto profiles, output slots, settings and logs | +| [Troubleshooting](troubleshooting.md) | Detection, double input, backend startup, feedback and updates | +| [Swipe profiles](swipe-profiles.md) | Restrict two-finger profile switching | +| [Moonlight / Sunshine](moonlight-support.md) | Accept supported streamed virtual controllers | +| [Flick stick](flick-stick-calibration.md) | Calibration and troubleshooting | +| [Mouse clicks](troubleshooting-mouse-clicks.md) | Diagnosing simultaneous mouse-button mappings | +| [DSX game mods](DSX-game-mod-support.md) | Optional mod integration and its limits | +| [DualSense Bluetooth audio](dualsense-bluetooth-audio-haptics.md) | Audio and haptics transport details | + +## Contribute and maintain + +- [Contributing](../contributing.md): reporting bugs, proposing changes and documentation rules. +- [Development](development.md): build, tests, packaging and code layout. +- [Roadmap](roadmap.md): priorities and proposals, rather than a completed-task list. +- [Release workflow](../.github/workflows/release.yml): upstream build, signing and publication requirements. +- [Installer](../installer/README.md) and [installer validation](INSTALLER_VALIDATION_STRATEGY.md). +- [Translations](dev/translations.md) and [profile schema reference](dev/profile-schema-reference.md). +- [Technical reference](reference.md): runtime contracts and diagnostic tools. +- [Validation archive](validation/README.md): dated tests and investigations. + +Release history belongs in [CHANGELOG.md](../CHANGELOG.md). Keep one canonical +page per topic, and link directly to it. A dated investigation describes its +recorded source and hardware; it does not establish the status of a newer build. diff --git a/docs/RELEASE_CANDIDATE_4_1.md b/docs/RELEASE_CANDIDATE_4_1.md deleted file mode 100644 index 14eddebe..00000000 --- a/docs/RELEASE_CANDIDATE_4_1.md +++ /dev/null @@ -1,94 +0,0 @@ -# Release Candidate 4.1 — Bugfixes and Lower-Latency Audio/Vibration - -RC4.1 is a reliability-focused update for DS4Windows 5. It tightens the -real-time controller path, fixes several first-run and profile-switching -regressions, and makes the new offline installer safer and easier to recover. - -## Faster, more consistent controller feedback - -- DualSense game haptics, Audio Haptics, speaker audio, and controller state - now share a preallocated real-time path with fewer queue handoffs. Feedback - is no longer discarded merely because a scheduling deadline was missed. -- The virtual DualSense input ceiling is now 1,000 Hz. DS4Windows submits only - fresh mapped input, allowing each physical controller to run at its observed - rate without manufacturing duplicate reports or forcing a 200/250 Hz cap. -- Native game haptics, lightbar/player LEDs, adaptive triggers, rumble, and - DS4Windows overrides are merged atomically so state is not replayed, lost, - or applied to the wrong media frame. -- Game ownership now begins only after meaningful output, survives brief idle - periods, and ends with the owning game process. Closing a game immediately - restores the profile lightbar, player LEDs, triggers, and rumble. -- Rumble preview and game-rumble delivery are synchronized across the new - worker threads, fixing missing beats, stuck vibration, and stop/start races. -- Per-app audio and Audio Haptics capture recover after source changes, app - restarts, speaker/headset changes, and stalled loopback sessions. The source - list also has an explicit Refresh action. - -## User-facing bug fixes - -- Rapid profile changes are latest-wins. Stale virtual-device transitions and - UI callbacks are discarded instead of replaying slowly, keeping Quick - Settings, audio routing, and the emulated controller synchronized. -- Two-finger profile swipes track both contacts and issue one switch per - gesture, while Auto Profiles recover from transient evaluation failures and - safely ignore disconnected slots. -- Fresh light/default-theme installations no longer crash on launch because - of a missing `InverseBoolConverter` resource. -- VIIPER microphone status monitoring owns its timeout for the entire request, - preventing profile transitions from disposing a wait handle still used by a - background callback. -- Closed dropdowns no longer change profile, audio, or haptics settings when - the mouse wheel is used to scroll the page. -- The automatic audio source is labeled **Game Audio** and identifies the - exact virtual playback endpoint currently assigned to the controller. - -## Safer all-in-one installation and updates - -- `DS4Windows_5.0.1.0_Setup_x64.exe` is a self-contained offline installer for - DS4Windows, .NET, VIIPER 0.0.8, and usbip-win2 0.9.7.7. HidHide and - FakerInput remain optional checkboxes. The portable ZIP remains separate. -- Unsupported USB-IP versions, mismatched driver files, ABI failures, unsafe - Citrix USB filters, and an incorrect VIIPER binary always open mandatory - guided repair; a saved “do not show again” choice cannot suppress a broken - backend. -- The 0.9.7.8 to 0.9.7.7 USB-IP correction is split safely across a required - reboot. Startup tasks remain disabled until the next boot verifies driver - removal, exact hashes, ABI compatibility, and the VIIPER API. -- Install, update, repair, uninstall, and in-app infrastructure repair are - serialized. Duplicate button clicks and duplicate Burn Plan requests are - ignored, while a competing transaction returns Windows Installer busy - instead of mutating the same files or processes. -- Process preflight now owns the same infrastructure lock as VIIPER repair, so - one setup cannot terminate DS4Windows or VIIPER while another setup is - replacing or validating them. -- Helper logs include a unique start record and matching completion/exit-code - record. Concurrent append attempts are retried, and failure diagnostics stay - available under `%ProgramData%\DS4Windows\Installer`. -- Package composition rejects a stale or mixed `DS4Windows.release` identity - before running WiX. The verified manifest is published before the installer - EXE, making the EXE the final atomic release commit point. -- Updates replace only manifest-owned files. Profiles, settings, logs, and - unrecognized user files are preserved, while partial success never receives - the Ready marker or enabled startup tasks. - -## Validation completed - -- 738 automated regression tests passed; two live audio-capture tests were - skipped because they require an interactive application session. -- The clean self-contained x64 publish, setup helper, custom bootstrapper, - WiX MSI ICE checks, and Burn bundle all built successfully. -- Payload hashes, package ownership, unsafe path checks, optional dependency - conditions, offline layout, clean/update/repair/uninstall ordering, - cancellation, downgrade blocking, collision handling, failure rollback, and - reboot/resume were validated. -- The 0.9.7.8 to 0.9.7.7 reboot-boundary simulation passed, and deliberate - overlapping installer/build attempts failed closed without changing the - completed package manifest. - -## Downloads - -- **Recommended:** `DS4Windows_5.0.1.0_Setup_x64.exe` -- **Portable:** `DS4Windows_VIIPER_x64.zip` - -The installer requests a restart only when USB-IP must be safely installed or -replaced. diff --git a/docs/RELEASE_CANDIDATE_4_2.md b/docs/RELEASE_CANDIDATE_4_2.md deleted file mode 100644 index ef61e3fc..00000000 --- a/docs/RELEASE_CANDIDATE_4_2.md +++ /dev/null @@ -1,45 +0,0 @@ -# Release Candidate 4.2 — Reduce CPU Usage - -RC4.2 cuts VIIPER's controller-emulation overhead while preserving responsive -input, Game Bar navigation, Bluetooth ownership, and clean application-audio -routing. - -## Highlights - -- **Much lower VIIPER CPU usage.** Virtual Xbox 360, DualShock 4, DualSense, - and Switch 2 Pro input writers use adaptive, thread-safe latest-state - delivery instead of busy-looping redundant reports. Fresh input retains a - 1,000 Hz ceiling without manufacturing duplicate traffic. -- **Stable Xbox 360 and Game Bar input.** Profile changes retire temporary Game - Bar companions before a native Xbox pad appears, so the overlay cannot bind - a stale controller that is about to be removed. -- **Lower-latency input without stale queues.** Mapped controller state uses a - bounded latest-wins writer instead of replaying obsolete reports under load. -- **Reliable DualShock 4 Bluetooth ownership.** A temporary HID read drought - no longer tears down a controller that Windows still reports as present. -- **Correct per-app DS4 audio.** Process loopback now consumes exactly one - 8 ms source quantum per encoder tick; PCM is no longer silently discarded, - malformed, or replayed at the wrong effective rate. -- **Game-safe app speaker overrides.** A selected application remains the - controller speaker source when a native PS5 game takes feedback ownership. - Game triggers, LEDs, lightbar, rumble, and haptics are merged atomically - without replacing the app's PCM generation. Audio Haptics Replace remains - authoritative; Mix combines the captured and native game haptics. -- **Stronger capture recovery.** Selected-app speaker audio and Audio Haptics - recover cleanly after source changes, process restarts, and headset/speaker - transitions. -- **Prerelease updates that follow the installed channel.** Release-candidate - users automatically receive newer prereleases; stable users remain on stable - builds, and a newer stable release still takes priority. -- **Cleaner layouts.** Scrollable Audio Haptics, Trigger Lab, Auto Profiles, - and log views no longer place their scrollbar over controls or text. - -## Included software - -- DS4Windows **5.0.2.0** (self-contained x64) -- VIIPER **0.0.9** -- usbip-win2 **0.9.7.7** -- Optional offline HidHide and FakerInput installers - -The standard installer preserves profiles and settings while upgrading only -package-owned files. Portable users can continue using the release ZIP. diff --git a/docs/RELEASE_CANDIDATE_4_3.md b/docs/RELEASE_CANDIDATE_4_3.md deleted file mode 100644 index 80ebebd7..00000000 --- a/docs/RELEASE_CANDIDATE_4_3.md +++ /dev/null @@ -1,35 +0,0 @@ -# Release Candidate 4.3 - Installer Reliability - -RC4.3 pairs DS4Windows 5.0.3.0 with VIIPER 0.1.0 and tightens every standard, -portable, update, repair, and uninstall path around one verified offline -package. - -## Highlights - -- **VIIPER 0.1.0 everywhere.** The tray, Windows executable metadata, API - version, release package, DS4Windows compatibility gate, and both installer - paths all identify the same production backend build. -- **Exact portable compatibility.** A portable VIIPER can run from any - location when its executable matches this release's pinned SHA-256. Users - are not forced into Program Files merely because DS4Windows is portable. -- **Deterministic updates.** Stale installer registrations are retired rather - than relaunched or allowed to block the current package. -- **Fail-closed backend checks.** Missing, outdated, or modified VIIPER - binaries cannot silently start. Repair uses the exact bundled offline - payload and verifies it before virtual controllers are enabled. -- **Safer shared infrastructure.** Updates preserve healthy VIIPER and USB-IP - infrastructure. Uninstall removes only files and tasks owned by the managed - installation. -- **Broader release gates.** Clean install, upgrade, repair, internal repair, - USB-IP removal and recovery, uninstall, reinstall, payload integrity, and - startup behavior are validated before publication. - -## Included software - -- DS4Windows **5.0.3.0** (self-contained x64) -- VIIPER **0.1.0** -- usbip-win2 **0.9.7.7** -- Optional offline HidHide and FakerInput installers - -The standard installer preserves profiles and settings while upgrading only -package-owned files. Portable users can continue using the release ZIP. diff --git a/docs/RELEASE_CANDIDATE_4_4.md b/docs/RELEASE_CANDIDATE_4_4.md deleted file mode 100644 index bebc7459..00000000 --- a/docs/RELEASE_CANDIDATE_4_4.md +++ /dev/null @@ -1,112 +0,0 @@ -# Release Candidate 4.4 - Input Fidelity, Audio Efficiency, and Mute Controls - -RC4.4 pairs DS4Windows 5.0.4.0 with VIIPER 0.1.2. This candidate focuses on -faithful DualSense input transport, lower handoff latency, bounded DualShock 4 -Bluetooth audio ownership, explicit mute behavior, and safer controller and -installer lifecycle handling. - -## Highlights - -- **Ordered DualSense RAW trigger fidelity.** The VIIPER V5 input scheduler - preserves complete press, peak, settled-status, release, and failed-write - retry states instead of collapsing meaningful trigger transitions into one - latest value. Independently timed L2 and R2 peaks remain chronological; the - transport does not synthesize a combined state that the physical controller - never reported. -- **Complete negotiated RAW metadata.** A negotiated raw-input alias receives - the 53-byte V5 state: the established 33-byte mapped state plus validity and - controller-layout flags, the same report's sensor timestamp, and normalized - physical bytes 41 through 55. Legacy aliases keep their established 33-byte - contract. The physical report's authentication tail is intentionally not - copied because mapped virtual reports cannot reuse that authentication tag. -- **Lower-latency input handoff.** DualSense input keeps exactly one HID read - ahead and arms the alternate fixed buffer before parsing, mapping, callbacks, - or virtual publication. The V5 writer wakes for fresh work and prioritizes - ordered edges; it does not hold reads for a four-millisecond coalescing tick - or manufacture duplicate reports. The virtual USB interrupt endpoint remains - the backend's normal one-millisecond presentation opportunity. -- **More efficient DualShock 4 Bluetooth audio.** Enabling controller-speaker - audio creates one bounded owner for capture, encoding, reusable timing, and - HID output. Its 8 ms production clock blocks instead of busy-spinning. - Disabling audio closes capture, joins the encoder, cancels and drains pending - output, sends the ordered audio-off state when possible, and disposes the HID - lane and wait handles before a replacement generation can start. -- **A narrow SteelSeries Sonar capture path.** Ordinary render devices keep the - standard Windows loopback implementation. Only an endpoint with both - SteelSeries Sonar product identity and the Sonar `ROOT\MEDIA` software-adapter - projection selects the short polling loopback path. That path requests a - 4 ms buffer and preserves extensible 32-bit float PCM as float; Windows may - negotiate a different final buffer size. -- **Profile-controlled mute targets.** The new **Mute Button Mutes - Input/Output** master option can target the controller microphone and - built-in speaker independently through their own profile checkboxes. A target - changes only when both its checkbox and the master option are enabled. The - mute LED follows the conventional state: on means muted and off means live. - Enabling this mode disables and greys out mute-button profile switching so - one button press cannot own both actions. -- **Fenced profile-lightbar restoration after game exit.** When the exact - retained foreground lifecycle candidate is confirmed to have exited, - DS4Windows can restore only the configured profile lightbar and player LEDs, - even when the game's final native report was neutral. The candidate must - first have been positively associated with a visual claim while its exact - Process was still running; its physical target, VIIPER stream, feedback - admission, final nonvisual report, and newest native revision must all still - match. A newer or unverified visual writer wins. Game Bar and shell hosts are - negative capture filters, not proof of who wrote a report: if an overlay owns - the foreground window while a new visual claim arrives, DS4Windows safely - leaves that visual state alone. Triggers, rumble, haptics, audio, - microphone/mute, and pacer state remain untouched. The separate exact SDL - bootstrap signature may expire only before any real feedback epoch; neither - policy is sender-PID attribution. -- **Quieter routine logging.** Native-session, idle-report hex, foreground PID - association, and normal process-exit messages no longer crowd the GUI log. -- **Reconnect-safe wired HidHide ownership.** DS4Windows records the live HID - identity before PnP removal and removes only persistent entries that it - inserted. A wired controller that returns under a new HID instance can - enumerate before the new generation is hidden, while user-created rules and - mixed controller/audio USB container nodes remain untouched. -- **More compatible startup repair.** Elevated startup tasks are registered - from schema-validated XML that retains the exact target-user SID, avoiding - ambiguous local-account normalization on affected Windows installations. - Task discovery enumerates and matches the exact root task, so a task that has - not been created is normal absence rather than a failed CIM query. A missing - `VIIPER` Run value is likewise treated as normal first-run state, and foreign - same-name tasks remain protected from replacement or cleanup. -- **VIIPER 0.1.2 throughout the package.** The standard installer and portable - archive use the same pinned production backend build and dependency-license - notice for the supported virtual-controller, microphone, speaker, haptics, - and adaptive-trigger paths. - -## Included software - -- DS4Windows **5.0.4.0** (self-contained x64) -- VIIPER **0.1.2** -- usbip-win2 **0.9.7.7** -- Optional offline HidHide and FakerInput installers - -The standard installer preserves profiles and settings while upgrading only -package-owned files. Portable users can continue using the release ZIP. - -## Validation - -Release coverage exercises ordered trigger epochs, raw-alias negotiation, -failed-write retry, USB and Bluetooth input parsing, the read-ahead lifecycle, -audio start/stop and reconnect races, Sonar endpoint selection and PCM format, -mute persistence and runtime policy, confirmed-exit and unknown-liveness LED -fences, same-process stream/target rebinding, first-command and failed-write USB -ordering, Bluetooth combined-admission ordering, absence of routine lifecycle -logging, HidHide generation changes, and startup-task ownership. Publication -also gates on the Release build and regression suite, installer state-machine -and restart simulations, package manifests, pinned payload hashes, and public -signing requirements. - -## Downloads - -- **Recommended:** `DS4Windows_5.0.4.0_Setup_x64.exe` is the self-contained - offline x64 installer for DS4Windows, VIIPER, and usbip-win2, with optional - HidHide and FakerInput selections. -- **Portable:** `DS4Windows_VIIPER_x64.zip` contains the same DS4Windows and - pinned VIIPER versions without installing DS4Windows itself. - -Download either asset from the -[DS4Windows Releases page](https://github.com/hbashton/DS4Windows/releases). diff --git a/docs/RELEASE_CANDIDATE_4_5.md b/docs/RELEASE_CANDIDATE_4_5.md deleted file mode 100644 index 5ddcf508..00000000 --- a/docs/RELEASE_CANDIDATE_4_5.md +++ /dev/null @@ -1,249 +0,0 @@ -# Release Candidate 4.5 — More Ways to Play - -## The short version - -Switch 2 controllers meet Xbox One / Series emulation, Joy-Cons become more -flexible, and DS4Windows gets a substantial round of everyday reliability and -usability improvements. - -This is the cumulative change from **RC4.3**, including the work developed for -RC4.4. The highlights are Switch 2 Pro support over USB and Bluetooth, wireless -Joy-Con 2 support on their own or as a pair, more expressive feedback conversion, -and a dedicated Switch 2 settings page built around how you actually play. - -It is a **tester release candidate**. There is real Windows and physical-controller -evidence behind important paths, alongside extensive automated coverage; that -does not mean every controller, game and connection combination is certified. -Bluetooth headset audio is not a supported feature of this candidate. - -## Your controller, more choices - -**Xbox One / Series is a virtual-output choice, not a Switch 2-only feature.** -The existing supported physical-controller families can select it through the -normal profile system. Switch 2 input also uses that same mapper and the existing -virtual-output choices, including Xbox 360, DualShock 4, DualSense and Switch 2 -Pro. Existing button assignments and profile tools remain the place to customize -your controls. - -The new Xbox path carries separate body-rumble and left/right impulse-trigger -feedback. Supported DualSense targets can use the existing opt-in trigger -controls; Switch 2 targets convert that extra detail into HD rumble. Controllers -with conventional motors receive a capability-appropriate approximation rather -than being assumed to have hardware they do not contain. - -Windows testing has demonstrated changing USB Pro input, mapped GL/GR rear -buttons, and independently exercised all four Xbox feedback channels. Separate -Windows tests also demonstrated two distinct virtual Xbox controllers at once, -with removal of one leaving the other usable. That is meaningful progress beyond -an output selector or a successful connection message, but not a claim of -universal game compatibility or Xbox-console authentication. - -## Joy-Cons that fit the way you play - -- **One half is a controller.** A remembered Joy-Con can activate on its own; - you do not have to wait for its partner or manually activate it each time. - First-time Bluetooth association remains explicit. -- **Automatic or manual joining.** Automatic pairing combines compatible left - and right halves. With it disabled, use the labeled **Link** buttons: select - one half, then its opposite. Click again to cancel. **Unlink** separates a - pair without forgetting its Bluetooth association. -- **Keep the pad you already had.** Joining retains the selected half's virtual - pad and active profile instead of rebuilding both outputs. Unlinking retains - the pair's output for one half. Physical reconnection still takes time; this - is not advertised as a seamless or instantaneous transition. -- **Upright or sideways.** A single Joy-Con's artwork, mapping targets and - shoulder-button presentation follow its selected holding style. The app does - not pretend to infer that preference from how you happen to move it. -- **Mouse and motion options with context.** Desk-mouse controls are separate - from motion aiming. Gyro output and activation settings sit beside their - explanations, and **Aim with both Joy-Cons (DJG)** is an easy-to-find toggle. - Bluetooth startup now enables the real optical and motion sensors; both - halves have supplied changing sensor data through the profile mapper. - -A newly diagnosed disconnect bug also gets a concrete fix: valid Joy-Con reports -could reset their internal counter and be mistaken for invalid input, tearing -down an otherwise connected half or pair. The corrected handling preserves -connection and timing checks while accepting those legitimate counter changes. - -## Feedback with more of the detail left in - -Switch 2 HD-rumble conversion now pays closer attention to **which side**, **which -frequency band**, and **when an effect peaks**. - -DualSense audio-haptic conversion keeps left and right separate, measures short -attacks within each part of the received audio window, and reduces the chance -that a small ordinary-rumble contribution overrides a stronger authored effect. -Xbox body and impulse effects have more room to overlap without immediately -collapsing to the same maximum strength. Independent controls let you choose -whether to convert DualSense audio haptics, supported adaptive-trigger effects, -and Xbox impulse-trigger detail. - -Held profile and preview rumble now stays serviced instead of expiring after a -brief pulse. Sustained effects receive the refreshes their physical packets need; -finished audio slices are not looped into an unwanted buzz. Stop, profile changes -and replacement effects retain their ordering, including when a write is already -in progress. Shutdown handles a short overlap without falsely abandoning a -healthy controller, while a real timeout still blocks unsafe cleanup. - -These are better-defined, tested conversions—not lossless waveform reproduction. -Switch 2 controllers cannot reproduce a DualSense trigger's mechanical resistance, -and tactile tuning remains something to assess with real games and controllers. - -## Less guesswork in the interface - -Switch 2 controls have their own illustrated, task-based section: desk mouse, -motion aiming, two-hand aiming, feedback, button layers, sticks and calibration. -**Give buttons a second job** includes a control picker and shortcuts into the -existing mapping editor instead of leaving you to locate the next setting. - -Joy-Con artwork now has a fuller, more dimensional silhouette, with matching -hover/highlight areas and uncropped thumbnails. Switch 2 Pro images no longer -resolve as missing files when opening a profile. The C button has its missing -remapping target, and sideways Capture is labeled as Capture without silently -changing its default assignment. - -Readability improvements include themed tooltips that remain legible, clearer -physical-button names, and explicit Link/Unlink labels. Controller Readings now -uses the selected Switch 2 device's live snapshot; Pro gyro-axis handling is -corrected without changing your saved inversion preferences. If you previously -inverted an axis to work around the old behavior, check that preference again. - -Switch 2 controllers also receive distinct, persistent local IDs for display and -**Link Profile/ID**, replacing indistinguishable zero-address labels. A joined -pair has an identity based on its members. These are local installation/Windows -identities—not fabricated Nintendo serial numbers—and USB and Bluetooth remain -separate where a trustworthy cross-transport match is unavailable. - -## The fixes that make the features easier to live with - -- **Connecting, switching and disconnecting:** corrected slot collisions, - stale controller rows after virtual-output replacement, and cross-controller - blocking during another pad's setup. Unnecessary repeated startup-recovery - waits and retired USB/IP reconnect attempts have been reduced or cleaned up. - Real Windows enumeration still sets a floor on switch time. -- **Sony feedback and mute controls:** the cumulative update adds independent - microphone/speaker mute targets, conventional mute-LED behavior, and mutual - exclusion with mute-button profile switching. It also corrects a reproduced - RC4.4 native-media fallback that could unintentionally select ordinary rumble, - plus normal Bluetooth DS4 effect routing. The reported Hades II advanced-haptic - regression still needs its specific game/transport acceptance check. -- **Profile effects after preview:** ending Trigger Lab preview restores the - active profile's ordinary trigger settings when no Lab override is active. -- **Lightbar and audio housekeeping:** guarded profile-lightbar restoration - after a verified game exit, quieter routine logs, more efficient DS4 Bluetooth - audio ownership, and the targeted SteelSeries Sonar capture correction. -- **Safer startup and setup:** startup choices are preserved, renamed application - setup is handled consistently, uninstall-only helpers are cached for future - removal, and VIIPER's tray can recover when Explorer is not ready at login. -- **Updates that move forward:** a newer release candidate is no longer offered - an older RC as an update. Release-candidate ordering is checked separately - from the application's Windows version number. -- **Profiles and persistence:** corrected legacy color-channel loading, more - reliable date/localization handling, calibration-save contention, original - Switch Pro startup/calibration failures, and options-dialog failures involving - multiple Switch 2 controllers. Steam/HidHide reclaim no longer uses the - identified restart-loop path. - -## The portable ZIP brings its own broker - -The portable ZIP now includes `viiper.exe` beside DS4Windows. Opening that -portable package starts its matching broker automatically when needed. A -verified, compatible instance already running from the same portable folder -can be reused; simply being already open is not an error. - -A different or incompatible broker produces a clear close-and-relaunch -message. DS4Windows does not terminate that other instance. It stops only a -broker it started itself when its own session ends, after controller cleanup; -a reused broker remains running. The portable session uses local broker data -and leaves the installed broker and its startup task alone. USB/IP drivers -still need to be installed and pass the existing checks. If Windows denies -driver access, the portable app may need to be run as administrator. - -This behavior belongs to the normal portable ZIP, not a special lab launch. -The managed installer retains its normal backend layout. - -Portable updates currently use a fresh ZIP extracted into a new folder after -closing both apps. The older standalone updater can kill DS4Windows before -broker cleanup and cannot safely replace the bundled running broker in place; -the app explains the safe manual update path instead of launching it. Normal -managed-install update behavior is preserved, including recognition of an -installed folder if an older ZIP updater copied a portable marker into it. - -For managed installs, prefer the full installer. The existing standalone -DS4Updater v2.0.4 has a pre-existing final verification mismatch: it compares -the RC tag number with the Windows file version, so `4.5` and `5.0.5.0` can -produce a false replacement-failure message after a successful copy. Its normal -auto-launch path can still reopen the updated application. This external updater -limitation is not fixed by RC4.5; it does not justify changing either version -scheme or pointing an exact-tag download at a nonexistent numeric release. - -## USB headset output: verified, with clear limits - -The Switch 2 Pro's native Windows USB headphone output was physically verified -through its 3.5 mm jack, including left/right channel assignment and start/stop. -The Switch 2 page explains how to select that endpoint and provides a Windows -Sound settings shortcut. It does not silently replace your default audio device. - -This is the physical controller's USB audio endpoint, not an emulated Xbox -headset. **Headset microphone capture has not been verified. Bluetooth headphone -and microphone audio remain unsupported:** successful Bluetooth command replies -and experimental packet writes did not establish audible output. - -## What the testing does—and does not—say - -The earlier local portable RC4.5 checkpoint passed **4,516 tests twice**, with zero failures and -11 existing opt-in skips each time. A separate run passed all **152 -allocation-named tests**. Existing CI exclusions remained unchanged; failed -intermediate runs led to investigated fixes, not relaxed assertions. The -[portable startup qualification](validation/2026-09-08-portable-broker-startup.md) -records these runs and replacement packages. The earlier -[qualification record](validation/2026-09-08-rc45-qualification.md) preserves -the initial 4,463-test RC4.5 checkpoint, distinct from the older 4,426-test -controller checkpoint. - -The later publication checkpoint, with release-policy coverage and the verified -GitHub-built VIIPER artifact, passed **4,536 CI-filtered tests** and then **4,539 -unfiltered local tests**, with zero failures and the same 11 opt-in skips. The -three extra cases are legacy profile/settings tests. The [publication record](validation/2026-09-09-github-rc45-publication.md) -distinguishes these final broker pins from the earlier local kit and records -the complete broker CI and installer lifecycle gates. - -All eight opt-in Xbox client/broker process-integration cases also passed -separately at the recorded broker source checkpoints. Those use isolated loopback -connections and simulated native attachment; they do not count as additional -physical-controller tests. - -Physical evidence includes USB Pro input and feedback, Bluetooth controller and -sensor activity, native USB headphone output, and Windows virtual-pad lifecycle -checks. Newest UI, disconnect, sustained-rumble and combined-package changes -still need fresh tester acceptance. Test results are not a measurement of -controller-to-game latency. - -The shipping path remains **VIIPER plus USB/IP**. This candidate does not claim -a completed native-driver backend, 0.125 ms input latency, a measured -multi-controller latency cure, or zero-time virtual-pad switching. Joy-Con 2 USB -support and the complete source/target/game matrix are not certified here. - -For the most useful feedback, include the physical controller, USB or Bluetooth, -selected virtual pad, profile, game, and what happened immediately before the -problem. Try single and joined Joy-Cons, profile/output switching, held rumble -followed by Stop, and power-off/reconnect. Those everyday transitions are where -this candidate most needs to earn its release status. - -## Evidence behind this assessment - -This assessment covers `VIIPERRC4.3` through the RC4.5 source preparation, -including the [RC4.4 feature set](RELEASE_CANDIDATE_4_4.md). Detailed records: - -- [Current controller fixes, repeated full-suite results and remaining acceptance](validation/2026-09-08-controller-followup-rollup.md) -- [Reported-bug fixes](validation/2026-09-08-github-reported-bugs.md) and [startup/setup/tray follow-up](validation/2026-09-08-reported-issues-follow-up.md) -- [Installer registration regression and existing-machine cleanup](validation/2026-09-08-installer-duplicate-arp-entries.md) -- [Joy-Con standalone activation](protocols/switch2-joycon-automatic-activation.md), [Link/Unlink handoff](validation/2026-09-06-joycon-link-handoff.md), and [Windows multi-pad evidence](protocols/switch2-cross-slot-and-pad-switch-recovery.md) -- [Switch 2 playstyle interface](validation/2026-09-06-switch2-playstyle.md) and [physical Bluetooth sensor observations](validation/2026-09-06-joycon-bluetooth-sensors.md) -- [Haptic detail conversion](protocols/switch2-haptic-detail-rendering.md), [held-rumble and shutdown validation](validation/2026-09-08-switch2-held-rumble-maintenance.md), and [Xbox feedback capabilities](protocols/xbox-one-physical-output-policy.md) -- [Physical USB headphone evidence](validation/2026-09-06-switch2-pro-usb-audio.md), [Bluetooth audio limits](validation/2026-09-08-switch2-bt-receiver-plans.md), and [DualSense regression scope](dualsense-rc43-rc44-native-haptics-regression.md) - -Reference implementations and protocol research—including Switch2Connect, SDL, -PadForge/HIDMaestro, and Nintendo/Microsoft protocol work—were used where -relevant. Their demonstrated behavior informed the implementation; a feature -working upstream was not counted as a DS4Windows hardware test. diff --git a/docs/RELEASE_CANDIDATE_4_5_1.md b/docs/RELEASE_CANDIDATE_4_5_1.md deleted file mode 100644 index 4519c5ef..00000000 --- a/docs/RELEASE_CANDIDATE_4_5_1.md +++ /dev/null @@ -1,51 +0,0 @@ -# RC4.5.1 — Switch 2 Rumble Hotfix - -This hotfix addresses Switch 2 rumble regressions introduced in RC4.5 and -completes the Xbox One/Series configuration in both download packages. - -> I highly recommend using an Emulated Dualsense controller with a Switch 2 Pro controller: it provides the best haptic feedback and playing experience - -## Fixes - -- **Gentler connection and identification cues:** finite effects no longer - repeat as sustained rumble. The original effect strengths and frequencies - are preserved. -- **More consistent sustained rumble:** recover promptly from brief output - contention without sending duplicate packets too quickly or replaying a - backlog. This targets the avoidable gaps affecting Test Heavy, Test Light, - and held game rumble over USB and Bluetooth. -- **Safer retries:** a queued Bluetooth one-shot is retried as the same effect - instead of being enqueued again. Temporary timing or worker failures no - longer permanently stop held-output maintenance. -- **Complete Xbox output configuration:** both the installer and portable ZIP - include the selected Windows Xbox One/Series identity configuration, fixing - the missing-file output-validation failure that could reject Joy-Con - activation when its profile selected Xbox output. - -DualSense PCM haptics, adaptive-trigger translation, Xbox impulse feedback, -left/right routing, and immediate Stop handling retain their existing paths. -This is a timing and effect-lifetime correction, not a new rumble intensity -curve or codec. - -## Downloads and upgrading - -- **Installer:** `DS4Windows_5.0.5.1_Setup_x64.exe` — complete offline setup. -- **Portable:** `DS4Windows_VIIPER_x64.zip` — extract the entire folder and run - `DS4Windows.exe`; the included VIIPER starts automatically. Close other - DS4Windows/VIIPER copies before launching a different portable folder. - -Windows build **5.0.5.1**, release **VIIPERRC4.5.1**. VIIPER remains the -hash-pinned **0.1.3-rc4.5** build, and USB/IP remains **0.9.7.7**. -Use the standard installer EXE for managed upgrades rather than installing -the embedded MSI directly. - -This is an **unsigned release candidate**, not a signed stable release. -Xbox emulation targets Windows; it does not provide authentication for a -physical Xbox console. The included synthetic emulation identity is not a -claim of hardware certification or universal game compatibility. - -Automated tests and artifact checks validate the covered code and package -paths. Please report remaining stutter with the controller model, USB or -Bluetooth connection, virtual output type, and whether it occurs in the -Heavy/Light tests or a specific game. Physical feel can vary and remains part -of release-candidate testing. diff --git a/docs/concepts/stick-calibrator-concept.md b/docs/concepts/stick-calibrator-concept.md new file mode 100644 index 00000000..8fe43b59 --- /dev/null +++ b/docs/concepts/stick-calibrator-concept.md @@ -0,0 +1,72 @@ +# Concept + +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + +Stick drift is an issue most controllers will suffer from at some point in their life, therefore a tool that would +recalibrate it would be very helpful. + +## Ways of dealing with the problem +There are potentially 2 ways of dealing with stick drift: + +### Window of motion manipulation +This method would be about making the _window_ of motion smaller, in such way that its center aligns with drifted +stick's center. + +#### Implementation +Implementation of this method should be as simple as: +- finding out the amount of units the stick drifts by +- subtracting/adding that amount to the raw input +- making sure the value doesnt fall outside the 0-255 range + +#### Tradeoffs +Implementing this would mean that the side opposite to the one in which the stick drifts to would have a +slight deadzone at one end and would never go to the full value at the other end. The example would be: + +We find out that the stick in its physically centered state has X axis reading of 132. This means that it drifts by +5 +units, which in turn means that it's aligned slightly to the right. To counteract that, we subtract 5 units from the X +axis reading. + +If we move the stick fully to the left, the value of the axis is 0 (-5, but it falls out of range of 0-255, so +it's clamped to 0). + +However, if we move the stick fully to the right its raw value is 255, but it's translated by the calibrating tool +to 250. + + +### Scaling +Another way would be to translate the stick input so that the full window of motion is used, but the input is scaled, +so that the full range of motion is used (0-255). We would use different coefficients for each side the stick moves in, +so that we avoid having deadzones or unreachable values on either side. + +#### Implementation +Implementation of this method should be slightly more complicated than that of window shrinking. It would involve: +- finding out the amount of units the stick drifts by +- the raw value of 127 + drift amount should translate to 127 +- calculate 2 coefficients for each side the stick can move in (ranges of `<0; (127 + drift value))` and +`((127 + drift value); 255>`) +- translate the raw value using the coefficient determined by the current raw value + +#### Tradeoffs +Main tradeoff would be the fact of scaling rather than the output being a linear representation of the input, however +the stick drift should never be so big that it becomes a problem or even noticable. + + +## Pros and cons of each option +The first option should work fairly well in most of the cases given the stick drift is not too big. If it's only a few +units that it drifts by, the deadzone at the _shorter_ side and lack of the top end at the _longer_ side should not +even be noticable. It's also easier to implement, as it only involves checking the amount by which the stick drifts +and then making simple addition/subtraction operations. + +The second option will ensure that the output stick value range of 0-255 remains +intact. It might be better for more severe cases of drift, or where the lack of that top-end value would be a problem. +It might add a bit of CPU overhead, however pre-calculating the values and saving them to a Dictionary, and then just +performing a lookup rather than calculating the value in real time might be a good consideration. + +## Real world implementation +- In profile settings, in the `Axis Config` tab, create an option to open a calibration tool. +- It should open a new window +- The window should prompt the user to move the stick determine the physical centered state of the stick by e.g. +flicking it in a few different directions and letting it recenter itself +- The drift values in both axes should be calculated and then saved to a config file +- Appropriate translations should be performed **before any other input manipulation (any settings in the `Axis Config` +tab, like deadzone, sensitivity, etc.)** diff --git a/docs/dev/profile-schema-reference.md b/docs/dev/profile-schema-reference.md new file mode 100644 index 00000000..26ece75c --- /dev/null +++ b/docs/dev/profile-schema-reference.md @@ -0,0 +1,43 @@ +# Profile schema history + +[Documentation index](../README.md) + +This reference preserves early profile-format changes; it is not the app release +changelog or an exhaustive description of the current profile fields. Inspect +`DS4Windows/DS4Control/DTOXml/ProfileDTO.cs` and round-trip tests for the current schema. +App/file versions and profile `config_version` are separate values. + +This document will present some of the distinctive (mostly backwards incompatible) +changes that justify incrementing the version number for the profile schema. +The **config_version** attribute in a profile will describe the last known schema +used to write out a profile. Some older profiles did not contain the +**config_version** attribute so tags used in the profile might have to be examined +to determine an approximate version number corresponding to the schema version. + +### 5 (DS4Windows 2.1.15) + +Replace old **UseTPforControls** option with a new **TouchpadOutputMode** +option. Will likely be used in the future to allow for more than two +modes for the Touchpad. Adding absolute mouse pointer support is one +idea + +### 4 (DS4Windows 2.1.6) + +Replace **GyroSmoothing** and **GyroSmoothingWeight** and bundle new tags +in the **GyroMouseSmoothingSettings** group. Allow 1 Euro Filter options + +### 3 (DS4Windows 2.1.3) + +Version 3 was the first profile schema to have a **config_version** +specified. It was used primarily as a placeholder. I don't know +if the schema really changed from what would be considered +version 2 + +### 2 + +Changed default values for **LSDeadZone** and **RSDeadZone**. +Added anti-dead zone info + +### 1 (DS4Windows 1.4.52) + +Initial schema as used in the last Jays2Kings build (1.4.52) diff --git a/docs/dev/translations.md b/docs/dev/translations.md new file mode 100644 index 00000000..5dcaf432 --- /dev/null +++ b/docs/dev/translations.md @@ -0,0 +1,22 @@ +# Translations and packaging + +[Documentation index](../README.md) · [Development](../development.md) + +Edit `DS4Windows/Translations/Strings..resx` for UI translations; +`Strings.resx` supplies neutral English text. Use the existing resource keys and +preserve format placeholders. Check the translated text in the corresponding UI. + +Developer builds can use the standard `` satellite layout. Release +packaging uses `utils/post-build.py` to collect resource assemblies into +`Lang/` alongside DS4Windows. Keep this entire folder in installer and +portable distributions, including dependency resources such as TaskScheduler's. + +The app's resource resolver handles the packaged layout, parent-culture fallback +and neutral fallback. The former post-build GOTO edits and dependency-file +injection instructions are obsolete; do not patch `DS4Windows.deps.json` to make +translations load. + +Run the [satellite resource probe](../../utils/SatelliteResourceProbe/README.md) +and packaging regression checks when changing translation loading or layout. +They check actual UI and dependency resources from both the package directory +and an unrelated working directory. diff --git a/docs/development.md b/docs/development.md new file mode 100644 index 00000000..6ffa0d74 --- /dev/null +++ b/docs/development.md @@ -0,0 +1,63 @@ +# Development + +[Documentation index](README.md) · [Contributing](../contributing.md) + +## Build on Windows + +Use Windows x64, Git and the .NET 8 SDK. Python 3.10 or newer is used by the +packaging scripts. The current VIIPER distribution targets Windows x64 even +though legacy x86 project configurations remain in the solution. + +From the repository root: + +```powershell +dotnet restore .\DS4WindowsWPF.sln +dotnet build .\DS4Windows\DS4WinWPF.csproj -c Release -p:Platform=x64 +dotnet test .\DS4WindowsTests\DS4WindowsTests.csproj -c Release -p:Platform=x64 +``` + +The WPF application project is `DS4Windows/DS4WinWPF.csproj`. Open +`DS4WindowsWPF.sln` for Visual Studio development. Use a compatible Windows SDK +for the project's Windows target. Building does not install drivers or establish +hardware compatibility; use a supported matching package for controller testing. + +## Publish and package + +```powershell +$packageVersion = "VIIPERRC4.6.6" # Match the intended InformationalVersion +dotnet publish .\DS4Windows\DS4WinWPF.csproj -c Release -p:Platform=x64 -r win-x64 --self-contained true -p:InformationalVersion=$packageVersion -o .\bin\x64\Release\output +python .\utils\post-build.py .\bin\x64\Release\output . $packageVersion +``` + +The final argument is the package version; choose the intended version for your +build. The script requires the complete offline payload, adds the portable +backend and marker, and places satellite assemblies under `Lang/`. +Do not distribute a partial build directory or manually repack selected files. +See [Translations](dev/translations.md) for resource-loading checks. + +Installer authoring and validation are documented in [installer/README.md](../installer/README.md). +Official releases use the [release workflow](../.github/workflows/release.yml), not a local +development ZIP. App/file and installer versions advance together for each release. + +## Code and evidence + +| Location | Contents | +| --- | --- | +| `DS4Windows/DS4Forms` | WPF views and handlers | +| `DS4Windows/DS4Control` | Controller, mapping and settings services | +| `DS4WindowsTests` | Automated regression tests | +| `utils` | Packaging, validation and diagnostic tools | +| `installer` | Installer projects and scripts | +| `docs/protocols` | Runtime and transport contracts | +| `docs/validation` | Dated investigations and test records | + +CI runs the full x64 suite and packaging/installer checks. Run focused tests +while developing, then the checks relevant to your change before proposing it. +Document opt-in hardware tests and skipped checks explicitly. Avoid rewriting +older evidence to make a newer result look like it was tested historically. + +## Documentation changes + +Keep README concise, user instructions in `docs`, and release history in +CHANGELOG.md. Update links after moves and remove redundant pointer files. +Preserve substantive historical records, third-party notices and contributor attribution. diff --git a/docs/dualsense-rc43-rc44-native-haptics-regression.md b/docs/dualsense-rc43-rc44-native-haptics-regression.md index 57df6193..d982940f 100644 --- a/docs/dualsense-rc43-rc44-native-haptics-regression.md +++ b/docs/dualsense-rc43-rc44-native-haptics-regression.md @@ -1,5 +1,8 @@ # RC4.3 to RC4.4 native DualSense haptics regression audit +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](README.md). + + Evidence checkpoint: September 5, 2026. The user reports that Hades II's advanced feedback worked with a physical DualSense emulating a DualSense in RC4.3, but not in the released RC4.4. This audit has reproduced and corrected diff --git a/docs/getting-started.md b/docs/getting-started.md index 5298398c..a086d4ff 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -17,8 +17,7 @@ The Visual C++ runtime remains a separate system prerequisite. ## Install Download only from [this repository's Releases page](https://github.com/hbashton/DS4Windows/releases). -Current DS4Windows 5 builds are release candidates; check the notes for -limitations and signing status. +Check the release notes for package requirements, signing status and limitations. Use the matching app, updater and backend supplied by the release. ### Recommended: all-in-one installer @@ -34,8 +33,9 @@ avoid independently upgrading or downgrading USB/IP for this installation. ### Portable ZIP -1. Extract **all** of `DS4Windows_VIIPER_x64.zip` into a permanent, writable folder. +1. Extract **all** of the release's `DS4Windows__x64.zip` (older RCs use `DS4Windows_VIIPER_x64.zip`) into a permanent, writable folder. Do not launch from inside the ZIP or copy only `DS4Windows.exe`. + Keep the `Lang` folder with the application; it contains the translations. 2. Run `DS4Windows.exe` from that folder. On a new PC, complete driver setup when prompted; portable does not mean driver-free. 3. DS4Windows starts its bundled VIIPER when needed. A verified matching @@ -51,8 +51,8 @@ closing DS4Windows. Controller output pauses briefly during an active repair. ## Connect and choose a profile Connect a supported controller and select it in DS4Windows. Controller-family -options are in **Settings > Device Options**; optional Moonlight/Sunshine input -must be enabled separately. Some devices, including DualShock 3, need their +options are in **Settings > Controllers > Device Options**; optional Moonlight/Sunshine input +must be enabled separately; see [Moonlight / Sunshine](moonlight-support.md). Some devices, including DualShock 3, need their own compatible driver setup. For **Switch 2 Pro**, use USB or DS4Windows' Bluetooth discovery and @@ -91,16 +91,14 @@ updating, especially when moving between versions or installation types. Settings may be in `%APPDATA%\DS4Windows` **or beside the application**, depending on your configuration. Check both before removing an old portable folder. -Follow the release's update instructions when a matching backend update is -required. In-app update checks use this fork's releases; stable builds do not -automatically install prereleases. +Follow the release's update instructions when a matching backend update is required. Use the matching updater or download the complete package from [DS4Windows Releases](https://github.com/hbashton/DS4Windows/releases). ## If something isn't working - **Double input:** check HidHide is installed and enabled for the physical controller, then disable overlapping remapping software for the game. - **No virtual controller / backend not ready:** follow the displayed startup - error. Use **Settings > Install / Repair VIIPER** when requested, and restart + error. Use **Settings > Controllers > Install / Repair VIIPER** when requested, and restart only if setup asks. Keep DS4Windows and its bundled VIIPER version together. - **No native haptics:** confirm the game supports them, the profile emulates DualSense, controller audio/speaker support is enabled, and Steam Input is diff --git a/docs/images/audio-haptics.png b/docs/images/audio-haptics.png index ebf804c1..f416e2ce 100644 Binary files a/docs/images/audio-haptics.png and b/docs/images/audio-haptics.png differ diff --git a/docs/images/profile-editor-current.png b/docs/images/profile-editor-current.png index b12ff55e..4ccb7448 100644 Binary files a/docs/images/profile-editor-current.png and b/docs/images/profile-editor-current.png differ diff --git a/docs/images/promo/DS4Windows.webp b/docs/images/promo/DS4Windows.webp new file mode 100644 index 00000000..ff30d8d1 Binary files /dev/null and b/docs/images/promo/DS4Windows.webp differ diff --git a/docs/images/tour/audio-haptics.png b/docs/images/tour/audio-haptics.png index 65fb0906..cbf3b89b 100644 Binary files a/docs/images/tour/audio-haptics.png and b/docs/images/tour/audio-haptics.png differ diff --git a/docs/images/tour/auto-profiles.png b/docs/images/tour/auto-profiles.png index ba99cf2c..f4b4166b 100644 Binary files a/docs/images/tour/auto-profiles.png and b/docs/images/tour/auto-profiles.png differ diff --git a/docs/images/tour/controllers.png b/docs/images/tour/controllers.png index d9f336b3..3333ac8f 100644 Binary files a/docs/images/tour/controllers.png and b/docs/images/tour/controllers.png differ diff --git a/docs/images/tour/output-slots.png b/docs/images/tour/output-slots.png index b79dce50..126ee25e 100644 Binary files a/docs/images/tour/output-slots.png and b/docs/images/tour/output-slots.png differ diff --git a/docs/images/tour/overview.png b/docs/images/tour/overview.png index 68a4b6a8..22f9b909 100644 Binary files a/docs/images/tour/overview.png and b/docs/images/tour/overview.png differ diff --git a/docs/images/tour/profile-editor.png b/docs/images/tour/profile-editor.png index 2d84b523..2ca6c7ab 100644 Binary files a/docs/images/tour/profile-editor.png and b/docs/images/tour/profile-editor.png differ diff --git a/docs/images/tour/profiles.png b/docs/images/tour/profiles.png index 115f68d0..8669a439 100644 Binary files a/docs/images/tour/profiles.png and b/docs/images/tour/profiles.png differ diff --git a/docs/images/tour/remapping-dialog.png b/docs/images/tour/remapping-dialog.png index 4ede3e10..8be87992 100644 Binary files a/docs/images/tour/remapping-dialog.png and b/docs/images/tour/remapping-dialog.png differ diff --git a/docs/images/tour/settings.png b/docs/images/tour/settings.png index ef81c3df..bdb60d27 100644 Binary files a/docs/images/tour/settings.png and b/docs/images/tour/settings.png differ diff --git a/docs/images/tour/trigger-lab.png b/docs/images/tour/trigger-lab.png index 9b25477a..f9f9fe68 100644 Binary files a/docs/images/tour/trigger-lab.png and b/docs/images/tour/trigger-lab.png differ diff --git a/docs/moonlight-support.md b/docs/moonlight-support.md new file mode 100644 index 00000000..9d89543e --- /dev/null +++ b/docs/moonlight-support.md @@ -0,0 +1,42 @@ +# Moonlight / Sunshine virtual controller support + +[Documentation index](README.md) · [Troubleshooting](troubleshooting.md) + +On the Windows PC running Sunshine and DS4Windows, open **Settings > Controllers > Device Options** and enable **Accept Moonlight / Sunshine virtual controllers**. +Connect from Moonlight with controller input enabled, then select a DS4Windows +profile for the detected input. + +This accepts supported virtual HID controllers while the local Sunshine host +is running. A virtual device still needs a supported device identity and report +format; the option does not make every virtual controller compatible. +DS4Windows always excludes its own VIIPER outputs to prevent a feedback loop. +Physical supported controllers do not depend on this setting. + +## Direct controller bridge + +**Enable Sunshine direct controller bridge** is a separate Device Options +setting. Enable the matching option in a compatible Sunshine backend too. +Sunshine sends input directly to DS4Windows, which creates the game-facing +virtual controller; this path does not create a separate Sunshine virtual +input controller. The direct bridge setting alone does not add this feature +to a Sunshine build that lacks the matching backend. + +## Troubleshooting + +- Confirm Sunshine is running on this PC and Windows sees the streamed controller. +- Enable the option on the Sunshine host, not merely on the Moonlight client. +- Check overlapping Steam Input/remapping and HidHide visibility if detection + or game input is incorrect. +- If virtual input is repeatedly added or input loops, export the DS4Windows log + and report the controller identity, profile output and connection procedure. + +The old separate Advanced Support mode and global five-second connection delay +are not part of the current admission policy. Do not use their old instructions. + +## Implementation + +See [MoonlightVirtualDevicePolicy.cs](../DS4Windows/DS4Library/MoonlightVirtualDevicePolicy.cs), +[DS4Devices.cs](../DS4Windows/DS4Library/DS4Devices.cs), and +[policy tests](../DS4WindowsTests/MoonlightVirtualDevicePolicyTests.cs). +The current automated tests verify admission rules; they do not establish +streaming compatibility for every controller or host configuration. diff --git a/docs/protocols/README.md b/docs/protocols/README.md new file mode 100644 index 00000000..cf3458d5 --- /dev/null +++ b/docs/protocols/README.md @@ -0,0 +1,69 @@ +# Runtime and protocol reference + +[Documentation index](../README.md). These implementation contracts accompany +the source and tests. Read dated experiments as historical evidence, and use the +user guide for setup. + +- [Continuous custom-curve evaluation](continuous-bezier-evaluation.md) +- [Legacy HID shared-slot authority](legacy-hid-shared-slot-authority.md) +- [Legacy HID worker-lifecycle boundary](legacy-hid-worker-lifecycle.md) +- [Legacy Joy-Con report ownership audit, 2026-09-02](legacy-joycon-report-ownership.md) +- [Mapping-owned stick precision migration](mapped-stick-axis-precision.md) +- [Owned motion observations, 2026-09-02](owned-motion-observations.md) +- [Profile-load content preparation, 2026-09-04](profile-load-preparation.md) +- [Report diagnostics ownership](report-diagnostics-ownership.md) +- [Switch 2 Bluetooth controller-side association](switch2-bluetooth-association.md) +- [Bluetooth disconnect retirement — September 5, 2026](switch2-bluetooth-disconnect-retirement.md) +- [Switch 2 Bluetooth discovery boundary](switch2-bluetooth-discovery-boundary.md) +- [Switch 2 Bluetooth HD-rumble envelope](switch2-bluetooth-hd-rumble-envelope.md) +- [Switch 2 Bluetooth read-only input transport foundation](switch2-bluetooth-input-transport.md) +- [Switch 2 Bluetooth runtime input sink](switch2-bluetooth-runtime-input-sink.md) +- [Switch 2 Windows BLE discovery, association, and input adapter](switch2-bluetooth-windows-adapter.md) +- [Switch 2 body-rumble profile gain](switch2-body-rumble-profile-gain.md) +- [Switch 2 Cemuhook yaw sensitivity](switch2-cemuhook-yaw-sensitivity.md) +- [Switch 2 connection confirmation haptic](switch2-connection-haptic.md) +- [Switch 2 ControlService reversible profile staging and gyro dispatch](switch2-controlservice-reversible-profile-staging.md) +- [Switch 2 ControlService slot boundary (dormant)](switch2-controlservice-slot-boundary.md) +- [Cross-slot input isolation and virtual-pad recovery, 2026-09-06](switch2-cross-slot-and-pad-switch-recovery.md) +- [Switch 2 DualSense feedback conversion policy](switch2-dualsense-conversion-policy.md) +- [Switch 2 face-button layout](switch2-face-button-layout.md) +- [Switch 2 stationary gyro calibration persistence](switch2-gyro-calibration-persistence.md) +- [Switch 2 in-app gyro lock](switch2-gyro-lock.md) +- [Switch 2 in-app gyro trigger stabilization](switch2-gyro-trigger-stabilization.md) +- [Switch 2 haptic detail rendering — September 5, 2026](switch2-haptic-detail-rendering.md) +- [Switch 2 high-rate mouse presentation](switch2-high-rate-mouse-presentation.md) +- [Switch 2 interactive controller identification](switch2-interactive-identification.md) +- [Automatic standalone Joy-Con 2 activation (b80)](switch2-joycon-automatic-activation.md) +- [Switch 2 Joy-Con IR mouse profile lane](switch2-joycon-ir-mouse-profile-lane.md) +- [Switch 2 Joy-Con profile-input boundary](switch2-joycon-profile-input.md) +- [Switch 2 magnetometer calibration](switch2-magnetometer-calibration.md) +- [Switch 2 Mode Shift mapping layer](switch2-mode-shift.md) +- [Switch 2 Phase 1 codec and replay boundary](switch2-phase1-codec.md) +- [Switch 2 physical input admission boundary](switch2-physical-input-boundary.md) +- [Pro Bluetooth counter continuity: September 5, 2026](switch2-pro-bluetooth-counter-continuity.md) +- [Switch 2 Pro profile-input boundary](switch2-pro-profile-input.md) +- [Pro USB counter continuity](switch2-pro-usb-counter-continuity.md) +- [Switch 2 Pro USB HD-rumble direct-writer foundation](switch2-pro-usb-hd-rumble-physical-writer.md) +- [Switch 2 Pro USB read-only input transport owner](switch2-pro-usb-input-transport.md) +- [Switch 2 Pro USB owned-composite composition boundary](switch2-pro-usb-owned-composite-composition.md) +- [Switch 2 Pro USB owned-composite lifecycle composition blocker](switch2-pro-usb-owned-composite-lifecycle-blocker.md) +- [Switch 2 Pro USB owned-composite adoption prerequisites](switch2-pro-usb-owned-composite-prerequisites.md) +- [Switch 2 Pro USB owned-composite registration participant](switch2-pro-usb-owned-composite-registration-participant.md) +- [Switch 2 Pro USB owned feedback activation lifetime](switch2-pro-usb-owned-feedback-activation-lifetime.md) +- [Switch 2 Pro USB owned HD-rumble bridge](switch2-pro-usb-owned-hd-rumble-bridge.md) +- [Switch 2 Pro USB volatile startup transaction](switch2-pro-usb-startup-transaction.md) +- [Switch 2 Pro USB Windows owned-composite transport](switch2-pro-usb-windows-owned-composite-transport.md) +- [Registered Switch 2 input-to-broker matrix](switch2-production-input-matrix.md) +- [Switch 2 controller-operated profile picker](switch2-profile-picker.md) +- [Switch 2 per-physical-stick calibration](switch2-raw-stick-calibration.md) +- [Switch 2 game-rumble delay](switch2-rumble-delay.md) +- [Switch 2 gyro-mouse Stick Assist profile lane](switch2-stick-assist-profile-lane.md) +- [Switch 2 DSU observation integration, 2026-09-02](switch2-udp-observation.md) +- [Switch 2 controls and Joy-Con artwork](switch2-ui-polish-2026-09-06.md) +- [Switch 2 virtual runtime status](switch2-virtual-runtime-status.md) +- [Xbox impulse-trigger release on physical Switch 2 controllers](switch2-xbox-impulse-release.md) +- [DSU send ownership and session isolation, 2026-09-02](udp-send-ownership.md) +- [Live Xbox feedback output policy on ordinary physical targets](xbox-one-physical-output-policy.md) +- [Xbox One lifecycle process interoperability](xbox-one-process-interop.md) +- [Xbox One exact-registration removal, version 1](xbox-one-registration-removal-v1.md) +- [Xbox One semantic egress contract v1](xbox-one-semantic-egress-v1.md) diff --git a/docs/protocols/switch2-cemuhook-yaw-sensitivity.md b/docs/protocols/switch2-cemuhook-yaw-sensitivity.md new file mode 100644 index 00000000..7f1149fa --- /dev/null +++ b/docs/protocols/switch2-cemuhook-yaw-sensitivity.md @@ -0,0 +1,39 @@ +# Switch 2 Cemuhook yaw sensitivity + +This behavior is pinned to the operative Cemuhook serializer in +`Switch2Connect` commit `61ac6642ce12fe7217e38a860b14863b18ca7e28`, +`src/cemuhook_udp.py`. + +## Projection contract + +Switch2Connect exposes five sensitivity levels and applies + +`1 + (level - 1) / 12` + +only to the yaw value serialized into its DSU/Cemuhook packet. The exact level +multipliers are 1, 13/12, 7/6, 5/4, and 4/3. Pitch and roll are unchanged. + +DS4Windows applies the same multiplier after its existing optional DSU +One-Euro smoothing and immediately before `UdpServer.NewReportIncoming`. +Unlike the donor, it does not apply a separate Joy-Con or Pro raw-gyro scale: +the canonical `SixAxis` state already contains degrees per second. Copying the +donor's raw-family constants here would double-scale valid motion. + +## Scope and ownership + +The captured physical-report owner must be a `Switch2RuntimeInputDevice`. +Ordinary DS4, DualSense, and other DSU sources retain byte-for-byte prior yaw +behavior. The existing exact legacy-slot report lease remains authoritative, +and the captured device identity prevents a reused slot from changing the +source family observed by an older callback. + +`Switch2CemuhookYawSensitivity` is stored in the existing profile and appears +as `Cemuhook yaw sensitivity` under `Switch 2 Controls`. Level 1 is the legacy +default and returns the original `double` without multiplication. Invalid +persisted levels normalize to 1. Non-finite input and finite overflow preserve +the original value rather than synthesizing a different invalid sample. + +This is presentation policy only. It does not alter physical parsing, +calibration, canonical motion, gyro mouse/stick mapping, virtual-pad output, +report timing, or the Xbox One path. The warmed arithmetic path allocates no +managed memory. diff --git a/docs/protocols/switch2-connection-haptic.md b/docs/protocols/switch2-connection-haptic.md new file mode 100644 index 00000000..f7ba3709 --- /dev/null +++ b/docs/protocols/switch2-connection-haptic.md @@ -0,0 +1,58 @@ +# Switch 2 connection confirmation haptic + +This contract is pinned to `Switch2Connect` commit +`61ac6642ce12fe7217e38a860b14863b18ca7e28`, specifically +`Controller.trigger_connection_haptics`, `Controller.set_vibration`, and the +USB override in `UsbHidController.trigger_connection_haptics`. + +## Exact signature + +The cue is a two-part native HD-rumble signature: + +1. bass for 200 ms: source LF control `0x060`, LF amplitude `0x350`, HF + control `0x0c0`, and HF amplitude `0x250`; +2. neutral for 10 ms; and +3. a sharp click for 1,000 ms: the neutral LF control `0x0e1`, LF amplitude + `0x030`, HF control `0x1e2`, and HF amplitude `0x300`, followed by neutral. + +`ignore_freq_scaling=True` bypasses only frequency scaling in the donor. Its +shared renderer still applies a 1.3x LF multiplier, a Pro 1.0x/Joy-Con 0.6x HF +multiplier, 10-bit clamping, and the Joy-Con combined-amplitude limiter. The +actual Pro bass amplitudes are therefore 1,023/592 and its click amplitudes are +62/768. The actual Joy-Con values are 759/264 and 62/460 respectively. + +Each effective active value occupies the first of three five-byte subframes. +The second and third subframes retain the donor's neutral controls (`0x0e1`, +`0x1e1`) with zero amplitude. A Pro Controller receives the Pro group on both +physical actuators. A standalone Joy-Con writer selects its own Joy-Con group, +while a joined pair receives that Joy-Con group on both halves. USB waits 1,200 +ms after activation commit before starting, matching the donor's first- +connection readiness accommodation. + +## Ownership and arbitration + +The cue does not write HID, WinRT, or USB directly. Its exact oscillator group +is staged against the exact canonical frame returned by the existing fixed +`ProfileEffect` lane. That origin is the lowest feedback priority, so audio, +native game output, and an explicit test preview can supersede it. The staged +native group is consumed only if that exact frame wins the normal feedback +runtime and sole physical-writer pump. + +The transport owner starts the asynchronous schedule only after its input +activation commit succeeds. Prepare and abort-before-commit remain physically +silent. The scheduler performs no work in the controller input report path. +Non-neutral profile or preview rumble cancels the cue; terminal neutralization, +disconnect, and unpublished abort close admission before the task can publish +another phase. Each logical runtime generation can start at most one cue. + +## Profile compatibility + +`Switch2ConnectionHapticEnabled` is persisted in the existing profile and is +shown as `Play connection confirmation haptic` under `Switch 2 Controls`. It +defaults on for legacy profiles to match Switch2Connect behavior. Turning it +off prevents the task from being created after the next controller activation. + +Unit tests establish source constants, subframe placement, profile migration, +BLE and USB sole-writer delivery, the four-stage schedule, and terminal +retirement. Audible/tactile quality and hardware onset remain physical +validation gates. diff --git a/docs/protocols/switch2-gyro-lock.md b/docs/protocols/switch2-gyro-lock.md new file mode 100644 index 00000000..ca80a2ec --- /dev/null +++ b/docs/protocols/switch2-gyro-lock.md @@ -0,0 +1,43 @@ +# Switch 2 in-app gyro lock + +This behavior is pinned to the operative `GYRO_LOCK` mapping action in +`Switch2Connect` commit `61ac6642ce12fe7217e38a860b14863b18ca7e28`, +`src/config.py` and `src/controller.py`. + +## Profile contract + +**In-app gyro lock** appears under **Switch 2 Controls**. Gyro Mouse and Gyro +Mouse Joystick have independent binding scopes. Every Switch 2 semantic button, +including C and source-specific paddles, may be assigned to one of two modes: + +- **Hold-to-lock** pauses output only while the button is held; +- **Press-to-toggle** changes the lock state on each press edge. + +A button can have only one lock mode in a scope. The editor removes it from the +other mode when selected, and profile normalization resolves malformed overlap +in favor of Hold. Legacy profiles contain no selected lock buttons and retain +their prior behavior. + +## Runtime contract + +The normal DS4Windows Gyro Mouse or Gyro Mouse Joystick activation policy stays +engaged while locked. The lock suppresses only presentation: mouse remainders +or mouse-joystick smoothing are reset, and the existing high-rate mouse source +is withdrawn so no prior velocity can repeat. Unlocking resumes the same active +gyro mode without synthesizing another activation event. + +Toggle state resets whenever gyro disengages, matching the donor. Held toggle +buttons establish a baseline at activation, reconnect, profile change, binding +change, mode change, or timestamp regression and therefore cannot manufacture +a toggle edge. Multiple toggle buttons pressed in one report follow the donor's +shared-boolean behavior: an odd number changes the lock and an even number +leaves it unchanged. + +The lock and trigger-stabilization policies share one canonical Switch 2 report +observation per SixAxis callback. Exact Joy-Con pair or Pro device/transport +generations, report QPC time, and profile revision fence state. If neither +policy has selected buttons, the default report path returns before reading the +Switch 2 sidecar. The warmed lock state machine allocates no managed memory. + +Physical parsing, canonical motion, Cemuhook/DSU, ordinary mappings, +virtual-pad motion, Xbox One encoding, and feedback are not modified. diff --git a/docs/protocols/switch2-gyro-trigger-stabilization.md b/docs/protocols/switch2-gyro-trigger-stabilization.md new file mode 100644 index 00000000..5794a184 --- /dev/null +++ b/docs/protocols/switch2-gyro-trigger-stabilization.md @@ -0,0 +1,69 @@ +# Switch 2 in-app gyro trigger stabilization + +This behavior is pinned to the operative trigger-modifier policy in +`Switch2Connect` commit `61ac6642ce12fe7217e38a860b14863b18ca7e28`, +`src/controller.py`. DS4Windows reuses that policy inside its canonical gyro +mouse paths; it does not introduce another mapper or presentation thread. + +## Profile contract + +`Switch2GyroTriggerTunings` is a sparse per-profile table and appears as +**In-app gyro trigger stabilization** under **Switch 2 Controls**. The user +first selects **Gyro Mouse** or **Gyro Mouse Joystick**, then the exact existing +DS4Windows activation-source token, including Always On. Each source has +independent tuning and may select any Switch 2 semantic button for either of two +policies: + +- deadzone buttons freeze output on press and release edges, apply a + directionally projected subtractive soft deadzone while held, and retain the + deadzone for the configured release window; +- dampening buttons multiply output while held and retain that multiplier for + the configured release window. + +The donor defaults are retained: 15 deadzone units, 100 ms press and release +freezes, 200 ms deadzone and dampening release latches, and 90 percent +dampening. Durations are bounded to 0 through 60,000 ms, deadzone to 0 through +100, and dampening to 0 through 100 percent. Invalid persisted values normalize +to those defaults. A legacy profile without this element has no selected +buttons and therefore preserves prior behavior. Mouse and Mouse Joystick are +separate scopes, matching the donor's separate in-app mapping layers. + +## Runtime ownership and lifecycle + +The modifier is eligible only when the exact input device is a +`Switch2RuntimeInputDevice` and the active output mode is **Gyro Mouse** or +**Gyro Mouse Joystick**. It observes the already-mapped semantic button state, +including C and source-specific Joy-Con 2 or Pro paddles. A joined pair uses one +identity containing the pair epoch plus both device and transport generations. +A Pro controller uses its exact device and transport generations. + +The trigger evaluator retains the exact activation source that caused the +inactive-to-active edge. For an AND chord it uses the newly pressed member that +completed the chord; for a toggle it retains the source across the resulting +toggle interval. Reverse-ratchet and Always On configurations have deterministic +configured-source entries as DS4Windows extensions. + +The state machine resets its edge baseline and all time windows when the source +identity, activation-source entry, tuning, profile revision, or timestamp +ordering changes. Deactivation also clears the windows. Reactivation establishes +a baseline from the currently held buttons, so reconnecting, switching +profiles, changing tuning, changing source, or engaging gyro while holding a +button cannot manufacture a press edge. + +Report completion QPC time is authoritative for all windows. Invalid time or +source metadata clears modifier state. The warmed report-time state machine and +both arithmetic transforms allocate no managed memory. + +## Presentation boundary + +Freeze resets the existing mouse accumulator or mouse-joystick smoothing path. +For high-rate Switch 2 mouse presentation it also withdraws the gyro source, so +the 1 kHz presenter cannot repeat motion during a freeze. Deadzone and +dampening are applied after DS4Windows' established gyro deadzone and before +jitter compensation, smoothing, inversion, and output presentation. + +The modifier never changes physical parsing, calibration, canonical SixAxis +motion, Cemuhook/DSU output, virtual-pad motion, ordinary controller mapping, or +Xbox One encoding. Optical-sensor gyro aiming keeps its independent per-side +tuning because the selected left or right sensor is itself the activation +source. diff --git a/docs/protocols/switch2-high-rate-mouse-presentation.md b/docs/protocols/switch2-high-rate-mouse-presentation.md new file mode 100644 index 00000000..ca3eec26 --- /dev/null +++ b/docs/protocols/switch2-high-rate-mouse-presentation.md @@ -0,0 +1,87 @@ +# Switch 2 high-rate mouse presentation + +This contract is pinned to the one-owner, latest-state interpolation design in +`Switch2Connect` commit `61ac6642ce12fe7217e38a860b14863b18ca7e28`, +`src/controller.py::_collect_interpolation_sources` and +`Controller._interpolation_thread_loop`. + +## Scope + +DS4Windows' existing mapper remains authoritative. The high-rate presenter is +not a second mapping stack and does not read physical HID reports. It receives +only the latest already-mapped continuous velocity for four Switch 2 sources: + +- the established Gyro Mouse output after sensitivity, deadzone, smoothing, + threshold, ratchet/toggle, inversion, and profile policy; +- verified Joy-Con 2 IR mouse movement; +- orientation-corrected Gyro Mouse Stick Assist; and +- an authored logical-stick direction mapped to Mouse Up, Down, Left, or Right, + after the ordinary DS4Windows deadzone, sensitivity, vertical scale, + delta-acceleration, mapped-stick sensitivity, and mouse-acceleration policy. + +Wheel events, flick-stick deltas, mouse buttons, keys, macros, profile actions, +absolute mouse actions, and non-stick relative-mouse mappings stay on the +canonical per-report path. They are never held or repeated by the presenter. + +## Ownership and timing + +One `Switch2RuntimeInputDevice` owns one lazy presenter. A joined Joy-Con pair +is already one logical runtime, so it cannot create competing left/right mouse +workers. Input reports replace four fixed-size source records and wake the +owner; they create no task, timer, queue entry, or warm-path allocation. + +Stick Assist, IR, and mapped-stick state are committed as one transactional +batch with one QPC timestamp, presenter lock, and wake per physical report. +If any value is invalid, none of those three source records changes and all +three producers retain their exact per-report fallback for that report. Gyro +remains independently owned by the existing motion callback and mixes into the +same worker. + +For mapped-stick mouse, `Mapping` first computes the exact signed canonical +per-report delta. A fixed-size ephemeral frame divides that delta by the same +validated report interval used by the canonical calculation, recovering the +post-policy velocity without reimplementing the mapping law. Only after the +runtime accepts the velocity does Mapping remove that exact contribution from +the report accumulator; every other mouse producer remains there. Invalid or +over-100 ms report intervals, invalid/ambiguous Switch 2 sidecars, disabled +high-rate policy, or refused runtime admission preserve the original +per-report delta exactly, so the optimization cannot swallow or double motion. + +While at least one source is active and fresh, the worker targets a one +millisecond cadence and integrates velocity using `Stopwatch` elapsed time. +Fractional counts belong only to that worker. Windows' one-millisecond timer +resolution is acquired only for the active interval and released while idle or +terminal. A scheduler interval above 50 ms uses the source-compatible 15 ms +fallback rather than presenting a large catch-up jump. + +Every source expires after 100 ms without replacement. This covers current +20 Hz BLE intervals without allowing a dead producer to leave the cursor +moving. A profile revision change atomically clears all earlier sources before +accepting the new revision. + +## Output and lifecycle + +`VirtualKBMBase.MoveRelativeMouseImmediate` is the only output seam. The +SendInput implementation uses a by-reference native call and allocates no +managed array. FakerInput combines a pending canonical relative delta with the +scheduler delta and updates the virtual HID report under one write lock, so a +worker sample cannot overwrite ordinary mouse movement or a pending button +state. + +Terminal retirement stops source admission, waits for an already-admitted +output call, stops the worker, and only then continues terminal-neutral +publication. A stopped presenter cannot be restarted. Abort-before-publication +uses the same stop boundary. Output-handler replacement exceptions are +contained by the presenter and cannot terminate controller input. + +## Profile compatibility + +`Switch2HighRateMousePresentation` is stored in the existing profile and shown +as `High-rate mouse presentation (1 kHz)` under `Switch 2 Controls`. It defaults +on for legacy profiles because it changes presentation cadence, not mapping +semantics. Turning it off returns gyro, IR, Stick Assist, and mapped-stick +movement to their prior physical-report-cadence paths on the next input report. + +The 1 kHz value is a scheduler target. Hardware-perfect cadence and perceived +latency remain a physical validation gate; unit tests establish arithmetic, +ownership, persistence, allocation, and stop behavior only. diff --git a/docs/protocols/switch2-interactive-identification.md b/docs/protocols/switch2-interactive-identification.md new file mode 100644 index 00000000..90d33107 --- /dev/null +++ b/docs/protocols/switch2-interactive-identification.md @@ -0,0 +1,42 @@ +# Switch 2 interactive controller identification + +This contract is pinned to `Switch2Connect` commit +`61ac6642ce12fe7217e38a860b14863b18ca7e28`, specifically +`ControllerFrame._on_vibrate_clicked` and the shared +`Controller.set_vibration` renderer. + +## Exact Ping signature + +The Controllers tab exposes `Ping` on every logical Switch 2 controller card. +One click sends two 100 ms native HD-rumble pulses separated by 100 ms of +neutral output, then returns to neutral. Re-clicking cancels and neutralizes the +old sequence before starting a fresh one. + +The donor source subframe uses neutral controls `0x0e1`/`0x1e1` and amplitude +800 on both oscillator fields. It passes that same subframe in all three +temporal positions. The donor's `ignore_freq_scaling=True` render still applies +model-specific amplitude law: + +- Pro Controller: LF/HF amplitudes 1,023/800 in all three subframes; +- Joy-Con: LF/HF amplitudes 696/327 after the 1.3x/0.6x multipliers and the + combined 10-bit Joy-Con limiter. + +A Pro receives the Pro group on both actuators. A joined pair receives the +Joy-Con group on both halves, while a standalone Joy-Con sends it only through +its authenticated physical writer. + +## Ownership and lifecycle + +Ping uses the existing fixed `TestPreview` lane. Exact native oscillator groups +are keyed to the exact canonical frame admitted by that lane and are consumed +only if that frame wins the normal feedback runtime. There is no direct HID, +WinRT, USB, timer-loop, or second-writer path. + +Because identification is explicit user preview, it cancels and withdraws the +lower-priority connection cue. An ordinary preview, terminal request, removal, +or generation retirement cancels it and neutralizes any stage it owns. The +asynchronous 100 ms scheduler never runs on the controller input thread. + +Unit tests pin the donor source and model-specific post-render bytes, BLE/USB +sole-writer delivery, Pro and standalone-Joy-Con routing, two-pulse timing, and +terminal neutralization. Physical tactile strength remains a hardware gate. diff --git a/docs/protocols/switch2-magnetometer-calibration.md b/docs/protocols/switch2-magnetometer-calibration.md new file mode 100644 index 00000000..e3c26bbe --- /dev/null +++ b/docs/protocols/switch2-magnetometer-calibration.md @@ -0,0 +1,78 @@ +# Switch 2 magnetometer calibration + +Status: implemented in the canonical Switch 2 motion runtime and covered by +deterministic software tests. Live-controller magnetic-environment validation +is still required. + +## Source basis and fit quality + +The calibration model is adapted from Switch2Connect commit +`61ac6642ce12fe7217e38a860b14863b18ca7e28`, +`src/controller.py::_fit_full_soft_iron_calibration`. An explicit calibration +session retains at most 20,000 finite raw magnetic samples. A full ellipsoid +fit is adopted only when it has at least 500 samples, more than 25 raw units of +range on every axis, full algebraic rank, a positive ellipsoid, correction +condition no greater than 3, at least seven of eight orientation octants, RMS +relative residual no greater than 0.08, and P95 residual no greater than 0.15. + +When the full fit fails but a sufficiently covered min/max capture still +produces a finite, invertible, well-conditioned matrix, the donor-compatible +diagonal min/max correction is adopted. Otherwise the attempt is rejected and +the previous calibration remains active. + +## Runtime ownership + +Each physical IMU owns its calibration. A Pro Controller has one owner; a +standalone Joy-Con has one side; a joined Joy-Con runtime retains independent +left and right owners and adopts a two-side calibration attempt atomically. +The raw sample is transformed as `matrix * (raw - bias)` before the existing +quality-gated magnetic yaw assist. Completing or loading a fit clears the +magnetometer cache, increments the magnetic calibration epoch, and resets yaw +learning so raw and calibrated coordinate histories can never mix. + +The ordinary report path adds only the finite check, bias subtraction, and +fixed 3x3 multiply. It allocates nothing and creates no mapper, scheduler, +thread, or queue. Ellipsoid fitting and sample-buffer allocation occur only on +the user-invoked calibration control path. + +## UI and lifecycle + +The **Switch 2 Controls** profile section exposes Start, Complete, and Cancel +controls for the currently selected physical Switch 2 controller. While a +session is collecting, transport input continues to drain normally, but the +logical DS4Windows controller publishes neutral input. This prevents the +figure-eight motion from driving a game and matches Switch2Connect's output +suppression. Cancel and rejected completion immediately restore ordinary +publication without replacing the prior fit. + +The UI reports sample count, adopted model, octant coverage, RMS residual, and +P95 residual. Calibration is physical-controller data rather than profile +policy; the adjacent 9-axis assist checkbox remains the per-profile opt-in. + +## Persistent identity + +Successful fits use the existing DPAPI-protected install-key boundary to +derive an install-local HMAC pseudonym from the stable Bluetooth association +identity or USB container identity. Neither the Bluetooth address, Windows +DeviceId, USB path, container GUID, serial, bond, nor key material reaches the +runtime, UI, logs, filenames, or records. + +Records are fixed-size and versioned, repeat the expected 16-byte pseudonym, +contain only the validated bias/matrix/reference/model, carry a truncated +SHA-256 corruption digest, and are replaced atomically. Loading occurs before +runtime activation. Malformed, corrupt, mismatched, or ill-conditioned records +are ignored and cannot enter motion projection. + +## Verification + +`Switch2MagnetometerCalibrationTests` covers full off-diagonal ellipsoid +recovery, diagonal fallback, narrow-axis rejection, cancel/non-finite input, +and zero allocations over 20,000 warm transforms. + +`Switch2RuntimeInputDeviceTests` covers calibration-time neutral publication, +completion/cancel recovery, full-fit adoption, persistent write, and reconnect +load. `Switch2MagnetometerCalibrationFileStoreTests` covers byte-exact record +size, opaque naming, round trip, digest corruption, different-peer rejection, +single-bind ownership, and pre-activation adoption. The broader Switch 2 suite +also covers production Bluetooth and USB composition with the optional +persistence boundary. diff --git a/docs/protocols/switch2-rumble-delay.md b/docs/protocols/switch2-rumble-delay.md new file mode 100644 index 00000000..6b33bea0 --- /dev/null +++ b/docs/protocols/switch2-rumble-delay.md @@ -0,0 +1,60 @@ +# Switch 2 game-rumble delay + +## Source audit + +The compatibility target is Switch2Connect commit +`61ac6642ce12fe7217e38a860b14863b18ca7e28`: + +- `README.md` documents an optional millisecond delay for synchronizing + vibration with game audio; +- `src/config.py` persists `rumble_delay_ms` with a legacy default of zero; +- `src/gui.py` exposes the value in its vibration controls; and +- `src/virtual_controller.py` applies the delay to traditional, Xbox, and + DualSense feedback callbacks. + +The donor starts an independent `threading.Timer` for each delayed callback. +Its Xbox callback has an additional generation check, but the traditional and +DualSense callbacks do not. DS4Windows implements the same user-visible delay +at its canonical Switch 2 feedback-session boundary so every supported virtual +pad follows one lifecycle and ordering law. + +## Profile contract + +`Switch2RumbleDelayMilliseconds` is an integer in the inclusive range 0 through +9,999 ms. Missing or invalid values normalize to zero. Zero is the default and +uses the existing synchronous publication path: no timer, queue, worker, or +added input-path work is created. + +The setting delays game-owned rumble only. Player LEDs, startup commands, +connection confirmation, interactive identification, and other local profile +effects are not delayed. + +## Nonzero-delay law + +The first nonzero publication lazily creates one bounded FIFO and one timer for +the exact `Switch2VirtualFeedbackSession`. Xbox CFBK, legacy actuator state, +native Switch 2 groups, and rich DualSense groups enter that same FIFO. Source, +side, oscillator, and three-subframe identity remain intact. + +Wire CFBK is authenticated when accepted. At its due time it is reconstructed +with the same command, actuator mask, values, source sequence, device and +transport generations, ownership epoch, and TTL, but with a fresh canonical +timestamp. This prevents an intentionally configured delay from making a +previously valid frame fail the ordinary 250 ms freshness fence while retaining +all ownership and sequence checks at presentation. + +The queue is capped at 8,192 items. Reaching the cap discards the stale backlog +before accepting the newest state, avoiding unbounded memory growth and making +the newest stop/state authoritative. + +## Lifecycle fences + +A delay-value change, profile-revision change, or return to zero clears pending +work before the next publication. Session retirement clears and disposes the +timer before retiring the sole physical feedback owner. A timer callback must +re-authenticate the still-active session under the session gate before it can +present anything. Retired or superseded sessions therefore cannot resurrect +rumble. + +This delay is explicitly selected presentation latency. It is not part of the +default low-latency input or feedback path. diff --git a/docs/protocols/switch2-xbox-impulse-release.md b/docs/protocols/switch2-xbox-impulse-release.md new file mode 100644 index 00000000..79f06c86 --- /dev/null +++ b/docs/protocols/switch2-xbox-impulse-release.md @@ -0,0 +1,55 @@ +# Xbox impulse-trigger release on physical Switch 2 controllers + +## Source audit + +The parity target is Switch2Connect commit +`61ac6642ce12fe7217e38a860b14863b18ca7e28`. +`src/virtual_controller.py` defines a 90 ms linear release independently for +the left and right Xbox impulse-trigger channels. A positive replacement on a +side cancels that side's pending release. Repeated zero updates do not restart +the release. Dynamic-frequency mode derives frequency from the instantaneous +decayed strength; fixed-frequency mode retains the selected carrier. + +The donor resolves this state from its approximately 16.6 ms rumble loop. +DS4Windows uses a 16 ms presentation cadence with an exact 90 ms terminal +point. The linear state law is transport-independent and uses the canonical +microsecond clock. + +## Ownership and ordering + +The release is a downstream presentation continuation of one already accepted +Xbox CFBK frame. It does not fabricate a new canonical source sequence, +ownership epoch, producer lane, or mapping path. This distinction matters: +inventing canonical sequence numbers for intermediate decay points would make +the next real VIIPER CFBK frame appear stale. + +The exact `Switch2VirtualFeedbackSession` owns the envelope and lazily creates +one timer only when an impulse side begins releasing. Each point stages reduced +LT/RT amplitudes against the exact current canonical frame, asks the existing +feedback runtime for a presentation refresh, and reaches the same +`Switch2HdRumbleDeliverySink` and sole USB/Bluetooth physical writer. Body +motors and the other trigger side remain unchanged. + +The sink records a separate monotonic presentation revision. An unchanged +revision is idempotent. If a physical result is uncertain, the exact prior +derived amplitudes, tuning, canonical frame, and delivery epoch are retained +and retried before a newer decay point can present. A newer real canonical +frame may supersede the uncertain point only through the existing canonical +ordering law. + +## Lifecycle + +Disabling impulse translation, changing to a non-Xbox feedback path, receiving +a terminal Stop, or retiring the virtual session clears the envelope and +fences its timer. A superseding delayed frame retains the configured delay; +the active release continues only until that newer frame reaches presentation. +Session retirement disposes the timer before the sole physical owner emits +terminal neutral. A copied callback cannot write afterward. + +An explicitly configured rumble delay runs first; the 90 ms release begins +when the delayed CFBK frame reaches presentation. If the canonical frame expires +before a pending refresh succeeds, the ordinary runtime expiry/neutral path is +authoritative. + +This is a perceptual translation from Xbox impulse motors to Switch 2 LRA HD +rumble. It does not claim waveform identity with an Xbox trigger motor. diff --git a/docs/reference.md b/docs/reference.md new file mode 100644 index 00000000..72b462f8 --- /dev/null +++ b/docs/reference.md @@ -0,0 +1,29 @@ +# Technical reference + +[Documentation index](README.md) + +- [Runtime and protocol contracts](protocols/README.md) +- [Dated validation archive](validation/README.md) +- [Diagnostic utilities](../utils): each tool's README describes its scope and hardware requirements. +- [Installer](../installer/README.md) + +## Architecture and focused guides + +These pages describe implementation, transport and testing constraints. Historical +checkpoints retain their original evidence and must not be treated as new qualification. + +- [Controller platform source checkpoint, 2026-09-06](CONTROLLER_PLATFORM_CHECKPOINT_2026_09_06.md) +- [DSX game mod support](DSX-game-mod-support.md) +- [Installer validation and recovery strategy](INSTALLER_VALIDATION_STRATEGY.md) +- [Canonical controller feedback contract v1](controller-feedback-contract-v1.md) +- [DualSense Bluetooth Audio and Haptics](dualsense-bluetooth-audio-haptics.md) +- [RC4.3 to RC4.4 native DualSense haptics regression audit](dualsense-rc43-rc44-native-haptics-regression.md) +- [DualSense V5 transport ownership and lock order](dualsense-v5-transport-ownership.md) +- [Calibrate flick stick with a 360° turn](flick-stick-calibration.md) +- [Frontend modernization](frontend-modernization.md) +- [HidHide device lifecycle](hidhide-device-lifecycle.md) +- [Explicit portable controller lab](portable-controller-lab.md) +- [Release process](../.github/workflows/release.yml) +- [Switch 2 runtime registration boundary](switch2-runtime-registration-boundary.md) +- [Troubleshooting mapped mouse clicks](troubleshooting-mouse-clicks.md) +- [VIIPER backend architecture](viiper-backend-upgrade-path.md) diff --git a/docs/release-notes-rc4.5.6.md b/docs/release-notes-rc4.5.6.md deleted file mode 100644 index 44ace55e..00000000 --- a/docs/release-notes-rc4.5.6.md +++ /dev/null @@ -1,24 +0,0 @@ -# RC4.5.6 — Steadier Feedback & Safer Startup - -This stabilization update brings together the feedback-delivery work since 4.5.5 with fixes for initialization, recovery and setup ownership. - -## What's improved - -- **More dependable startup.** Windows 10 can use the encrypted VIIPER connection without requiring Windows 11's native encryption provider. Authentication stays enabled. Portable startup now reports the failed connection stage and releases its own unsuccessful broker before showing the error. -- **Safer installation and recovery.** Installer cleanup and repair share the same setup lock. VIIPER releases listeners it opened if initialization fails partway through, so an unsuccessful attempt does not leave its ports occupied. -- **Better feedback delivery.** Native DualSense commands retain their order through busy USB and Bluetooth writers, with bounded retries instead of prematurely acknowledging undelivered state. Sustained Switch 2 rumble uses the referenced first-active-subframe framing. -- **Audio Haptics for Switch 2 Pro and Joy-Con 2.** Turn application or system audio into stereo HD rumble, using Mix or Replace alongside game feedback. Both application pickers find audio sessions across active outputs, including separate Sonar routes. System audio follows the Windows default output. -- **Clean audio recovery and stopping.** Capture failures roll back fully so they can recover. Source changes discard stale audio. Writer failures stop the affected runtime, retire its resources and clear its owned feedback without overwriting untouched native game feedback. -- **Complete matching downloads.** Both packages include VIIPER 0.1.4-rc4.5.6, the Windows 10 encryption dependency, Xbox emulation identity, runtime files and notices. DS4Updater 2.0.6 remains compatible; no separate updater replacement is needed. - -## Downloads and updating - -Use **DS4Windows_5.0.5.6_Setup_x64.exe** for the standard installation, or extract the **entire portable ZIP** into its own folder. Do not copy only DS4Windows.exe. Close DS4Windows and VIIPER before replacing an existing installation's files; keep your profiles. - -This is an **unsigned release candidate**, published under the existing VIIPERRC policy. Source archives, license notices, SHA-256 checksums and the CI build record accompany the downloads. - -## Validation and remaining limits - -Release checks cover the full automated x64 suite, startup/Stop ownership, installer failure simulations, complete offline packaging, and hosted MSI install/repair/uninstall plus an upgrade from the published 4.5.5 package with profile-preservation checks. Matching broker tests run on Windows and Linux; the updater suite is also checked. - -These checks do not guarantee every controller/game combination. Final subjective Joy-Con smoothness and GTA V Enhanced rapid-fire feedback still need tester confirmation on USB and Bluetooth. Bluetooth Switch 2 headset audio remains unsupported. No native-driver backend or new end-to-end latency guarantee is claimed. diff --git a/docs/release-notes-rc4.5.7.md b/docs/release-notes-rc4.5.7.md deleted file mode 100644 index d0787879..00000000 --- a/docs/release-notes-rc4.5.7.md +++ /dev/null @@ -1,27 +0,0 @@ -# RC4.5.7 Hotfix — Sorry, broke Vibration/Triggers - -4.5.6 introduced a Bluetooth DualSense feedback-delivery regression. Sorry about that. This hotfix addresses the command backlog and startup stalls behind delayed or incorrect vibration and trigger effects. - -## What's fixed - -- **Bluetooth DualSense game feedback:** queued game commands can now progress between audio packets while preserving their order, rather than falling behind the audio clock. -- **Feedback startup:** a partially filled audio buffer can no longer prevent the commands and audio needed to finish starting the stream. -- **Trigger Lab delivery:** live trigger changes now reach the Bluetooth output while speaker/audio passthrough is active. Unrelated profile edits do not clear the game's trigger effects. -- **Per-trigger control stays intact:** enabled Trigger Lab effects override the corresponding trigger; the other trigger continues to receive native game effects. - -This is a targeted transport fix, not a gain boost. PCM encoding, audio cadence and input buffering are unchanged. It does not introduce a new controller backend or change Nintendo rumble tuning. - -## Downloads - -- **Installer:** `DS4Windows_5.0.5.7_Setup_x64.exe` -- **Portable:** `DS4Windows_VIIPER_x64.zip` — extract the entire ZIP, not just the EXE. - -Both include the complete matching **VIIPER 0.1.4-rc4.5.6** package. No new VIIPER release is required for this fix. **DS4Updater 2.0.6 remains compatible.** Close DS4Windows and VIIPER before replacing their files, and keep your profiles. - -## Validation - -The fix passed the full automated x64 suite: **5,394 passed, zero failed**, with 11 hardware/environment-gated skips. Regression tests verify exact trigger command ordering, retry under a busy writer, startup progress, and unchanged PCM content through the output-writing code using simulated device I/O. - -The private candidate was tested for haptics on a physical Bluetooth DualSense. Adaptive triggers still need confirmation in a trigger-supporting game; automated transport coverage is not a claim that every game/controller combination has been physically tested. - -Published as an **unsigned release candidate** under the existing `VIIPERRC` policy. Matching source archives, notices, checksums and the GitHub Actions build record accompany the downloads. diff --git a/docs/release-notes-rc4.5.8.md b/docs/release-notes-rc4.5.8.md deleted file mode 100644 index 257bd719..00000000 --- a/docs/release-notes-rc4.5.8.md +++ /dev/null @@ -1,26 +0,0 @@ -# Release Candidate 4.5.8 Hotfix — Bluetooth Haptics & Disconnect Recovery - -This update fixes a native DualSense rumble regression traced to RC4.4 and a separate queued-disconnect shutdown deadlock. It keeps the subsequent feedback, Trigger Lab, Nintendo, audio, input, and installer improvements intact. - -## What's fixed - -- **Native Bluetooth rumble:** continuing audio packets no longer clear the game's legacy or improved rumble mode immediately after a valid command. The mode and motor values remain active until an explicit change or stop. -- **Feedback ownership:** local trigger/LED updates cannot accidentally cancel native rumble, and stale media templates cannot overwrite a newer accepted motor command. Adaptive-trigger and LED one-shot updates are still consumed once. -- **Disconnect recovery:** a disconnect queued on the controller worker now hands off to the lifecycle owner without a circular wait. Final output retirement and completion waits for external callers remain enforced. - -This is not a gain boost or a rollback. PCM sample content, audio cadence, native command ordering and retry, per-trigger Trigger Lab priority, and Nintendo feedback tuning remain unchanged. - -## Downloads - -- **Installer:** `DS4Windows_5.0.5.8_Setup_x64.exe` -- **Portable:** `DS4Windows_VIIPER_x64.zip` — extract the entire ZIP, not just the EXE. - -Both include the unchanged, complete **VIIPER 0.1.4-rc4.5.6** package. No broker code changed and no new VIIPER release is required. **DS4Updater 2.0.6 remains compatible.** Close DS4Windows and VIIPER before replacing their files, and keep your profiles. - -## Validation and limits - -The rebuilt x64 suite passed **5,413 tests with zero failures** and 11 hardware/environment-gated skips, including **2,646 Nintendo tests**. Allocation checks remained enabled and passed. Real-helper tests with simulated device I/O cover continuous rumble, explicit stops, command ordering, busy retry, microphone boundaries, unchanged PCM/gain, and disconnect completion. - -The private candidate connected a physical Bluetooth DualSense, associated virtual DualSense output, and started speaker passthrough. These are startup observations, **not confirmation of in-game haptics or adaptive-trigger feel**. Physical game acceptance remains pending; no complete Hades II, Expedition 33, GTA, or all-game compatibility claim is made. - -Published as an **unsigned release candidate** under the existing draft-first `VIIPERRC` policy. Matching sources, notices, checksums, and the verified GitHub Actions build record accompany the downloads. diff --git a/docs/release-notes-rc4.5.9.md b/docs/release-notes-rc4.5.9.md deleted file mode 100644 index 30bad3cd..00000000 --- a/docs/release-notes-rc4.5.9.md +++ /dev/null @@ -1,30 +0,0 @@ -# Release Candidate 4.5.9 Hotfix — Faster Feedback, Same Detail - -Rapid feedback should stay responsive, not build up a delay during sustained action. This hotfix targets the DualSense Bluetooth feedback backlog reported in #81 while retaining the RC4.5.8 haptics and disconnect fixes. - -## What's improved - -- **Faster native feedback dispatch:** game feedback now has a separate 500 Hz / 2 ms software pacing ceiling instead of sharing the 200 Hz / 5 ms local-settings cadence. Distinct effects and stops remain ordered; audio and microphone scheduling retain their existing boundaries. -- **No unnecessary repeat backlog:** consecutive byte-identical, known state-setting commands may share an unclaimed pending queue entry. Changed effects, A-to-B-to-A transitions, stops, unknown commands, extra trigger bytes, and ownership changes are preserved. -- **Adaptive-trigger commands use the faster path too.** Automated tests verify trigger changes, complete trigger payloads, and release commands remain intact. Live validation covered body rumble, not in-game adaptive triggers; this addresses the shared queue-delay cause, not every possible cause of trigger skipping. - -This is not a gain boost or a rollback. PCM samples, codec settings, audio cadence, native rumble-mode ownership, per-trigger Trigger Lab priority, and Nintendo HD-rumble tuning are unchanged. Existing Switch 2 and Joy-Con functionality remains included. - -## Measured on a Bluetooth DualSense - -In a controlled one-second 250 Hz body-rumble burst, all **251 changes, including the final stop**, reached the physical Bluetooth writer in order. Against RC4.5.8, the final-stop submission delay fell from **252 ms to about 0.18 ms**. Two additional candidate runs preserved all 251 changes, with final-stop submission delays of **0.15–0.18 ms**. - -These are **host-side source-write-to-physical-writer measurements**, not radio acknowledgments, actuator latency, guaranteed 500 Hz hardware throughput, or proof of every game's behavior. GTA rapid-fire gameplay and adaptive-trigger feel still need in-game confirmation. Short input checks showed no consistent report-interval worsening during these bounded bursts. - -## Downloads - -- **Installer:** `DS4Windows_5.0.5.9_Setup_x64.exe` -- **Portable:** `DS4Windows_VIIPER_x64.zip` — extract the entire ZIP, not just the EXE. - -Both include the complete, unchanged **VIIPER 0.1.4-rc4.5.6** package and Xbox output identity. No new broker release is required. **DS4Updater 2.0.6 remains compatible**; the portable bootstrap obtains the published updater rather than bundling an outdated copy. Close DS4Windows and VIIPER before replacing files, and keep your profiles. - -## Validation - -The rebuilt x64 suite passed **5,539 tests with zero failures** and 11 existing hardware/environment-gated skips. Allocation assertions remained enabled, including a new intentional-allocation control. Coverage includes ordered native feedback, trigger payload preservation, media/PCM continuity, transport retry and completion handling, and existing Nintendo behavior. - -Published as an **unsigned release candidate** under the existing draft-first `VIIPERRC` policy. Matching sources, notices, checksums, and the GitHub Actions build record accompany the downloads. Detailed evidence is recorded in [the feedback cadence validation](https://github.com/hbashton/DS4Windows/blob/VIIPERRC4.5.9/docs/validation/2026-09-12-issue81-native-rate.md). diff --git a/docs/release-notes-rc4.6.1.md b/docs/release-notes-rc4.6.1.md deleted file mode 100644 index 93023fb3..00000000 --- a/docs/release-notes-rc4.6.1.md +++ /dev/null @@ -1,50 +0,0 @@ -# Release Candidate 4.6.1 Hotfix — Dial In Your Aim, Safer HidHide - -RC4.6.1 adds a simple way to dial in flick-stick aiming, cleans up trigger settings, prevents the startup-task failures reported in #98 and #103 from aborting setup, and protects against the confirmed HidHide configuration-client crash caused by Windows app-execution aliases. - -## Dial in a full 360° turn - -- Open **Axis Config → LS or RS → Output Mode: Flick Stick** and choose a **360° test button** beside Real World Calibration. -- Save the profile, face a recognizable landmark in-game, and tap your chosen button. Increase Real World Calibration if the turn falls short; decrease it if it goes too far. -- Each tap requests one approximately one-second turn. Holding the button does not repeat, and extra taps during a turn do not build a queue. -- The test button's normal mapping is reserved while configured. Choose **Not assigned** when finished to restore it; your original binding is never deleted. A trigger assignment reserves both its soft and full-pull outputs. -- Changes to the profile, stick mode, assigned button, or controller connection cancel unfinished turns. Flick Stick also safely handles a controller disappearing during mapping. - -This is a manual calibration aid for games that accept **mouse look**, not automatic camera tracking. Use a spare button and keep other aiming inputs still for a repeatable result. The setting is in **Axis Config**, not button remapping or Special Actions. - -## Cleaner trigger settings - -- Removed the legacy **Trigger Effect**, **Trigger Start**, and **Trigger Strength** controls from Axis Config. **Trigger Lab** remains the place to configure adaptive effects. -- Normal trigger dead zones, curves and sensitivity remain available. Existing saved trigger effects, Trigger Lab restoration and native game-provided feedback are preserved. - -## Safer HidHide configuration - -- Prevent DS4Windows from registering Windows app-execution aliases that can crash HidHide's Applications list. -- Check the configuration before opening HidHide through DS4Windows, with clear feedback when it cannot be read safely. -- If unsafe aliases are found, offer a **confirmation-based, backed-up repair** that removes only those entries. Other applications, hidden-device rules and hiding settings are preserved. Unsafe or changed configurations block the repair instead of guessing. - -This addresses the confirmed alias-related crash, not every possible HidHide failure. An external tool can still add an unsafe entry; launch HidHide through DS4Windows to use the guard. - -## Startup-task recovery (#98 and #103) - -- Setup keeps the original **RunVIIPER** and **RunDS4Windows** names. Existing definitions at those two reserved root names are backed up before replacement, including manually created or incomplete tasks. No alternate task names are introduced. -- Registration, verification or Task Scheduler access failures produce a startup warning instead of canceling installation. Setup can start the verified executables directly; automatic logon startup may need a later Repair. -- Verification diagnostics identify the mismatched fields instead of reporting only a generic failure. The #98 log proves verification failed, but does not contain the task definition needed to establish which field failed on that PC. -- Launch and uninstall still check the task's contents. An unsuccessful repair never authorizes running an arbitrary task just because its name matches. - -Backups are stored under **%ProgramData%\\DS4Windows\\Installer\\task-backups**. Tasks outside the two reserved root names are untouched. Windows can still refuse registration; this release makes that failure non-fatal, not invisible. Driver integrity, pending-reboot, USB/IP compatibility and VIIPER API checks remain required. - -## Packages and updates - -- Release/update tag: **VIIPERRC4.6.1**. Windows application, MSI and installer version: **5.0.7.0**, advanced for reliable upgrade ordering. -- Complete offline x64 installer and portable ZIP, including **VIIPER 0.1.5-rc4.6**, the required Xbox output identity, and matching source/notices. Portable users should extract the entire folder. -- **DS4Updater 2.0.6** remains compatible; no separate updater or broker upgrade is required for this hotfix. USB/IP remains **0.9.7.7**. -- Audio, haptics, adaptive-trigger transport, and Nintendo rumble tuning are unchanged from RC4.6. - -## Validation - -This is an **unsigned release candidate**. The complete local x64 suite passed **5,991 tests with zero failures**, with 11 explicitly gated tests skipped. Calibration uses the canonical mapper and recording test outputs; no input is injected into the desktop by the tests. Calibration light/dark UI layouts were inspected at normal and 150% scale. Existing profile, trigger restoration, native feedback and Nintendo regression checks remain enabled. - -In-game calibration still depends on mouse sensitivity and acceleration. Hardware/gameplay acceptance is not replaced by automated tests, and this release makes no new claim about the previously unattributed rare movement interruption or issue #81 gameplay acceptance. - -Source evidence: [calibration and trigger UI](https://github.com/hbashton/DS4Windows/blob/VIIPERRC4.6.1/docs/validation/2026-09-14-axis-calibration-and-trigger-ui.md), [calibration guide](https://github.com/hbashton/DS4Windows/blob/VIIPERRC4.6.1/docs/flick-stick-calibration.md), [startup-task collision](https://github.com/hbashton/DS4Windows/blob/VIIPERRC4.6.1/docs/validation/2026-09-14-issue103-startup-task-collision.md), and [HidHide safeguard](https://github.com/hbashton/DS4Windows/blob/VIIPERRC4.6.1/docs/validation/2026-09-14-hidhide-client-alias-guard.md). diff --git a/docs/release-notes-rc4.6.2.md b/docs/release-notes-rc4.6.2.md deleted file mode 100644 index f29341fc..00000000 --- a/docs/release-notes-rc4.6.2.md +++ /dev/null @@ -1,47 +0,0 @@ -# Release Candidate 4.6.2 — Game Mods, Safer Updates & Startup - -RC4.6.2 adds optional DSX game-mod support for DualSense triggers and lights, fixes custom-named portable updates, and improves startup recovery and shifted profile settings. - -## Let supported game mods control triggers and lights - -- New **Settings → Game mod support (DSX)** option for physical **DualSense and DualSense Edge** controllers. It starts **off**; enable it only when using a compatible mod. -- Local mods can control adaptive triggers, lightbar, player lights and the microphone light through the DSX UDP protocol. The default address is **127.0.0.1:6969**; connection details and **Apply / Retry** make a busy port easier to resolve. -- **Trigger Lab takes priority on each enabled trigger.** A mod can control one trigger without blocking the other, and temporary mod settings do not overwrite your profile. -- Resetting the mod, disabling support, stopping DS4Windows or removing the controller releases its overrides and restores the underlying state. -- Native trigger commands retain their order and exact effect data. Repeated trigger-command flags, stale duplicate tracking after a reset, and old callbacks affecting replacement controllers are covered by new regression tests. - -This is **local trigger/light compatibility**, not full DSX replacement or audio/PCM haptics support. Some legacy effects and input-threshold instructions remain unsupported rather than sending guessed commands. Mods should send reset when exiting; disabling the option also releases a held override. See the [setup and compatibility guide](https://github.com/hbashton/DS4Windows/blob/VIIPERRC4.6.2/docs/DSX-game-mod-support.md). - -## Portable updates keep your custom name (#99) - -- **DS4Updater 2.0.7** preserves the selected application EXE name without adding another canonical `DS4Windows.exe` to a compatible target installation. -- Required DLLs and runtime files retain their correct names. An old default EXE is removed only when the package owns it; unrelated files and profiles are preserved. -- Renaming, clearing a saved name, rollback, and protected setup staging use matching application identities. Unsafe collisions stop before file replacement. -- The new custom-only layout requires **RC4.6.2 / Windows version 5.0.8.0 or newer**. The updater checks the verified target version; it is not locked to one release tag. -- RC4.6.2 requests updater **2.0.7 or newer**, including future verified versions. Portable users should always extract the complete ZIP when updating manually. - -## Clearer startup recovery (#77) - -- Keep your requested startup preference separate from tasks temporarily disabled while setup needs repair or a reboot. -- Show clearer requested-versus-active startup status and the appropriate next action. -- Stage a protected, narrowly scoped continuation for the next logon after a required reboot, with account, boot, package and hash checks before continuing setup. -- Preserve the original **RunDS4Windows** and **RunVIIPER** task names and explicit startup opt-outs. Driver and broker readiness checks remain required. - -Windows can still deny permissions or require manual repair. Automated recovery tests pass; a complete physical reboot/logon/UAC acceptance test for this change remains outstanding. - -## Profile reliability and regression coverage (#46) - -- Extras-only shifted bindings keep their activation button through save/load and repeated saves. -- Shift extras can activate without replacing the button's normal action, and release correctly when the source or modifier is released. -- Add non-default settings, culture-independent date, macro value-band and historical profile-migration tests. -- Thanks to **Gabarsolon** for the DSX feature contribution and **anagnorisis2peripeteia / Cameron Beeley** for settings, macro and migration contributions. - -## Packages and validation - -- Tag: **VIIPERRC4.6.2**. Windows application/MSI/installer version: **5.0.8.0**, advanced for correct upgrade ordering. -- Complete offline x64 installer and portable ZIP, including unchanged **VIIPER 0.1.5-rc4.6**, **USB/IP 0.9.7.7**, the required Xbox output identity, matching sources and notices. No separate broker upgrade is needed. -- Companion updater: **DS4Updater 2.0.7**. Earlier release assets remain unchanged. -- The release candidate passed **6,367 tests with zero failures**, with 11 explicitly gated skips. The warmed native-shadow check measures **zero allocations**; the allocation assertion was not relaxed. -- This is an **unsigned release candidate**. Automated tests, hosted MSI lifecycle checks and package verification do not replace physical controller/game-mod acceptance. Nintendo rumble gain/cadence and PCM audio encoding are not retuned in this release. - -Technical evidence: [PR review](https://github.com/hbashton/DS4Windows/blob/VIIPERRC4.6.2/docs/validation/2026-09-14-pull-request-review.md) and [startup, updater and profile fixes](https://github.com/hbashton/DS4Windows/blob/VIIPERRC4.6.2/docs/validation/2026-09-14-issues-99-77-46.md). diff --git a/docs/release-notes-rc4.6.3.md b/docs/release-notes-rc4.6.3.md deleted file mode 100644 index be7423e5..00000000 --- a/docs/release-notes-rc4.6.3.md +++ /dev/null @@ -1,30 +0,0 @@ -# Release Candidate 4.6.3 — Smooth Profile Switching & Mouse Clicks - -RC4.6.3 fixes temporary-profile switching regressions and overlapping mouse-button bindings and macros. It is built from published main, without the earlier unshipped haptics experiments. - -## What changed - -- Fix repeated profile loads while holding a temporary-profile switch. Releasing before activation finishes now cancels that activation instead of applying it late. -- Keep the current mapping reporting during profile preparation, and publish the prepared mapping at a guarded boundary. Backend and audio refresh work no longer runs on the physical input queue. -- Preserve held keys through automatic profile press/release transitions. A switch no longer directly releases a key that another held binding still owns. -- Preserve the existing virtual pad for same-output profile changes. There is no fixed activation delay; changing the virtual controller type still requires a real device transition. -- Fence delayed switches and refreshes against disconnects, replacement connections and newer profile selections. -- Keep mouse-toggle state separate for each binding, so unrelated toggled actions cannot block mouse-button presses or releases. -- Keep a mouse button held while any mapped binding or macro still owns it. Ending one macro no longer releases another owner's click. -- Correct FakerInput's X1/X2 side-button event translation. -- Preserve held mouse buttons when switching output backends, and retire old macro input safely on disconnect or Stop. - -## Validation and limitations - -Targeted regression checks cover temporary-profile press/release with held movement and clicks, early release, rapid re-press, nested temporary profiles, stale connection work, overlapping mouse holds, independent toggles, macro completion and side-button translation. Ordinary **R2 → Left Mouse** combined with cursor movement or keyboard input already passes the baseline tests; it is not newly enabled by this release. - -Local validation: **6,681 tests passed, 0 failed**, with 12 opt-in hardware cases skipped. The profile-switch simulations use the real mapper, serialized profile worker and registered report admission with recording output sinks. They do not claim hardware/game acceptance. See the [profile-switch validation ledger](https://github.com/hbashton/DS4Windows/blob/VIIPERRC4.6.3/docs/validation/2026-09-21-temporary-profile-input-continuity.md). - -The reporter's machine and game have **not** been validated. These fixes do not establish the cause of that report or guarantee that every game accepts simultaneous controller and mouse/keyboard input. See [Troubleshooting mapped mouse clicks](https://github.com/hbashton/DS4Windows/blob/VIIPERRC4.6.3/docs/troubleshooting-mouse-clicks.md) for conditional Windows touchpad guidance and game-specific checks. DS4Windows does not automatically change Windows touchpad settings. - -## Packages - -- Tag: **VIIPERRC4.6.3**. Windows application/MSI/installer version: **5.0.9.0**, advanced for correct upgrade ordering. -- Complete offline x64 installer and portable ZIP, with unchanged **VIIPER 0.1.5-rc4.6**, **USB/IP 0.9.7.7** and Xbox output identity. No separate broker update is required. -- **DS4Updater 2.0.7** remains compatible; its minimum-version requirement is unchanged. Extract the complete ZIP for manual portable updates. -- This is an **unsigned release candidate**. Publication is gated on exact-source CI, installer lifecycle and downloaded-package checks; automated validation does not replace acceptance on the reporter's hardware and game. diff --git a/docs/release-notes-rc4.6.4.md b/docs/release-notes-rc4.6.4.md deleted file mode 100644 index 93ffd9a6..00000000 --- a/docs/release-notes-rc4.6.4.md +++ /dev/null @@ -1,34 +0,0 @@ -# Release Candidate 4.6.4 — Smoother DualSense Haptics - -Enjoy more detailed, consistent feedback from your DualSense over Bluetooth. This update focuses on keeping both advanced haptics and traditional rumble smooth through busy action scenes. - -## Improvements and fixes - -- **More faithful advanced haptics:** improved Bluetooth haptic conversion helps preserve the detail and character of supported games' effects. -- **Fewer interrupted effects:** fixes brief gaps that could make closely spaced haptic effects feel incomplete or skippy. -- **Rumble that lasts as intended:** fixes a settings update that could cut an active rumble effect short. Genuine stop commands still stop the effect normally. -- **Adaptive triggers stay responsive:** trigger and lighting updates continue alongside rumble without unnecessarily interrupting it. -- **Matching VIIPER included:** the installer and portable ZIP include the updated backend required for these improvements. - -These improvements apply to DualSense and DualSense Edge over Bluetooth when emulating a DualSense. Advanced haptics require a game that supports them. - -## Install or update - -### Recommended: all-in-one installer - -1. Close your games, exit DS4Windows, and quit VIIPER from its tray icon. -2. Download and run **DS4Windows_5.0.10.0_Setup_x64.exe** from the assets below. -3. Follow setup, then reopen DS4Windows and reconnect your controller. Existing profiles are retained. - -### Portable version - -1. Close your games, exit DS4Windows, and quit VIIPER. -2. Download **DS4Windows_VIIPER_x64.zip** and extract the **entire** ZIP into a new folder. Do not replace just the EXE. -3. Keep a backup of your existing profiles and settings. If you store them beside DS4Windows, copy them into the new folder before launching. -4. Start DS4Windows from the extracted folder. It will start the bundled VIIPER when no other copy is running. On a new PC, complete the driver setup when prompted. - -**For the best experience:** select **DualSense** as your emulated controller, enable controller audio/speaker support for advanced haptics, and restart the game after changing controller emulation. Game support and individual effects vary. - -This is an **unsigned Windows x64 release candidate**. Download only from this repository's release page. No new USB/IP version is required; the supported version remains **0.9.7.7**. - -Thanks for your feedback and patience. Enjoy the update! diff --git a/docs/release-notes-rc4.6.5.md b/docs/release-notes-rc4.6.5.md deleted file mode 100644 index 2a4c36b7..00000000 --- a/docs/release-notes-rc4.6.5.md +++ /dev/null @@ -1,24 +0,0 @@ -A small update to make everyday use smoother. Thanks for helping us catch these issues! - -## What's fixed - -- Fixed a freeze when opening **Log** after long sessions. -- Made scrolling, clearing and exporting the Log page more reliable. -- Fixed cases where the **DualSense lightbar** did not return to your profile color after closing a game. -- Fixed an update issue that could leave setup stuck on **another installation finishing**. -- **VIIPER repair now keeps DS4Windows open.** Missing or mismatched versions are restored automatically, with the correct download used when needed. -- **Portable stays portable.** VIIPER is repaired beside DS4Windows, without moving your files or changing another installation. -- Removed VIIPER's separate update pop-ups. The matching version now comes with DS4Windows updates. -- Refreshed the [getting-started guide](https://github.com/hbashton/DS4Windows/blob/main/docs/getting-started.md) to make setup easier to follow. - -## How to update - -1. Close your games, DS4Windows and VIIPER. -2. **Recommended:** download and run **DS4Windows_5.0.11.0_Setup_x64.exe**. Your saved profiles are kept. -3. **Portable:** back up your profiles and settings, then extract the whole **DS4Windows_VIIPER_x64.zip** into your existing portable folder, replacing the packaged app files. Keep your profiles, settings and `portable-data` folder. - -Both downloads include the matching VIIPER. No separate VIIPER update is needed for this hotfix. - -This is an unsigned Windows x64 release candidate, so Windows may show a publisher warning. - -Enjoy, and thanks for your feedback! diff --git a/docs/release-notes-rc4.6.6.md b/docs/release-notes-rc4.6.6.md deleted file mode 100644 index 928ddada..00000000 --- a/docs/release-notes-rc4.6.6.md +++ /dev/null @@ -1,25 +0,0 @@ -A smoother start, easier updates, and better DualSense Edge support. Thanks for helping make DS4Windows more dependable! - -## What's improved - -- **More reliable VIIPER startup and repair.** Slow startup checks are given time to finish, failed attempts clean up more safely, and retries keep DS4Windows open. -- **Clearer error messages.** If VIIPER cannot start, DS4Windows explains which startup check failed instead of showing only a generic error. -- **Safer app startup.** Opening DS4Windows twice at the same time no longer lets two installed instances compete for your controllers. -- **Fixed the `-autolaunch` update error.** Installed copies use the matching installer; portable copies stay in their own folder. Profiles and settings are preserved. -- **Better DualSense Edge compatibility.** Improved controller identification, motion calibration checks and virtual-controller reports. -- **Native DualSense feedback across both models.** Standard DualSense and DualSense Edge can use the shared advanced haptics and adaptive-trigger path with either emulated model. -- **Safer Edge settings handling.** Unsupported onboard-profile commands are rejected instead of appearing to work or applying incomplete settings. Virtual onboard-profile editing is not included. - -The matching VIIPER is included. You do not need to update it separately. - -## How to update - -1. Close your games, DS4Windows and VIIPER. -2. **Installer:** download and run **DS4Windows_5.0.12.0_Setup_x64.exe**. Your saved profiles are kept. -3. **Portable:** back up your profiles and settings, then extract the complete **DS4Windows_VIIPER_x64.zip** into your portable folder, replacing the packaged app files. Keep your profiles, settings and `portable-data` folder. - -If your older version shows the `-autolaunch` error when checking for updates, use the installer or complete portable ZIP once to get the corrected update path. - -This is an unsigned Windows x64 release candidate, so Windows may show a publisher warning. Not every Edge feature has been verified on hardware over both USB and Bluetooth; please report any remaining issues with your controller model, connection type and log. - -Enjoy, and thank you for your feedback! diff --git a/docs/release-notes-rc4.6.md b/docs/release-notes-rc4.6.md deleted file mode 100644 index 1cfe90d5..00000000 --- a/docs/release-notes-rc4.6.md +++ /dev/null @@ -1,38 +0,0 @@ -# Release Candidate 4.6 Hotfix — Clearer Audio, Reliable Feedback & Disconnects - -RC4.6 brings together the fixes since RC4.5.9: more reliable controller audio, safer feedback delivery under load, and cleaner Bluetooth disconnects. The faster DualSense feedback path from RC4.5.9 stays in place. - -## Controller audio that starts and stays on the right source - -- **DualSense speaker recovery:** restarting or switching audio sources no longer stalls speaker warmup because an earlier session's counters were reused. -- **Sonar compatibility:** physical DualSense USB and Bluetooth capture use the established Sonar-compatible endpoint capture policy, including audio from an emulated DualShock 4 headset. -- **Keep the source quality:** app and external-endpoint capture for DualSense uses 48 kHz floating-point audio. The virtual DualShock 4 headset endpoint remains at its native 32 kHz; physical DualShock 4 Bluetooth audio keeps its existing codec and rate. -- **Correct USB playback:** different source rates are converted to the physical DualSense output rate instead of being copied frame-for-frame. Large callbacks are no longer truncated, and small callbacks are processed without waiting to fill an extra block. -- **Safer source changes:** old callbacks and buffered samples cannot leak into a replacement source. Capture shutdown and shared-app capture retirement no longer hold the manager lock while waiting on callbacks. - -## Feedback delivery beyond DualSense - -- **Physical DualShock 4:** fresh motor changes and explicit stops can pass immediately during Bluetooth audio instead of waiting behind the unchanged-state maintenance interval. -- **Physical DualShock 3:** a failed output write remains pending for retry; a newer stop can replace the failed active effect. -- **Switch 2 Pro and Joy-Con 2:** eligible identical commands at an unclaimed pending queue tail can share an entry. Changed effects and stops, A-to-B-to-A sequences, PCM and timed feedback are not folded together. This is a delivery change, not a rumble gain, encoding or cadence retune. -- **Virtual DualShock 4 / VIIPER:** the V3 speaker-output path reserves room for a motor-stop command, preserves ordered changes, and reports a full distinct-command queue instead of silently accepting and dropping its contents. Reconnecting feedback readers cannot let an old connection retire the new owner's state. - -## Disconnect and profile safeguards - -- **No stale controller row after manual Bluetooth disconnect:** the controller-list and tray commands now request complete removal, rather than depending on a later HID read failure after transport cleanup has already finished. -- **Reject stale Game Bar activation:** delayed compatibility activation rechecks the current profile policy before allocating or rerouting output. Switching to Xbox output, disabling compatibility or selecting input-only mode prevents an old activation request from taking over. - -## Packages and updating - -- DS4Windows **VIIPERRC4.6**, Windows file/installer version **5.0.6.0**. -- Bundled **VIIPER 0.1.5-rc4.6**, with matching source and notices. USB/IP remains **0.9.7.7**. -- Complete offline installer and portable ZIP, including VIIPER and the required Xbox output identity. Portable users should extract the entire folder. -- The published **DS4Updater 2.0.6** remains compatible; no replacement updater is needed for this version. - -## Validation and limits - -This is an **unsigned release candidate**. The rebuilt local x64 suite passed **5,717 tests with zero failures**, including eight isolated DS4Windows-to-VIIPER process tests; three live-audio tests remain explicitly gated. Regression coverage exercises speaker priming, sample-rate continuity and channel placement, source retirement, feedback order and stop admission, reconnect ownership, manual removal, and Game Bar activation policy. Allocation-sensitive assertions remain enabled; a traced GC-counter measurement issue was corrected in the test harness without raising the zero-byte limit or changing production behavior. - -Software tests are not a promise of unlimited controller output rates or zero physical latency. Final audio listening, disconnect behavior and gameplay feel still need tester confirmation. The rare once-in-a-day movement interruption remains unattributed; the Game Bar safeguard is not being presented as proof that incident is solved. Genuine disconnect and shutdown neutral-report safety remains intact. - -Detailed source evidence: [cross-controller feedback](https://github.com/hbashton/DS4Windows/blob/VIIPERRC4.6/docs/validation/2026-09-12-cross-controller-feedback.md), [audio and Sonar](https://github.com/hbashton/DS4Windows/blob/VIIPERRC4.6/docs/validation/2026-09-12-sonar-ds4-dualsense-audio.md), [manual disconnect](https://github.com/hbashton/DS4Windows/blob/VIIPERRC4.6/docs/validation/2026-09-14-dualsense-manual-disconnect.md), and [rare input investigation](https://github.com/hbashton/DS4Windows/blob/VIIPERRC4.6/docs/validation/2026-09-14-rare-input-neutral-investigation.md). diff --git a/docs/roadmap.md b/docs/roadmap.md new file mode 100644 index 00000000..1069d1cf --- /dev/null +++ b/docs/roadmap.md @@ -0,0 +1,28 @@ +# Maintenance roadmap + +[Documentation index](README.md) · [Contributing](../contributing.md) + +This is a set of maintenance priorities and proposals, not a release promise. +Track concrete work in [the issue tracker](https://github.com/hbashton/DS4Windows/issues) +with reproduction steps, scope and acceptance criteria. + +## Priorities + +- Reproduce and triage new controller, startup and update reports against the + published build, recording controller model and connection type. +- Expand hardware verification for feedback, audio, reconnection and multi-controller + use. Preserve the distinction between unit tests and hardware evidence. +- Preserve signing, dependency and installer validation requirements when preparing releases. +- Keep installer, portable package, updater and backend compatibility aligned. +- Review proposed fixes individually and preserve attribution. +- Maintain user guides and translations alongside changes to the UI. + +## Proposals needing design + +The old TODO mentioned action-set support. Special Actions and profile switching +already exist, but a broader action-set design needs a concrete use case, a +definition of how it differs, and profile compatibility requirements before implementation. + +The former completed-task list is available in Git history. Release changes are +recorded in [CHANGELOG.md](../CHANGELOG.md); dated investigations remain in +[the validation archive](validation/README.md). diff --git a/docs/swipe-profiles.md b/docs/swipe-profiles.md new file mode 100644 index 00000000..5f74b77e --- /dev/null +++ b/docs/swipe-profiles.md @@ -0,0 +1,16 @@ +# Swipe profile selection + +[User guide](user-guide.md) · [Documentation index](README.md) + +A two-finger touchpad swipe can switch between saved profiles. +In Settings, enable **Swipe touchpad to switch profiles**, then open +**Config Swipe Profiles** and select the profiles to cycle through. + +A left/right swipe skips profiles outside the selection. Selecting no profiles +uses the original behaviour and cycles through all profiles. This also applies +to older settings files without a saved swipe list. + +The selection is stored in the application settings as `SwipeProfileList`, +rather than as a binding in each profile. Contributor reference: +`DS4Windows/DS4Control/DTOXml/AppSettingsDTO.cs` and +`DS4Windows/DS4Forms/MainWindow.xaml.cs`. diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md new file mode 100644 index 00000000..b717ab8c --- /dev/null +++ b/docs/troubleshooting.md @@ -0,0 +1,72 @@ +# Troubleshooting DS4Windows + +[Documentation index](README.md) · [Getting started](getting-started.md) + +Back up profiles and settings before changing your installation. Change one +setting at a time and note which physical controller, connection and virtual +output reproduce the problem. + +## Controller is not detected + +1. Confirm Windows sees the physical controller. Test a data-capable USB cable + and another port before changing drivers. +2. Check Settings > Device Options for the controller family. For Switch 2 + Bluetooth, use DS4Windows discovery and association as described in the setup guide. +3. If HidHide hides the controller, ensure this DS4Windows executable is allowed + to see it. This matters after changing folders or executable names. +4. If Device Manager shows the controller disabled, verify its identity before + enabling that device. Avoid disabling unrelated HID devices. + +## Duplicate input or unexpected keyboard/mouse output + +Configure HidHide so the game sees the virtual controller without also seeing +the physical one. Review Steam Input for the affected game and desktop layout: +another mapper can reinterpret the virtual controller as keyboard/mouse input. +Steam's interface changes, so use its current controller settings rather than +the legacy Big Picture checkbox instructions. + +For button conflicts, see [Mouse-click troubleshooting](troubleshooting-mouse-clicks.md). + +## VIIPER cannot start or no virtual output appears + +Read the startup error and follow the requested Install / Repair VIIPER action. +Restart Windows if setup requests it. Keep the app and bundled backend together; +do not substitute a newer USB/IP or unrelated VIIPER binary. + +Quit a conflicting VIIPER instance through its tray icon before retrying. +Portable users must extract the complete package, including backend files and +the Lang folder. Repair retains the portable folder; controller output pauses +briefly while an active backend is repaired. + +Setup logs are under `%ProgramData%\DS4Windows\Installer`; use Open log or +Copy diagnostics from the installer when available. + +## Haptics, triggers or audio do not work + +First confirm ordinary input works. Check the game's controller support, +profile output type, controller audio/speaker settings, physical connection, +and overlapping Steam Input. Restart the game after changing output type. +Disable profile Trigger Lab effects while testing game-authored triggers. +Test native game haptics separately from Audio Haptics capture. + +## Updates or profile settings are missing + +Use [this project's releases](https://github.com/hbashton/DS4Windows/releases). +Installed users run the matching Setup EXE; portable users replace the complete +packaged app files in their existing folder. Keep profiles, settings and +portable-data. Check both `%APPDATA%\DS4Windows` and the app folder for settings. + +Use the matching updater distributed with the app; verify release and package identity before applying updates. + +## Report a reproducible issue + +[Open an issue](https://github.com/hbashton/DS4Windows/issues) with: + +- App version and full Windows build. +- Controller model, USB/Bluetooth connection and virtual output type. +- Installed or portable setup, and any overlapping mapping software. +- Steps, expected behaviour and observed behaviour. +- Relevant exported log or installer diagnostics, reviewed for personal data. + +Enable verbose logging only when needed to reproduce a problem, then turn it off. +Hardware-specific support is not established by a passing unit test alone. diff --git a/docs/user-guide.md b/docs/user-guide.md new file mode 100644 index 00000000..98932fca --- /dev/null +++ b/docs/user-guide.md @@ -0,0 +1,166 @@ +# DS4Windows user guide + +[Documentation index](README.md) · [Install and update](getting-started.md) · [Troubleshooting](troubleshooting.md) + +DS4Windows reads a physical controller and presents the virtual controller +selected by your profile. Available settings depend on the controller and connection. Screenshots show +example configurations; selected options and visual branding can vary between builds. + +## Overview + +![Overview dashboard](images/tour/overview.png) + +Start here for a summary of your connected controller, active profile and backend status. + +## Controllers + +![Connected controllers and profile controls](images/tour/controllers.png) + +The Controllers page shows connected devices, battery, connection and selected +profile. Use the profile selector to choose a saved profile, and Edit to change +it. Link a profile to the controller ID when you want that device to reuse it. +Temporary changes and wireless disconnect controls apply to the selected device. + +For Joy-Cons, use Link/Unlink or the automatic pairing option. A pair needs a +left and right controller of the same generation. Choose upright or sideways +orientation for a single Joy-Con. Switch 2 Bluetooth discovery and association +are available in Settings; see [Getting started](getting-started.md#connect-and-choose-a-profile). + +## Profiles + +![Saved profiles](images/tour/profiles.png) + +Create a profile from a preset, then choose the output device the game expects. +Xbox 360 is a useful starting point for XInput games. Choose DualShock 4 or +DualSense when the game supports that controller's features. Restart the game +after changing output type if it does not detect the new virtual controller. + +You can rename, duplicate, import and export profiles from the Profiles page. +Back up your settings before deleting profiles or importing replacements. + +### Edit a profile + +![Profile editor and mapping navigation](images/tour/profile-editor.png) + +| Page | Purpose | +| --- | --- | +| Button Mapping | Map buttons, sticks, triggers and gestures to controller, keyboard, mouse or macro actions | +| Special Actions | Configure combinations, macros, launches and profile shifts | +| Controller Readings | Inspect live stick, trigger and motion input | +| Axis Config | Adjust dead zones, curves, sensitivity and flick stick | +| Lightbar | Set colour, battery indicators, flashing and passthrough | +| Touchpad | Choose mouse, gestures, controls, absolute positioning or passthrough | +| Gyro | Configure motion aiming, mouse output, steering or passthrough | +| Audio Haptics | Use system or application audio as a haptics source | +| Trigger Lab | Configure persistent adaptive-trigger effects | +| Nintendo Options | Configure supported rumble, motion, calibration and Joy-Con 2 optical-mouse features | +| Advanced | Choose output type and configure rumble, audio, latency and compatibility options | + +![Profile editor with a DualShock 4 layout](images/profile-editor-current.png) + +The controller diagram follows the selected controller layout; this example +shows a DualShock 4 layout, while the earlier image shows a DualSense. + +![Button remapping dialog](images/tour/remapping-dialog.png) + +Select a mapped control to open the remapping dialog and choose its action. + +Save to keep your edits. Back to Profiles cancels editing. Test one change at a +time, especially dead zones, gyro sensitivity and trigger effects. +Trigger Lab effects override game effects on the triggers where they are enabled. +Audio Haptics is separate from game-authored native DualSense haptics. + +## Audio Haptics + +![Audio Haptics controls](images/tour/audio-haptics.png) + +![Audio Haptics source and response settings](images/audio-haptics.png) + +The source and response controls let you tailor audio-driven feedback separately +from your button mappings. + +Choose a system or application audio source and tune the haptics response. See +[DualSense Bluetooth audio](dualsense-bluetooth-audio-haptics.md) for transport limits. + +## Trigger Lab + +![Adaptive trigger controls](images/tour/trigger-lab.png) + +Build persistent adaptive-trigger effects for supported DualSense controllers. +Enabled Trigger Lab effects take priority over game effects for that trigger. + +## Auto Profiles + +![Application and window title profile rules](images/tour/auto-profiles.png) + +Associate profiles with applications or window titles to switch automatically. +Check the selected controller slot and matching application when a profile fails +to activate. Verify manual profile selection first before debugging automation. + +## Output Slots + +![Virtual controller output slots](images/tour/output-slots.png) + +Inspect virtual output assignments and use the available plug/unplug controls. +The physical controller is the input; the assigned virtual controller is what +the game receives. A failed disconnect can leave an output registered for retry; +use the log to diagnose it instead of repeatedly adding more outputs. + +## Settings + +![Settings: General section](images/tour/settings.png) + +The image shows the General section of the redesigned Settings page. The checked +options are illustrative; your saved preferences may differ. + +Settings fills the available window width and groups related options into cards. + +| Section | What you can change | +| --- | --- | +| General | Startup, window behavior, notifications and latency warnings | +| Appearance | App theme, tray icon and language | +| Controllers | VIIPER setup, HidHide, Steam Input recovery, device options and swipe profiles; optional Nintendo pairing | +| Updates & tools | Update checks, profile folder, diagnostic utilities and verbose logging | +| Integrations | DSX game mods, UDP motion output and OSC control/monitoring | +| Advanced | Custom Steam folder, executable name, process priority and absolute mouse display | + +Search settings to find matching groups across all sections. Use **Ctrl+F** to +focus the search; **Clear**, or **Escape** while typing, returns to the selected +section. Searching keeps your edits. The app remembers the last selected section +when you close it normally. + +Language changes show a restart reminder. A custom executable name shows a +re-launch reminder with the filename to open. Theme and tray icon changes apply +immediately. + +Use [Swipe profiles](swipe-profiles.md) to limit profile cycling. For double +input, configure HidHide and check overlapping Steam Input mappings. +Run at Startup and Start Minimized are separate choices. + +## Log and diagnostics + +The Log page shows startup, controller, profile and backend events, including +installed/portable deployment mode, USB/IP status and detected driver versions. +Use **Copy Text** to paste the visible log into an issue, or **Export** to save it. +Include app version, Windows build, +controller model, connection and output type. Review exported logs for personal +information. See [Troubleshooting](troubleshooting.md) for the first checks. + +## Moonlight / Sunshine input + +Device Options exposes two distinct choices: accepting supported virtual HID +controllers while Sunshine is running, and the direct controller bridge. +The direct bridge also needs a matching Sunshine backend configured to send +input directly; DS4Windows then supplies the game-facing virtual controller. +See [Moonlight / Sunshine](moonlight-support.md) for the setup and limits. + +## Native feedback and feature limits + +For native DualSense feedback, the game must support it, the profile must use +compatible output, and overlapping Steam Input remapping must be disabled for +that game. Controller audio/speaker support is needed for advanced haptics. +Supported feedback differs between controller models and USB/Bluetooth. + +Nintendo rumble translation does not add adaptive-trigger hardware. Original +Joy-Cons do not have Joy-Con 2 optical mouse sensors. See the linked feature +guides before assuming a virtual output can reproduce every physical feature. diff --git a/docs/validation/2026-09-06-joycon-artwork.md b/docs/validation/2026-09-06-joycon-artwork.md index f2d18314..b8ef15aa 100644 --- a/docs/validation/2026-09-06-joycon-artwork.md +++ b/docs/validation/2026-09-06-joycon-artwork.md @@ -1,5 +1,8 @@ # Joy-Con 2 artwork and thumbnail bounds — 2026-09-06 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + Scope: presentation only. No controller transport, input mapping semantics, pairing, haptics, VIIPER, profile values, or driver changes. diff --git a/docs/validation/2026-09-06-joycon-bluetooth-sensors.md b/docs/validation/2026-09-06-joycon-bluetooth-sensors.md index 4696013c..66a6636f 100644 --- a/docs/validation/2026-09-06-joycon-bluetooth-sensors.md +++ b/docs/validation/2026-09-06-joycon-bluetooth-sensors.md @@ -1,5 +1,8 @@ # Joy-Con 2 Bluetooth mouse and motion startup — 2026-09-06 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Failure and evidence The user reported both desk mouse and gyro mouse failing in portable b83. diff --git a/docs/validation/2026-09-06-joycon-complete-silhouette.md b/docs/validation/2026-09-06-joycon-complete-silhouette.md index d2c9c399..36556c4c 100644 --- a/docs/validation/2026-09-06-joycon-complete-silhouette.md +++ b/docs/validation/2026-09-06-joycon-complete-silhouette.md @@ -1,5 +1,8 @@ # Complete Joy-Con thumbnails — b86 follow-up, 2026-09-06 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + The user's b85 screenshot showed a flat, truncated-looking upper controller. Live inspection of b85's overview/sidebar confirmed the same silhouette. The thumbnail factory still guarded painting ZL/ZR with `if (diagram)`, although diff --git a/docs/validation/2026-09-06-joycon-link-handoff.md b/docs/validation/2026-09-06-joycon-link-handoff.md index d3d35cc7..0babdecc 100644 --- a/docs/validation/2026-09-06-joycon-link-handoff.md +++ b/docs/validation/2026-09-06-joycon-link-handoff.md @@ -1,5 +1,8 @@ # Joy-Con Link/Unlink and retained virtual pad — b87 preview +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## User-visible changes - Controllers cards now have a labeled Link button with the paired-controller diff --git a/docs/validation/2026-09-06-joycon-orientation.md b/docs/validation/2026-09-06-joycon-orientation.md index d0ca2f2f..7e7a7900 100644 --- a/docs/validation/2026-09-06-joycon-orientation.md +++ b/docs/validation/2026-09-06-joycon-orientation.md @@ -1,5 +1,8 @@ # Joy-Con orientation UI validation — 2026-09-06 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + Scope: single left/right Joy-Con diagrams and controller-list icons follow the effective Switch 2 holding style. A controller's saved override wins over the profile fallback; a joined pair remains paired. This is the selected holding diff --git a/docs/validation/2026-09-06-switch2-bluetooth-audio-audit.md b/docs/validation/2026-09-06-switch2-bluetooth-audio-audit.md index a9df3e66..67dcc781 100644 --- a/docs/validation/2026-09-06-switch2-bluetooth-audio-audit.md +++ b/docs/validation/2026-09-06-switch2-bluetooth-audio-audit.md @@ -1,5 +1,8 @@ # Switch 2 Pro Bluetooth headset audio: evidence and remaining work +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + Status: **not implemented or hardware-verified**. Bluetooth controller input, HD rumble and LEDs are separate, already-existing paths. USB headphone output is physically verified in `2026-09-06-switch2-pro-usb-audio.md`. Neither fact diff --git a/docs/validation/2026-09-06-switch2-playstyle.md b/docs/validation/2026-09-06-switch2-playstyle.md index f85d3589..0f18ac9b 100644 --- a/docs/validation/2026-09-06-switch2-playstyle.md +++ b/docs/validation/2026-09-06-switch2-playstyle.md @@ -1,5 +1,8 @@ # Switch 2 playstyle UI and Pro profile crash — b83 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Confirmed failure The b82 WPF dispatcher failure at 2026-09-06 14:41:21 UTC was a diff --git a/docs/validation/2026-09-06-switch2-pro-usb-audio.md b/docs/validation/2026-09-06-switch2-pro-usb-audio.md index 40525a74..560449e7 100644 --- a/docs/validation/2026-09-06-switch2-pro-usb-audio.md +++ b/docs/validation/2026-09-06-switch2-pro-usb-audio.md @@ -1,5 +1,8 @@ # Switch 2 Pro USB audio: physical headphone output confirmed +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Scope and result 2026-09-06, user-connected Switch 2 Pro over USB, controller headphone jack diff --git a/docs/validation/2026-09-07-switch2-bt-audio-delivery-experiments.md b/docs/validation/2026-09-07-switch2-bt-audio-delivery-experiments.md index a58c1669..c058937e 100644 --- a/docs/validation/2026-09-07-switch2-bt-audio-delivery-experiments.md +++ b/docs/validation/2026-09-07-switch2-bt-audio-delivery-experiments.md @@ -1,5 +1,8 @@ # Switch 2 Pro Bluetooth headphone delivery experiments +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + Status: **not working/verified yet**. This is a research checkpoint, not a production headphone-audio implementation or release candidate. diff --git a/docs/validation/2026-09-07-switch2-console-audio-capture-plan.md b/docs/validation/2026-09-07-switch2-console-audio-capture-plan.md index c96c97a7..93afd3b4 100644 --- a/docs/validation/2026-09-07-switch2-console-audio-capture-plan.md +++ b/docs/validation/2026-09-07-switch2-console-audio-capture-plan.md @@ -1,5 +1,8 @@ # Switch 2 console headphone reference capture: feasibility and gates +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + Status: **not executed; dedicated sniffer unavailable**. The user confirmed owning a Switch 2 console and explicitly confirmed having no BLE sniffer. The live DS4Windows/VIIPER session and physical Pro connection remain untouched. diff --git a/docs/validation/2026-09-07-switch2-inprocess-audio-probe.md b/docs/validation/2026-09-07-switch2-inprocess-audio-probe.md index 6c9d366f..d4fdbded 100644 --- a/docs/validation/2026-09-07-switch2-inprocess-audio-probe.md +++ b/docs/validation/2026-09-07-switch2-inprocess-audio-probe.md @@ -1,5 +1,8 @@ # b90: persistent Switch 2 Pro Bluetooth audio probing +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Approach correction Do **not** close DS4Windows and try to take the controller with a second GATT diff --git a/docs/validation/2026-09-08-controller-diagram-remapping.md b/docs/validation/2026-09-08-controller-diagram-remapping.md index 1f163353..e1a3b657 100644 --- a/docs/validation/2026-09-08-controller-diagram-remapping.md +++ b/docs/validation/2026-09-08-controller-diagram-remapping.md @@ -1,5 +1,8 @@ # Controller diagram remapping repairs, 2026-09-08 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## User-visible defects and fixes - The Pro's C button had artwork but no interactive target/highlight. It now diff --git a/docs/validation/2026-09-08-controller-followup-rollup.md b/docs/validation/2026-09-08-controller-followup-rollup.md index c4cb052e..d5e010f4 100644 --- a/docs/validation/2026-09-08-controller-followup-rollup.md +++ b/docs/validation/2026-09-08-controller-followup-rollup.md @@ -1,5 +1,8 @@ # Controller follow-up rollup, 2026-09-08 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + This covers the user's requested roughly two-hour change window beginning with the 17:40 local checkpoints, plus the Joy-Con disconnect investigation added during final validation. Source/test evidence is distinguished from acceptance diff --git a/docs/validation/2026-09-08-controller-readings.md b/docs/validation/2026-09-08-controller-readings.md index 1faa37e6..2e1b19c3 100644 --- a/docs/validation/2026-09-08-controller-readings.md +++ b/docs/validation/2026-09-08-controller-readings.md @@ -1,5 +1,8 @@ # Controller Readings update repair, 2026-09-08 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + The user reported no live axes for Switch 2 Pro in the profile editor's Controller Readings page. The old UI stopped its timer and waited indefinitely on `DS4Device.ReadWaitEv`. Switch 2's serialized runtime does not use or signal diff --git a/docs/validation/2026-09-08-github-reported-bugs.md b/docs/validation/2026-09-08-github-reported-bugs.md index 167b961e..7dc9cd04 100644 --- a/docs/validation/2026-09-08-github-reported-bugs.md +++ b/docs/validation/2026-09-08-github-reported-bugs.md @@ -1,5 +1,8 @@ # GitHub reported-bug audit, 2026-09-08 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + Scope: the 39 open issues returned by the authenticated GitHub API on this date. Prioritize owner-acknowledged reports and reproducible crashes, stalls, or unwanted behavior whose mechanism is present in the current source. This is not diff --git a/docs/validation/2026-09-08-gyro-calibration-reader-contention.md b/docs/validation/2026-09-08-gyro-calibration-reader-contention.md index 7bc4a646..c7467f60 100644 --- a/docs/validation/2026-09-08-gyro-calibration-reader-contention.md +++ b/docs/validation/2026-09-08-gyro-calibration-reader-contention.md @@ -1,5 +1,8 @@ # Gyro-calibration reader contention, 2026-09-08 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + An integrated rerun of the reported-issue fixes failed `OrderedBackgroundWritesRoundTripOpaquePeerAndNewestBias`. This failure was investigated, not excluded or given a longer timeout. It exposed a pre-existing diff --git a/docs/validation/2026-09-08-installer-duplicate-arp-entries.md b/docs/validation/2026-09-08-installer-duplicate-arp-entries.md index b2b4d35e..24a73e10 100644 --- a/docs/validation/2026-09-08-installer-duplicate-arp-entries.md +++ b/docs/validation/2026-09-08-installer-duplicate-arp-entries.md @@ -1,5 +1,8 @@ # Duplicate Apps & Features entries, 2026-09-08 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Observed registration state The read-only machine inventory found 19 visible DS4Windows Burn registrations diff --git a/docs/validation/2026-09-08-issue32-startup-log-diagnosis.md b/docs/validation/2026-09-08-issue32-startup-log-diagnosis.md index 614fbc13..0ee9d01f 100644 --- a/docs/validation/2026-09-08-issue32-startup-log-diagnosis.md +++ b/docs/validation/2026-09-08-issue32-startup-log-diagnosis.md @@ -1,5 +1,8 @@ # Issue #32 startup-log diagnosis — 2026-09-08 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + Read-only review of [DS4Windows #32](https://github.com/hbashton/DS4Windows/issues/32), its comments, and all six attached text logs against current source `50c45e0f18e46ad275b63dd7fe4d989e0d9a8f19`. The text attachments were read in memory; no raw logs or controller identifiers are committed. The separately linked approximately 500 MB process dump was not acquired or analyzed. No application, controller, service, task, or driver state was changed. ## What each log establishes diff --git a/docs/validation/2026-09-08-issue68-bluetooth-startup.md b/docs/validation/2026-09-08-issue68-bluetooth-startup.md index 88a670cb..09a41b17 100644 --- a/docs/validation/2026-09-08-issue68-bluetooth-startup.md +++ b/docs/validation/2026-09-08-issue68-bluetooth-startup.md @@ -1,5 +1,8 @@ # Issue #68: Bluetooth Switch Pro startup, 2026-09-08 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + Status: the source-backed calibration null-reference failure class is covered by the existing `ed0e983` repair, now verified through additional Bluetooth initialization regressions. This pass adds tests, not another transport rewrite. diff --git a/docs/validation/2026-09-08-issue74-trigger-restoration.md b/docs/validation/2026-09-08-issue74-trigger-restoration.md index 716b5633..32c0ad48 100644 --- a/docs/validation/2026-09-08-issue74-trigger-restoration.md +++ b/docs/validation/2026-09-08-issue74-trigger-restoration.md @@ -1,5 +1,8 @@ # Issue #74: restore normal trigger effects after Trigger Lab, 2026-09-08 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + Status: the confirmed restoration inconsistency is fixed and covered by offline regressions. This does not establish that every restart/profile-switch symptom in [issue #74](https://github.com/hbashton/DS4Windows/issues/74) has the same cause, or that the report was user error. ## Defect and bounded change diff --git a/docs/validation/2026-09-08-issue80-renamed-executable-setup.md b/docs/validation/2026-09-08-issue80-renamed-executable-setup.md index b647e57f..d2368ba9 100644 --- a/docs/validation/2026-09-08-issue80-renamed-executable-setup.md +++ b/docs/validation/2026-09-08-issue80-renamed-executable-setup.md @@ -1,5 +1,8 @@ # Issue #80: renamed executable setup, 2026-09-08 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + Source changes following [the reported portable-executable failure](https://github.com/hbashton/DS4Windows/issues/80). Starting DS4Windows checkpoint: `ed0e983`. No real installer, process termination, Task Scheduler entry, registry mutation, controller operation or app replacement diff --git a/docs/validation/2026-09-08-issue82-legacy-joystick-exposure.md b/docs/validation/2026-09-08-issue82-legacy-joystick-exposure.md index 72e9aa57..dfb9e5c9 100644 --- a/docs/validation/2026-09-08-issue82-legacy-joystick-exposure.md +++ b/docs/validation/2026-09-08-issue82-legacy-joystick-exposure.md @@ -1,5 +1,8 @@ # Issue #82: legacy joystick exposure investigation, 2026-09-08 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + Status: diagnostic lead and read-only tooling, **not a confirmed fix**. No game was launched, controller disconnected, app replaced, or HidHide/GameInput setting changed in this pass. ## Evidence and limits diff --git a/docs/validation/2026-09-08-issue94-startup-preference.md b/docs/validation/2026-09-08-issue94-startup-preference.md index 002a355c..c2916555 100644 --- a/docs/validation/2026-09-08-issue94-startup-preference.md +++ b/docs/validation/2026-09-08-issue94-startup-preference.md @@ -1,5 +1,8 @@ # Issue #94: startup preference handling, 2026-09-08 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + Status: deterministic startup-state defects corrected and covered by isolated regressions. The original reporter's Windows task/shortcut state is unavailable; this does not establish which defect caused that specific report. [Issue #94](https://github.com/hbashton/DS4Windows/issues/94) reports that turning off **Run at startup** does not survive reopening DS4Windows. Source inspection identified an owned read-only shortcut being silently left behind, task repair recreating disabled tasks, and the Settings view updating its checkbox before confirming the Windows registration change. Opening Settings also performed startup mutations. diff --git a/docs/validation/2026-09-08-joycon-counter-reset.md b/docs/validation/2026-09-08-joycon-counter-reset.md index 2ef63369..36265a10 100644 --- a/docs/validation/2026-09-08-joycon-counter-reset.md +++ b/docs/validation/2026-09-08-joycon-counter-reset.md @@ -1,5 +1,8 @@ # Joy-Con 2 counter-reset disconnect: live evidence, 2026-09-08 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Incident and capture The user reported a left-only disconnect at 19:11 and a joined-pair disconnect diff --git a/docs/validation/2026-09-08-joycon-left-disconnect-log-review.md b/docs/validation/2026-09-08-joycon-left-disconnect-log-review.md index 91aebc13..d2fcd8d4 100644 --- a/docs/validation/2026-09-08-joycon-left-disconnect-log-review.md +++ b/docs/validation/2026-09-08-joycon-left-disconnect-log-review.md @@ -1,5 +1,8 @@ # Left Joy-Con disconnect log review, 2026-09-08 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + **Superseded by retained-memory evidence:** the later joined-pair disconnect prompted an authorized local heap dump. It retained both incidents and proves that the earlier left-hand removal was a software rejection of a device-counter diff --git a/docs/validation/2026-09-08-portable-broker-startup.md b/docs/validation/2026-09-08-portable-broker-startup.md index c81067ab..4a43350e 100644 --- a/docs/validation/2026-09-08-portable-broker-startup.md +++ b/docs/validation/2026-09-08-portable-broker-startup.md @@ -1,5 +1,8 @@ # Normal portable broker startup +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + Follow-up to the initial RC4.5 packaging checkpoint. The user requested a top-level `viiper.exe` in the portable ZIP and automatic startup. They then clarified that an already-running compatible copy should be reusable, rather diff --git a/docs/validation/2026-09-08-rc45-qualification.md b/docs/validation/2026-09-08-rc45-qualification.md index ac7ae188..50c96ec2 100644 --- a/docs/validation/2026-09-08-rc45-qualification.md +++ b/docs/validation/2026-09-08-rc45-qualification.md @@ -1,5 +1,8 @@ # RC4.5 tester-package qualification +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + Local date: 2026-09-08; build work continues into 2026-09-09 UTC. This records the initial `12b2485` RC4.5 checkpoint, before normal portable @@ -149,5 +152,5 @@ The live portable b93 session was not replaced for packaging. No actual MSI transaction or new controller/game acceptance is claimed on this host in this release-preparation pass. Bluetooth headset audio remains unsupported; the native-driver backend and sub-millisecond end-to-end latency are not shipping -claims. See the [RC4.5 assessment](../RELEASE_CANDIDATE_4_5.md) for the full +claims. See the [RC4.5 assessment](../../CHANGELOG.md#inherited-release-candidate-4-5) for the full feature scope, demonstrated hardware evidence and focused tester scenarios. diff --git a/docs/validation/2026-09-08-reported-issues-follow-up.md b/docs/validation/2026-09-08-reported-issues-follow-up.md index e7de028f..2c6f702c 100644 --- a/docs/validation/2026-09-08-reported-issues-follow-up.md +++ b/docs/validation/2026-09-08-reported-issues-follow-up.md @@ -1,5 +1,8 @@ # Reported-issue follow-up, 2026-09-08 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + Starting checkpoints: DS4Windows `ed0e983`, VIIPER `07db0a8`. This follows the [first reported-bug pass](2026-09-08-github-reported-bugs.md). The user authorized cautious implementation of the four follow-up candidates. diff --git a/docs/validation/2026-09-08-switch2-bt-receiver-plans.md b/docs/validation/2026-09-08-switch2-bt-receiver-plans.md index 486f7af4..7a33172b 100644 --- a/docs/validation/2026-09-08-switch2-bt-receiver-plans.md +++ b/docs/validation/2026-09-08-switch2-bt-receiver-plans.md @@ -1,5 +1,8 @@ # Switch 2 Pro Bluetooth receiver setup experiments +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + Physical Bluetooth headphone playback remains **unconfirmed and silent in the measurements below**. Command acknowledgements, accepted GATT writes and passing software tests are not playback evidence. This ledger continues diff --git a/docs/validation/2026-09-08-switch2-held-rumble-maintenance.md b/docs/validation/2026-09-08-switch2-held-rumble-maintenance.md index 84b9ff74..2be9837b 100644 --- a/docs/validation/2026-09-08-switch2-held-rumble-maintenance.md +++ b/docs/validation/2026-09-08-switch2-held-rumble-maintenance.md @@ -1,5 +1,8 @@ # Switch 2 held-rumble maintenance, 2026-09-08 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Scope and evidence The reported symptom was premature cutoff of Switch 2 Test Heavy/Test Light and held game rumble. This change is source/test validated, not a claim that the running portable build or physical controller has been updated or perceptually accepted. diff --git a/docs/validation/2026-09-08-switch2-pro-motion-basis.md b/docs/validation/2026-09-08-switch2-pro-motion-basis.md index c4c710d5..44c7686c 100644 --- a/docs/validation/2026-09-08-switch2-pro-motion-basis.md +++ b/docs/validation/2026-09-08-switch2-pro-motion-basis.md @@ -1,5 +1,8 @@ # Switch 2 Pro motion basis correction, 2026-09-08 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + The reported symptom was reversed left/right movement when using the Pro controller as a gyro mouse. A source-level basis mismatch was confirmed: the Pro projection treated the donor's already-semantic Cemuhook values as native DS report axes and then passed them through `SixAxis.populate`, which applies semantic signs again. ## Independent reference evidence diff --git a/docs/validation/2026-09-08-switch2-profile-identity.md b/docs/validation/2026-09-08-switch2-profile-identity.md index 382b8e89..2c8f6a74 100644 --- a/docs/validation/2026-09-08-switch2-profile-identity.md +++ b/docs/validation/2026-09-08-switch2-profile-identity.md @@ -1,5 +1,8 @@ # Switch 2 local identity and profile linking, 2026-09-08 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Confirmed source defect Switch 2 runtimes intentionally use the no-HID `DS4Device` constructor. It leaves `MacAddress` at `00:00:00:00:00:00` and does not grant legacy HID persistent-identity authority. That is not a decoded Nintendo serial or a failed read of a MAC. The controller list/overview and Link Profile/ID still used that legacy field. Consequently, the controllers looked identical and normal linked-profile lookup could not select a per-controller link. diff --git a/docs/validation/2026-09-08-switch2-public-audio-research.md b/docs/validation/2026-09-08-switch2-public-audio-research.md index 2bb889a7..92870afe 100644 --- a/docs/validation/2026-09-08-switch2-public-audio-research.md +++ b/docs/validation/2026-09-08-switch2-public-audio-research.md @@ -1,5 +1,8 @@ # Switch 2 Pro Bluetooth audio: public-source research, 2026-09-08 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Outcome and scope This bounded public-source pass found a real decrypted console/controller capture and a useful console-facing emulator logger foundation, but **did not find a verified physical Switch 2 Pro Bluetooth headphone playback implementation or a downloadable successful headphone stream**. This is a finding about the inspected material, not proof that no such work exists. diff --git a/docs/validation/2026-09-08-tooltip-theme-readability.md b/docs/validation/2026-09-08-tooltip-theme-readability.md index 56473b15..8bc7ac63 100644 --- a/docs/validation/2026-09-08-tooltip-theme-readability.md +++ b/docs/validation/2026-09-08-tooltip-theme-readability.md @@ -1,5 +1,8 @@ # Tooltip theme readability, 2026-09-08 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + Status: the source-level theme override defects are fixed, with isolated WPF resource/rendering regressions passing. No running application or controller was touched. ## Cause and scope diff --git a/docs/validation/2026-09-09-active-request-ledger.md b/docs/validation/2026-09-09-active-request-ledger.md index 229f85b1..8ee371c8 100644 --- a/docs/validation/2026-09-09-active-request-ledger.md +++ b/docs/validation/2026-09-09-active-request-ledger.md @@ -1,5 +1,8 @@ # Active user-request ledger — 2026-09-09 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + This is the working checklist for the current follow-ups. Source implementation, automated verification, physical acceptance, and public release are separate milestones. Nothing in this ledger implies that an in-progress build is installed diff --git a/docs/validation/2026-09-09-github-rc45-publication.md b/docs/validation/2026-09-09-github-rc45-publication.md index 47119b78..6d5d5c23 100644 --- a/docs/validation/2026-09-09-github-rc45-publication.md +++ b/docs/validation/2026-09-09-github-rc45-publication.md @@ -1,5 +1,8 @@ # RC4.5 GitHub publication +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + The user authorized updating the versions, fast-forwarding both repositories to `main`, building and uploading the release candidates. The preceding tester kit was local only; it was not a public release or a push to either main branch. diff --git a/docs/validation/2026-09-09-haptics-burst-and-joycon-followup.md b/docs/validation/2026-09-09-haptics-burst-and-joycon-followup.md index 62735ea9..0de02f61 100644 --- a/docs/validation/2026-09-09-haptics-burst-and-joycon-followup.md +++ b/docs/validation/2026-09-09-haptics-burst-and-joycon-followup.md @@ -1,5 +1,8 @@ # Native burst delivery and Joy-Con rumble follow-up +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## User reports - Test Heavy / Test Light on Switch 2 hardware has persistent slight stutter and diff --git a/docs/validation/2026-09-09-installer-startup-recovery.md b/docs/validation/2026-09-09-installer-startup-recovery.md index 0caf09d5..279a7158 100644 --- a/docs/validation/2026-09-09-installer-startup-recovery.md +++ b/docs/validation/2026-09-09-installer-startup-recovery.md @@ -1,5 +1,8 @@ # RC4.5.5 installer and startup recovery +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Reproduced cause The reported RC4.5.3 setup failed before USB/IP installation. Its infrastructure diff --git a/docs/validation/2026-09-09-nintendo-allocation-gate.md b/docs/validation/2026-09-09-nintendo-allocation-gate.md index 05a7b26c..7f2df189 100644 --- a/docs/validation/2026-09-09-nintendo-allocation-gate.md +++ b/docs/validation/2026-09-09-nintendo-allocation-gate.md @@ -1,5 +1,8 @@ # Nintendo allocation-counter release gate — 2026-09-09 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Release held on independent CI failure CI run `34380417498`, source `6e99c44bef78dddd0c1ba440e62a1e9066f71643`, diff --git a/docs/validation/2026-09-09-nintendo-ui-and-input-parity.md b/docs/validation/2026-09-09-nintendo-ui-and-input-parity.md index 758e1636..756db73a 100644 --- a/docs/validation/2026-09-09-nintendo-ui-and-input-parity.md +++ b/docs/validation/2026-09-09-nintendo-ui-and-input-parity.md @@ -1,5 +1,8 @@ # Nintendo UI and original Joy-Con integration — 2026-09-09 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + This records the current source changes, not a hardware or release acceptance. The running apps and published RC4.5.1 assets have not been replaced. diff --git a/docs/validation/2026-09-09-rc452-release-notes.md b/docs/validation/2026-09-09-rc452-release-notes.md deleted file mode 100644 index fc4d15a3..00000000 --- a/docs/validation/2026-09-09-rc452-release-notes.md +++ /dev/null @@ -1,45 +0,0 @@ -# Release Candidate 4.5.2 Hotfix — Joy-Con 1 & Nintendo Options - -Original Joy-Cons join the new Nintendo experience, with easier linking, clearer settings, and live feedback while you remap. This hotfix also corrects stale DualSense compatibility-rumble state associated with the reported Hades II pulsing on a Switch 2 Pro. - -## Original Joy-Cons, familiar controls - -- Use one original Joy-Con on its own, or link a left and right through the same Controllers-page Link/Unlink buttons used by Joy-Con 2. -- The magnet checkbox now controls automatic pairing for both generations. The old separate Joy-Con global options have been removed. -- Linking keeps the first-selected controller's profile and virtual pad. Saved pairs are remembered; unlinking or losing a half releases held input safely. -- Choose Horizontal or Vertical manually from the controller card. Stick direction and controller artwork follow your choice. -- Use applicable Nintendo profile features with original Joy-Cons: per-hand gyro aiming, aim activation, mode shifting, stick-to-mouse tools, and translated Xbox/DualSense feedback. - -## Nintendo Options and easier remapping - -- **Switch 2 Controls is now Nintendo Options.** Profiles remain universal: settings stay visible and saved even on controllers that cannot use a particular feature. -- A **Show live preview** button adds controller readings while remapping, without permanently filling the screen. -- Clearer dual-Joy-Con aiming labels explain side swapping, pausing, and the separate aim-activation setting. -- Special Actions now expose the missing C, GL/GR, Capture, Mute, Edge function/paddle, and individual Joy-Con rail buttons as selectable triggers. -- Capture and side-button trigger selections survive reopening. Unrecognized saved trigger names are preserved instead of silently weakening an action's trigger combination. - -## Rumble and reliability fixes - -- Fixed stale DualSense compatibility rumble being restarted by later non-rumble control reports on Nintendo controllers. This corrects the stale-state path identified in the Hades II diagnostic dump. -- Fresh control commands select the appropriate rumble source; cached audio snapshots cannot bring an old compatibility effect back. -- A fresh zero-motor stop remains stopped even when later audio packets carry an older motor snapshot. Mixed audio/adaptive effects no longer replay old audio samples as sustained vibration. -- **Translate Xbox impulse-trigger vibration** is a separate Advanced option for every controller, independent of Trigger Lab. The Nintendo Options checkbox controls the same saved setting. -- DualSense and DualSense Edge can send Xbox impulses to their adaptive triggers or blend them into body rumble. Turning impulse translation off leaves ordinary body rumble enabled. -- Fixed original Joy-Con paired disconnect behavior and unlinking a session-only pair when its saved-pair file is damaged. -- Fixed upright right-Joy-Con stick-assist input selection while preserving fine axis precision. - -## Portable updates - -- Safe portable updating uses **DS4Updater 2.0.5**: checked downloads, staged replacement, preserved profiles and pairing data, and rollback on supported failures. -- The updater waits for the relevant apps to close rather than force-killing unrelated copies. Long portable-folder paths are supported. -- The portable ZIP remains complete, including the matching `viiper.exe`, Xbox emulation identity, required runtime, and offline dependency installers. - -## Before you update - -Close DS4Windows before installing or replacing files, and keep a backup of your profiles. Portable users coming from RC4.5.1 or older should use this ZIP for the initial upgrade; the new safe updater entry point is delivered in 4.5.2. - -Original Joy-Cons do not gain Joy-Con 2's optical mouse or extra hardware. Pairing is within the same generation; mixed original/Joy-Con 2 pairs are not supported. Original holding-style changes save to the current profile; Joy-Con 2 retains its per-controller choice. Original HD rumble approximates translated effects within its packet format, and the new raw-stick calibration wizard is not supported for original Joy-Cons. - -This is an **unsigned release candidate**, not a signed stable release. It uses Windows file version **5.0.5.2**. VIIPER remains the matching **0.1.3-rc4.5** build; a new broker installation is not required solely for this rumble correction. - -Automated regression and packet/lifecycle tests cover these changes. Fresh physical Hades II rumble acceptance, original Joy-Con feedback feel, and a launched-worker end-to-end portable update have not yet been confirmed; please report any problems with the connection type, virtual controller type, and logs. diff --git a/docs/validation/2026-09-09-rc453-release-notes.md b/docs/validation/2026-09-09-rc453-release-notes.md deleted file mode 100644 index 9c05b7b3..00000000 --- a/docs/validation/2026-09-09-rc453-release-notes.md +++ /dev/null @@ -1,22 +0,0 @@ -# Release Candidate 4.5.3 Hotfix — Reliable Stop & Reconnect - -This hotfix addresses a shutdown deadlock that could leave **Stop** disabled until DS4Windows restarted, sometimes alongside a `read failure: 995` message. It also protects a newly reconnected controller from delayed cleanup belonging to its previous connection. - -## What's fixed - -- Controller-removal callbacks no longer block a worker that Stop is waiting to finish. Cleanup remains serialized and tied to the exact connection. -- DS4 and DualSense recognize error 995 caused by their own deliberate Stop cancellation. Unexpected 995 errors and other read failures still retain their diagnostics and removal handling. -- A worker calling Stop cannot try to join or interrupt itself. -- Delayed removal cannot delete a replacement controller that reused the same device path or address. Hotplug also rejects controllers already being removed. - -## Before you update - -Close DS4Windows before installing or replacing files, and back up your profiles. Extract the complete portable ZIP; do not replace only `DS4Windows.exe`. Portable users on RC4.5.1 or older should use the ZIP for the initial upgrade—the safe updater entry point arrived in RC4.5.2. - -The portable package remains complete, with the unchanged **VIIPER 0.1.3-rc4.5**, matching `viiper.exe`, Xbox emulation identity, required runtime, and offline dependency installers. No new broker installation is required solely for this hotfix. Portable updating to RC4.5.3 uses **DS4Updater 2.0.6**. - -## Validation and limits - -The versioned build passed **4,918 automated tests**, with **zero failures** and **11 existing opt-in skips**. This includes **29 new shutdown/reconnect regression cases** and three release-ordering checks. Tests reproduce the stop/removal race and verify cancellation and reconnect ownership; they do not establish physical confirmation of the reporter's session. - -This is an **unsigned prerelease**, not a signed stable release. Release tag: **VIIPERRC4.5.3**. Windows file version: **5.0.5.3**. diff --git a/docs/validation/2026-09-09-rc454-release-notes.md b/docs/validation/2026-09-09-rc454-release-notes.md deleted file mode 100644 index 65bb0a15..00000000 --- a/docs/validation/2026-09-09-rc454-release-notes.md +++ /dev/null @@ -1,22 +0,0 @@ -# Release Candidate 4.5.4 Hotfix — Read Failure Recovery - -This follow-up makes DS4 Bluetooth recovery safer after an unexpected read failure, including failures that happen **before pressing Stop**. - -## What's fixed - -- After a terminal Bluetooth read failure, DS4Windows no longer forces another physical output write before removing the failed controller. A stalled output request must not block that recovery path. -- Failed-read cleanup also avoids publishing a fresh effect into the Bluetooth audio lane. -- Normal rumble, lightbar, CopyCat settings and the working control-pipe behavior from issue #84 are unchanged. -- Includes 4.5.3's Stop/removal deadlock and reconnect-ownership fixes. A new regression test verifies the corrected sequence: unexpected read error first, then Stop. - -This fixes application recovery behavior. It does **not** suppress unexpected errors or claim to prevent every Windows read failure. The initiating cause of the reporter's particular 995 remains unconfirmed. - -Validation: **4,927 automated tests passed**, zero failures, with 11 existing opt-in tests skipped. The new recovery regressions failed against their previous behavior before passing with the fixes. - -## Updating - -Close DS4Windows before updating and back up your profiles. The installer and complete portable ZIP include the required runtime, VIIPER **0.1.3-rc4.5**, Xbox emulation identity and offline dependency installers. - -Portable RC4.5.2 and newer use the already-published [DS4Updater 2.0.6](https://github.com/hbashton/DS4Updater/releases/tag/v2.0.6). Its verified-metadata version handling supports this release without another updater code change. For an initial upgrade from RC4.5.1 or older, extract the complete ZIP into a new folder and copy your settings/profiles. - -Release tag: **VIIPERRC4.5.4**. Windows file version: **5.0.5.4**. This is an **unsigned prerelease**. diff --git a/docs/validation/2026-09-09-rc455-release-notes.md b/docs/validation/2026-09-09-rc455-release-notes.md deleted file mode 100644 index 8ad2610f..00000000 --- a/docs/validation/2026-09-09-rc455-release-notes.md +++ /dev/null @@ -1,24 +0,0 @@ -# Release Candidate 4.5.5 Hotfix — Reliable Setup & Startup - -This hotfix repairs a setup/startup conflict that could stop an upgrade with **VIIPER/USB-IP setup failed (0x80070001)**, even though the USB/IP driver was healthy. - -## What's fixed - -- Setup can recover the verified older VIIPER startup registration left behind by the affected build, including a recognized portable-broker target. It saves the original task before changing it. -- DS4Windows no longer redirects the installed startup task to a portable runtime preference or removes the task's ownership marker. -- With installed startup enabled, runtime selection follows the verified installed broker too, so an old portable preference cannot put the next sign-in into a repair loop. -- The app and installer now agree on the broker's startup priority, preventing repeated unnecessary task replacement. -- Owned tasks are updated in place instead of being deleted before replacement. Unrelated startup tasks are preserved. -- When setup cannot safely recover a task, the error identifies the task conflict instead of hiding it behind a generic dependency failure. Retry diagnostics refer to the current attempt. - -Includes the earlier 4.5.3/4.5.4 Stop and read-failure recovery fixes. This hotfix does not change controller input, rumble or USB/IP transport behavior. - -Validation: **4,958 automated tests passed**, zero failures, with 11 existing opt-in skips. Startup ownership/recovery, durable backup and setup-error regression checks also passed. Allocation assertions remain enabled. - -## Updating - -Close DS4Windows before updating and back up your profiles. The installer and complete portable ZIP include the runtime, VIIPER **0.1.3-rc4.5**, Xbox emulation identity and offline dependency installers. No separate broker update is required. - -Portable RC4.5.2 and newer can use the already-published [DS4Updater 2.0.6](https://github.com/hbashton/DS4Updater/releases/tag/v2.0.6). For an initial upgrade from RC4.5.1 or older, extract the complete ZIP into a new folder and copy your settings/profiles. - -Release tag: **VIIPERRC4.5.5**. Windows file version: **5.0.5.5**. This is an **unsigned prerelease**. diff --git a/docs/validation/2026-09-09-read-failure-recovery.md b/docs/validation/2026-09-09-read-failure-recovery.md index 1c41dbb4..68bbd99a 100644 --- a/docs/validation/2026-09-09-read-failure-recovery.md +++ b/docs/validation/2026-09-09-read-failure-recovery.md @@ -1,5 +1,8 @@ # Read failure before Stop: recovery validation, 2026-09-09 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Corrected report and scope The user clarified the sequence: a controller logs read failure 995 first, and diff --git a/docs/validation/2026-09-09-release-publication-policy.md b/docs/validation/2026-09-09-release-publication-policy.md index cc8b3ef9..94ed0190 100644 --- a/docs/validation/2026-09-09-release-publication-policy.md +++ b/docs/validation/2026-09-09-release-publication-policy.md @@ -1,5 +1,8 @@ # Draft-first release publication, 2026-09-09 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + The user explicitly authorized an unsigned release candidate. This exception requires both the same-repository GitHub release's actual prerelease flag and an exact named `VIIPERRC` ordinal tag (for example `VIIPERRC4.5`). Stable diff --git a/docs/validation/2026-09-09-stop-removal-deadlock.md b/docs/validation/2026-09-09-stop-removal-deadlock.md index 58adb003..a125da8f 100644 --- a/docs/validation/2026-09-09-stop-removal-deadlock.md +++ b/docs/validation/2026-09-09-stop-removal-deadlock.md @@ -1,5 +1,8 @@ # RC4.5 Stop/removal regression — 2026-09-09 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Report and scope A Reddit user reports that clicking **Stop** after upgrading to RC4.5 logs diff --git a/docs/validation/2026-09-09-switch2-rumble-regression.md b/docs/validation/2026-09-09-switch2-rumble-regression.md index a477536e..a4b54932 100644 --- a/docs/validation/2026-09-09-switch2-rumble-regression.md +++ b/docs/validation/2026-09-09-switch2-rumble-regression.md @@ -1,5 +1,8 @@ # Switch 2 RC4.5 rumble regression, 2026-09-09 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Report and scope After installing RC4.5, the user reported stuttering Test Heavy and Test Light diff --git a/docs/validation/2026-09-10-audio-haptics-routing-and-portable-startup.md b/docs/validation/2026-09-10-audio-haptics-routing-and-portable-startup.md index 4491bc9a..a674d1a7 100644 --- a/docs/validation/2026-09-10-audio-haptics-routing-and-portable-startup.md +++ b/docs/validation/2026-09-10-audio-haptics-routing-and-portable-startup.md @@ -1,5 +1,8 @@ # Audio Haptics routing, Nintendo output, and portable startup +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + Status: source implemented, independently reviewed, automated validation passed, and complete private candidate F packaged and verified. Not launched; this is not a release or hardware acceptance record. ## Requested work diff --git a/docs/validation/2026-09-10-dualsense-bluetooth-native-ordering.md b/docs/validation/2026-09-10-dualsense-bluetooth-native-ordering.md index 27c5b41d..891577b6 100644 --- a/docs/validation/2026-09-10-dualsense-bluetooth-native-ordering.md +++ b/docs/validation/2026-09-10-dualsense-bluetooth-native-ordering.md @@ -1,5 +1,8 @@ # DualSense Bluetooth native command ordering, 2026-09-10 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + Final source validation: **5,185 passed, 0 failed, 11 gated skips** (5,196 total). The identified native-command coalescing defect is corrected in source. Complete portable E has subsequently been built and launched; physical GTA V Enhanced diff --git a/docs/validation/2026-09-10-nintendo-rumble-ab.md b/docs/validation/2026-09-10-nintendo-rumble-ab.md index 1c595a16..3d35592f 100644 --- a/docs/validation/2026-09-10-nintendo-rumble-ab.md +++ b/docs/validation/2026-09-10-nintendo-rumble-ab.md @@ -1,5 +1,8 @@ # Nintendo rumble: controlled comparison, September 10 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + This is a private validation record, not release notes or a smoothness claim. The user extended unattended work to one hour at approximately 12:56 UTC; the current work window ends at 13:56 UTC on September 10, 2026. diff --git a/docs/validation/2026-09-10-rc456-stabilization.md b/docs/validation/2026-09-10-rc456-stabilization.md index 1ecfd6ae..62a8cb70 100644 --- a/docs/validation/2026-09-10-rc456-stabilization.md +++ b/docs/validation/2026-09-10-rc456-stabilization.md @@ -1,5 +1,8 @@ # RC4.5.6 stabilization and publication ledger +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + Status: published; required pre-publication and post-publication gates passed. This record is an evidence ledger, not a claim that every possible race, controller/game combination, or installation failure has been eliminated. ## Scope and version contract diff --git a/docs/validation/2026-09-11-dualsense-bt-rc456-regression.md b/docs/validation/2026-09-11-dualsense-bt-rc456-regression.md index bcbf9a7b..f7d6e552 100644 --- a/docs/validation/2026-09-11-dualsense-bt-rc456-regression.md +++ b/docs/validation/2026-09-11-dualsense-bt-rc456-regression.md @@ -1,5 +1,8 @@ # DualSense Bluetooth feedback regression after RC4.5.6 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + Status: source fixes reviewed and full test suite green; physical game acceptance pending. This is not a release or a claim that subjective haptics have been verified. diff --git a/docs/validation/2026-09-11-native-rumble-and-disconnect.md b/docs/validation/2026-09-11-native-rumble-and-disconnect.md index 33f462e0..f91d95aa 100644 --- a/docs/validation/2026-09-11-native-rumble-and-disconnect.md +++ b/docs/validation/2026-09-11-native-rumble-and-disconnect.md @@ -1,5 +1,8 @@ # Native DualSense rumble and queued-disconnect investigation +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Observed environment The user was deliberately rolling back installed releases to find a haptics diff --git a/docs/validation/2026-09-11-rc457-publication.md b/docs/validation/2026-09-11-rc457-publication.md index 6291c505..f19b195a 100644 --- a/docs/validation/2026-09-11-rc457-publication.md +++ b/docs/validation/2026-09-11-rc457-publication.md @@ -1,5 +1,8 @@ # RC4.5.7 hotfix publication ledger +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Release identity - Requested title: `Release Candidate 4.5.7 Hotfix — Sorry, broke Vibration/Triggers`. diff --git a/docs/validation/2026-09-11-rc458-publication.md b/docs/validation/2026-09-11-rc458-publication.md index ff0f1d76..5547be9e 100644 --- a/docs/validation/2026-09-11-rc458-publication.md +++ b/docs/validation/2026-09-11-rc458-publication.md @@ -1,5 +1,8 @@ # RC4.5.8 publication ledger +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Requested release - Tag: `VIIPERRC4.5.8`. diff --git a/docs/validation/2026-09-12-cross-controller-feedback.md b/docs/validation/2026-09-12-cross-controller-feedback.md index dbfca544..8df14f73 100644 --- a/docs/validation/2026-09-12-cross-controller-feedback.md +++ b/docs/validation/2026-09-12-cross-controller-feedback.md @@ -1,5 +1,8 @@ # Cross-controller feedback throughput and stop audit +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Scope and rate interpretation The follow-up to RC4.5.9 asks whether other controllers have analogous feedback diff --git a/docs/validation/2026-09-12-issue81-feedback-delay.md b/docs/validation/2026-09-12-issue81-feedback-delay.md index 666d62bb..dcac83f0 100644 --- a/docs/validation/2026-09-12-issue81-feedback-delay.md +++ b/docs/validation/2026-09-12-issue81-feedback-delay.md @@ -1,5 +1,8 @@ # Issue 81: dense native feedback delay after RC4.5.8 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Evidence and limits The [reporter's RC4.5.8 follow-up](https://github.com/hbashton/DS4Windows/issues/81#issuecomment-5642437358) diff --git a/docs/validation/2026-09-12-issue81-native-rate.md b/docs/validation/2026-09-12-issue81-native-rate.md index 5d04c2a3..ae6413bc 100644 --- a/docs/validation/2026-09-12-issue81-native-rate.md +++ b/docs/validation/2026-09-12-issue81-native-rate.md @@ -1,5 +1,8 @@ # Issue 81: separate native-feedback pacing from local settings +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + This follows `47cc945` (conservative pending-repeat suppression). It does not replace ordered feedback with latest-value state and does not relax unknown trigger-byte preservation. diff --git a/docs/validation/2026-09-12-native-credit-allocation-gate.md b/docs/validation/2026-09-12-native-credit-allocation-gate.md index ddf50a9f..5e5c0e78 100644 --- a/docs/validation/2026-09-12-native-credit-allocation-gate.md +++ b/docs/validation/2026-09-12-native-credit-allocation-gate.md @@ -1,5 +1,8 @@ # Native Bluetooth write-credit allocation gate — 2026-09-12 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Release held; same-workload attribution required The first RC4.5.9 rebuilt full run failed diff --git a/docs/validation/2026-09-12-rc459-publication.md b/docs/validation/2026-09-12-rc459-publication.md index 7682533d..437c7bf2 100644 --- a/docs/validation/2026-09-12-rc459-publication.md +++ b/docs/validation/2026-09-12-rc459-publication.md @@ -1,5 +1,8 @@ # RC4.5.9 publication ledger +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Published release identity - [VIIPERRC4.5.9](https://github.com/hbashton/DS4Windows/releases/tag/VIIPERRC4.5.9): diff --git a/docs/validation/2026-09-12-sonar-ds4-dualsense-audio.md b/docs/validation/2026-09-12-sonar-ds4-dualsense-audio.md index bb389a22..de2c1ed6 100644 --- a/docs/validation/2026-09-12-sonar-ds4-dualsense-audio.md +++ b/docs/validation/2026-09-12-sonar-ds4-dualsense-audio.md @@ -1,5 +1,8 @@ # DualShock 4 audio to physical DualSense / Sonar, 2026-09-12 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Confirmed live fault Installed DS4Windows PID 30652, Bluetooth helper PID 27428, VIIPER PID 30124. diff --git a/docs/validation/2026-09-14-axis-calibration-and-trigger-ui.md b/docs/validation/2026-09-14-axis-calibration-and-trigger-ui.md index ca0bfe67..7c533977 100644 --- a/docs/validation/2026-09-14-axis-calibration-and-trigger-ui.md +++ b/docs/validation/2026-09-14-axis-calibration-and-trigger-ui.md @@ -1,5 +1,8 @@ # Axis Config calibration and legacy trigger UI cleanup +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Requested changes - Move the 360-degree calibration feature to Axis Config, not button remapping diff --git a/docs/validation/2026-09-14-ds4-policy-allocation-gate.md b/docs/validation/2026-09-14-ds4-policy-allocation-gate.md index 41b1d8cc..0fcd27f4 100644 --- a/docs/validation/2026-09-14-ds4-policy-allocation-gate.md +++ b/docs/validation/2026-09-14-ds4-policy-allocation-gate.md @@ -1,5 +1,8 @@ # DS4 profile-output allocation gate — 2026-09-14 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Release held on the original failure The first final RC4.6 run failed diff --git a/docs/validation/2026-09-14-dualsense-manual-disconnect.md b/docs/validation/2026-09-14-dualsense-manual-disconnect.md index 56e6ffbf..ff0f7002 100644 --- a/docs/validation/2026-09-14-dualsense-manual-disconnect.md +++ b/docs/validation/2026-09-14-dualsense-manual-disconnect.md @@ -1,5 +1,8 @@ # DualSense manual Bluetooth disconnect, 2026-09-14 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Report and evidence The user reported that pressing Disconnect turned off a Bluetooth DualSense, diff --git a/docs/validation/2026-09-14-flick-stick-calibration.md b/docs/validation/2026-09-14-flick-stick-calibration.md index 31008171..8805a07d 100644 --- a/docs/validation/2026-09-14-flick-stick-calibration.md +++ b/docs/validation/2026-09-14-flick-stick-calibration.md @@ -1,5 +1,8 @@ # Bindable 360-degree flick-stick calibration +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + This records the initial implementation in `62c6a6e`. The subsequent [Axis Config revision](2026-09-14-axis-calibration-and-trigger-ui.md) replaces the remapper UI described below; the runtime and binding compatibility tests diff --git a/docs/validation/2026-09-14-hidhide-client-alias-guard.md b/docs/validation/2026-09-14-hidhide-client-alias-guard.md index 685bb4b0..29b7f0df 100644 --- a/docs/validation/2026-09-14-hidhide-client-alias-guard.md +++ b/docs/validation/2026-09-14-hidhide-client-alias-guard.md @@ -1,5 +1,8 @@ # HidHide client alias crash and DS4Windows safeguard +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Confirmed local cause The installed HidHide 1.5.230 configuration client failed while populating its diff --git a/docs/validation/2026-09-14-issue103-startup-task-collision.md b/docs/validation/2026-09-14-issue103-startup-task-collision.md index b275fad1..dd580cc8 100644 --- a/docs/validation/2026-09-14-issue103-startup-task-collision.md +++ b/docs/validation/2026-09-14-issue103-startup-task-collision.md @@ -1,5 +1,8 @@ # Startup-task recovery for issues #98 and #103 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Evidence and scope [Issue #103](https://github.com/hbashton/DS4Windows/issues/103) reports setup diff --git a/docs/validation/2026-09-14-issues-99-77-46.md b/docs/validation/2026-09-14-issues-99-77-46.md index e7b133a5..fb9bc4e8 100644 --- a/docs/validation/2026-09-14-issues-99-77-46.md +++ b/docs/validation/2026-09-14-issues-99-77-46.md @@ -1,5 +1,8 @@ # Issues #99, #77 and #46 — production follow-up, 2026-09-14 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + This records completed source changes and automated checks. Source fixes and public delivery are separate. The published RC4.6.1 assets are not being replaced. No real installer, reboot, scheduled-task mutation, registry edit, controller diff --git a/docs/validation/2026-09-14-pull-request-review.md b/docs/validation/2026-09-14-pull-request-review.md index cc53673f..6923f161 100644 --- a/docs/validation/2026-09-14-pull-request-review.md +++ b/docs/validation/2026-09-14-pull-request-review.md @@ -1,5 +1,8 @@ # Pull request review — 2026-09-14 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + Scope: integrate PR #86 with current runtime behavior, then review all open PRs, retaining useful work from `anagnorisis2peripeteia` and closing stale or superseded proposals with evidence. No released tag or asset is replaced by this source work. diff --git a/docs/validation/2026-09-14-rare-input-neutral-investigation.md b/docs/validation/2026-09-14-rare-input-neutral-investigation.md index d3cf4fd5..c1a00be5 100644 --- a/docs/validation/2026-09-14-rare-input-neutral-investigation.md +++ b/docs/validation/2026-09-14-rare-input-neutral-investigation.md @@ -1,5 +1,8 @@ # Rare movement interruption: investigation and admission guard, 2026-09-14 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Incident status: not yet attributed The user reported one unexpected movement stop in approximately 24 hours and diff --git a/docs/validation/2026-09-14-rc46-publication.md b/docs/validation/2026-09-14-rc46-publication.md index 4c1bc051..8bb7b6c9 100644 --- a/docs/validation/2026-09-14-rc46-publication.md +++ b/docs/validation/2026-09-14-rc46-publication.md @@ -1,5 +1,8 @@ # RC4.6 publication ledger +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Published identity - [VIIPERRC4.6](https://github.com/hbashton/DS4Windows/releases/tag/VIIPERRC4.6): diff --git a/docs/validation/2026-09-14-rc461-publication.md b/docs/validation/2026-09-14-rc461-publication.md index 675bcdb8..9c0c8e12 100644 --- a/docs/validation/2026-09-14-rc461-publication.md +++ b/docs/validation/2026-09-14-rc461-publication.md @@ -1,5 +1,8 @@ # RC4.6.1 publication evidence, 2026-09-14 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Identity and scope - Release tag: `VIIPERRC4.6.1`. diff --git a/docs/validation/2026-09-14-rc462-publication.md b/docs/validation/2026-09-14-rc462-publication.md index 68e61212..83558b71 100644 --- a/docs/validation/2026-09-14-rc462-publication.md +++ b/docs/validation/2026-09-14-rc462-publication.md @@ -1,5 +1,8 @@ # RC4.6.2 and updater 2.0.7 publication evidence, 2026-09-14 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Release identity - DS4Windows tag: `VIIPERRC4.6.2`, annotated at `6147981d7720636d1b46d3586efe48e6aaecd9a4` after exact-source main CI passed. diff --git a/docs/validation/2026-09-20-concurrent-mouse-clicks.md b/docs/validation/2026-09-20-concurrent-mouse-clicks.md index 07191736..bf764f9a 100644 --- a/docs/validation/2026-09-20-concurrent-mouse-clicks.md +++ b/docs/validation/2026-09-20-concurrent-mouse-clicks.md @@ -1,5 +1,8 @@ # RC4.6.3 mouse concurrency validation +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Scope and baseline Started from fetched `origin/main` at diff --git a/docs/validation/2026-09-21-dualsense-rear-underrun.md b/docs/validation/2026-09-21-dualsense-rear-underrun.md index 9930edcf..5c5b2b93 100644 --- a/docs/validation/2026-09-21-dualsense-rear-underrun.md +++ b/docs/validation/2026-09-21-dualsense-rear-underrun.md @@ -1,5 +1,8 @@ # DualSense rear-channel underrun — 2026-09-21 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Evidence and limits External USB/IP source PCM and physical Bluetooth HID captures were compared diff --git a/docs/validation/2026-09-21-temporary-profile-input-continuity.md b/docs/validation/2026-09-21-temporary-profile-input-continuity.md index 19d4e810..5ae8badf 100644 --- a/docs/validation/2026-09-21-temporary-profile-input-continuity.md +++ b/docs/validation/2026-09-21-temporary-profile-input-continuity.md @@ -1,5 +1,8 @@ # Temporary-profile input continuity — 2026-09-21 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Report and scope The reporter describes input freezes on both pressing and releasing a Profile diff --git a/docs/validation/2026-09-22-dualsense-lightbar-exit-fifo.md b/docs/validation/2026-09-22-dualsense-lightbar-exit-fifo.md index af1b834e..26147c22 100644 --- a/docs/validation/2026-09-22-dualsense-lightbar-exit-fifo.md +++ b/docs/validation/2026-09-22-dualsense-lightbar-exit-fifo.md @@ -1,5 +1,8 @@ # DualSense Bluetooth lightbar restore ordering, 2026-09-22 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Status and scope This is a follow-up to the report that the orange profile lightbar did not diff --git a/docs/validation/2026-09-22-dualsense-settings-rumble.md b/docs/validation/2026-09-22-dualsense-settings-rumble.md index e988ddaf..7411e210 100644 --- a/docs/validation/2026-09-22-dualsense-settings-rumble.md +++ b/docs/validation/2026-09-22-dualsense-settings-rumble.md @@ -1,5 +1,8 @@ # DualSense Bluetooth settings-refresh rumble continuity +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Reproduction and scope A matched, fixed HID replay reproduced a Hades II rumble pulse being interrupted diff --git a/docs/validation/2026-09-22-installer-unattended-mutex.md b/docs/validation/2026-09-22-installer-unattended-mutex.md index 9923d12c..b79eeb04 100644 --- a/docs/validation/2026-09-22-installer-unattended-mutex.md +++ b/docs/validation/2026-09-22-installer-unattended-mutex.md @@ -1,5 +1,8 @@ # Unattended setup prompt and mutex correction +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Confirmed cause The RC4.6.4 all-in-one installer repeatedly received 1618 from its diff --git a/docs/validation/README.md b/docs/validation/README.md new file mode 100644 index 00000000..75fd2ac2 --- /dev/null +++ b/docs/validation/README.md @@ -0,0 +1,91 @@ +# Validation archive + +[Documentation index](../README.md). These records preserve dated test results, +investigations and remaining acceptance limits. They do not establish the status +of a newer release. Release history is in [CHANGELOG.md](../../CHANGELOG.md). + +- [Joy-Con 2 artwork and thumbnail bounds — 2026-09-06](2026-09-06-joycon-artwork.md) +- [Joy-Con 2 Bluetooth mouse and motion startup — 2026-09-06](2026-09-06-joycon-bluetooth-sensors.md) +- [Complete Joy-Con thumbnails — b86 follow-up, 2026-09-06](2026-09-06-joycon-complete-silhouette.md) +- [Joy-Con Link/Unlink and retained virtual pad — b87 preview](2026-09-06-joycon-link-handoff.md) +- [Joy-Con orientation UI validation — 2026-09-06](2026-09-06-joycon-orientation.md) +- [Switch 2 Pro Bluetooth headset audio: evidence and remaining work](2026-09-06-switch2-bluetooth-audio-audit.md) +- [Switch 2 playstyle UI and Pro profile crash — b83](2026-09-06-switch2-playstyle.md) +- [Switch 2 Pro USB audio: physical headphone output confirmed](2026-09-06-switch2-pro-usb-audio.md) +- [Switch 2 Pro Bluetooth headphone delivery experiments](2026-09-07-switch2-bt-audio-delivery-experiments.md) +- [Switch 2 console headphone reference capture: feasibility and gates](2026-09-07-switch2-console-audio-capture-plan.md) +- [b90: persistent Switch 2 Pro Bluetooth audio probing](2026-09-07-switch2-inprocess-audio-probe.md) +- [Controller diagram remapping repairs, 2026-09-08](2026-09-08-controller-diagram-remapping.md) +- [Controller follow-up rollup, 2026-09-08](2026-09-08-controller-followup-rollup.md) +- [Controller Readings update repair, 2026-09-08](2026-09-08-controller-readings.md) +- [GitHub reported-bug audit, 2026-09-08](2026-09-08-github-reported-bugs.md) +- [Gyro-calibration reader contention, 2026-09-08](2026-09-08-gyro-calibration-reader-contention.md) +- [Duplicate Apps & Features entries, 2026-09-08](2026-09-08-installer-duplicate-arp-entries.md) +- [Issue #32 startup-log diagnosis — 2026-09-08](2026-09-08-issue32-startup-log-diagnosis.md) +- [Issue #68: Bluetooth Switch Pro startup, 2026-09-08](2026-09-08-issue68-bluetooth-startup.md) +- [Issue #74: restore normal trigger effects after Trigger Lab, 2026-09-08](2026-09-08-issue74-trigger-restoration.md) +- [Issue #80: renamed executable setup, 2026-09-08](2026-09-08-issue80-renamed-executable-setup.md) +- [Issue #82: legacy joystick exposure investigation, 2026-09-08](2026-09-08-issue82-legacy-joystick-exposure.md) +- [Issue #94: startup preference handling, 2026-09-08](2026-09-08-issue94-startup-preference.md) +- [Joy-Con 2 counter-reset disconnect: live evidence, 2026-09-08](2026-09-08-joycon-counter-reset.md) +- [Left Joy-Con disconnect log review, 2026-09-08](2026-09-08-joycon-left-disconnect-log-review.md) +- [Normal portable broker startup](2026-09-08-portable-broker-startup.md) +- [RC4.5 tester-package qualification](2026-09-08-rc45-qualification.md) +- [Reported-issue follow-up, 2026-09-08](2026-09-08-reported-issues-follow-up.md) +- [Switch 2 Pro Bluetooth receiver setup experiments](2026-09-08-switch2-bt-receiver-plans.md) +- [Switch 2 held-rumble maintenance, 2026-09-08](2026-09-08-switch2-held-rumble-maintenance.md) +- [Switch 2 Pro motion basis correction, 2026-09-08](2026-09-08-switch2-pro-motion-basis.md) +- [Switch 2 local identity and profile linking, 2026-09-08](2026-09-08-switch2-profile-identity.md) +- [Switch 2 Pro Bluetooth audio: public-source research, 2026-09-08](2026-09-08-switch2-public-audio-research.md) +- [Tooltip theme readability, 2026-09-08](2026-09-08-tooltip-theme-readability.md) +- [Active user-request ledger — 2026-09-09](2026-09-09-active-request-ledger.md) +- [RC4.5 GitHub publication](2026-09-09-github-rc45-publication.md) +- [Native burst delivery and Joy-Con rumble follow-up](2026-09-09-haptics-burst-and-joycon-followup.md) +- [RC4.5.5 installer and startup recovery](2026-09-09-installer-startup-recovery.md) +- [Nintendo allocation-counter release gate — 2026-09-09](2026-09-09-nintendo-allocation-gate.md) +- [Nintendo UI and original Joy-Con integration — 2026-09-09](2026-09-09-nintendo-ui-and-input-parity.md) +- [Read failure before Stop: recovery validation, 2026-09-09](2026-09-09-read-failure-recovery.md) +- [Draft-first release publication, 2026-09-09](2026-09-09-release-publication-policy.md) +- [RC4.5 Stop/removal regression — 2026-09-09](2026-09-09-stop-removal-deadlock.md) +- [Switch 2 RC4.5 rumble regression, 2026-09-09](2026-09-09-switch2-rumble-regression.md) +- [Audio Haptics routing, Nintendo output, and portable startup](2026-09-10-audio-haptics-routing-and-portable-startup.md) +- [DualSense Bluetooth native command ordering, 2026-09-10](2026-09-10-dualsense-bluetooth-native-ordering.md) +- [Nintendo rumble: controlled comparison, September 10](2026-09-10-nintendo-rumble-ab.md) +- [RC4.5.6 stabilization and publication ledger](2026-09-10-rc456-stabilization.md) +- [DualSense Bluetooth feedback regression after RC4.5.6](2026-09-11-dualsense-bt-rc456-regression.md) +- [Native DualSense rumble and queued-disconnect investigation](2026-09-11-native-rumble-and-disconnect.md) +- [RC4.5.7 hotfix publication ledger](2026-09-11-rc457-publication.md) +- [RC4.5.8 publication ledger](2026-09-11-rc458-publication.md) +- [Cross-controller feedback throughput and stop audit](2026-09-12-cross-controller-feedback.md) +- [Issue 81: dense native feedback delay after RC4.5.8](2026-09-12-issue81-feedback-delay.md) +- [Issue 81: separate native-feedback pacing from local settings](2026-09-12-issue81-native-rate.md) +- [Native Bluetooth write-credit allocation gate — 2026-09-12](2026-09-12-native-credit-allocation-gate.md) +- [RC4.5.9 publication ledger](2026-09-12-rc459-publication.md) +- [DualShock 4 audio to physical DualSense / Sonar, 2026-09-12](2026-09-12-sonar-ds4-dualsense-audio.md) +- [Axis Config calibration and legacy trigger UI cleanup](2026-09-14-axis-calibration-and-trigger-ui.md) +- [DS4 profile-output allocation gate — 2026-09-14](2026-09-14-ds4-policy-allocation-gate.md) +- [DualSense manual Bluetooth disconnect, 2026-09-14](2026-09-14-dualsense-manual-disconnect.md) +- [Bindable 360-degree flick-stick calibration](2026-09-14-flick-stick-calibration.md) +- [HidHide client alias crash and DS4Windows safeguard](2026-09-14-hidhide-client-alias-guard.md) +- [Startup-task recovery for issues #98 and #103](2026-09-14-issue103-startup-task-collision.md) +- [Issues #99, #77 and #46 — production follow-up, 2026-09-14](2026-09-14-issues-99-77-46.md) +- [Pull request review — 2026-09-14](2026-09-14-pull-request-review.md) +- [Rare movement interruption: investigation and admission guard, 2026-09-14](2026-09-14-rare-input-neutral-investigation.md) +- [RC4.6 publication ledger](2026-09-14-rc46-publication.md) +- [RC4.6.1 publication evidence, 2026-09-14](2026-09-14-rc461-publication.md) +- [RC4.6.2 and updater 2.0.7 publication evidence, 2026-09-14](2026-09-14-rc462-publication.md) +- [RC4.6.3 mouse concurrency validation](2026-09-20-concurrent-mouse-clicks.md) +- [DualSense rear-channel underrun — 2026-09-21](2026-09-21-dualsense-rear-underrun.md) +- [Temporary-profile input continuity — 2026-09-21](2026-09-21-temporary-profile-input-continuity.md) +- [DualSense Bluetooth lightbar restore ordering, 2026-09-22](2026-09-22-dualsense-lightbar-exit-fifo.md) +- [DualSense Bluetooth settings-refresh rumble continuity](2026-09-22-dualsense-settings-rumble.md) +- [Unattended setup prompt and mutex correction](2026-09-22-installer-unattended-mutex.md) +- [DualSense Edge fidelity audit](dualsense-edge-fidelity-audit.md) +- [Edge, updater and portable startup follow-up — 2026-09-23](edge-updater-portable-followup-20260923.md) +- [Update sources for this project](../reference.md) +- [Log navigation stall — 2026-09-22](log-navigation-20260922.md) +- [RC4.6.6 startup, dependencies and Edge delivery](rc466-delivery-ledger-20260923.md) +- [USB/IP driver verification timeout: issues #118 and #126](usbip-driver-verification-timeout.md) +- [VIIPER recovery contract](viiper-recovery-20260923.md) + +- [Legacy user guide](legacy-user-guide.md): original instructions and screenshots retained as historical context. diff --git a/docs/validation/dualsense-edge-fidelity-audit.md b/docs/validation/dualsense-edge-fidelity-audit.md index 1ab501ea..c0bce5d7 100644 --- a/docs/validation/dualsense-edge-fidelity-audit.md +++ b/docs/validation/dualsense-edge-fidelity-audit.md @@ -1,5 +1,8 @@ # DualSense Edge fidelity audit +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Goal Complete evidence-backed physical DualSense Edge support and VIIPER Edge diff --git a/docs/validation/edge-updater-portable-followup-20260923.md b/docs/validation/edge-updater-portable-followup-20260923.md index 5ecf1071..93529e96 100644 --- a/docs/validation/edge-updater-portable-followup-20260923.md +++ b/docs/validation/edge-updater-portable-followup-20260923.md @@ -1,5 +1,8 @@ # Edge, updater and portable startup follow-up — 2026-09-23 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Requests and acceptance 1. **Physical and emulated DualSense Edge fidelity.** Compare independent diff --git a/user_guide.md b/docs/validation/legacy-user-guide.md similarity index 97% rename from user_guide.md rename to docs/validation/legacy-user-guide.md index 19572864..73f127f0 100644 --- a/user_guide.md +++ b/docs/validation/legacy-user-guide.md @@ -1,3 +1,8 @@ +# Legacy DS4Windows user guide + +This inherited guide records an earlier interface and its original screenshots. +Use the [illustrated user guide](../user-guide.md) for the maintained instructions. + ## User Guide After completing the initial setup of the required drivers and dependencies, you are greeted with the main DS4Windows tab, controllers. diff --git a/docs/validation/log-navigation-20260922.md b/docs/validation/log-navigation-20260922.md index fbae8a3f..b801b1e0 100644 --- a/docs/validation/log-navigation-20260922.md +++ b/docs/validation/log-navigation-20260922.md @@ -1,5 +1,8 @@ # Log navigation stall — 2026-09-22 +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Observed failure An installed RC4.6.4 session intermittently became unresponsive when opening Log. diff --git a/docs/validation/rc466-delivery-ledger-20260923.md b/docs/validation/rc466-delivery-ledger-20260923.md index 00943b96..694e842b 100644 --- a/docs/validation/rc466-delivery-ledger-20260923.md +++ b/docs/validation/rc466-delivery-ledger-20260923.md @@ -1,5 +1,8 @@ # RC4.6.6 startup, dependencies and Edge delivery +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + ## Requested outcome Audit startup, detection, dependency checks, repair and update as one lifecycle; diff --git a/docs/validation/viiper-recovery-20260923.md b/docs/validation/viiper-recovery-20260923.md index a8ce1c75..02965852 100644 --- a/docs/validation/viiper-recovery-20260923.md +++ b/docs/validation/viiper-recovery-20260923.md @@ -1,5 +1,8 @@ # VIIPER recovery contract +> **Historical record.** This preserves the source, tests and limitations recorded at the time; it is not current setup guidance. See the [documentation index](../README.md). + + RC4.6.5 keeps broker maintenance separate from full application installation. - A marked portable package repairs only `viiper.exe` beside its running app.