• v0.10.4: volume slider + XInput multi-DLL fallback
    release / Build Windows .zip (push) Canceled after 0s

    LastSkywalker released this 2026-06-01 22:10:09 +03:00 | 33 commits to main since this release

    Volume control (item #2):

    internal/audio/volume_windows.go — IAudioEndpointVolume off the
    default render endpoint (IMMDevice.Activate). Exposed
    GetVolume / StepUp(n) / StepDown(n) / SetMute as App methods.
    Step-based rather than absolute-set because
    SetMasterVolumeLevelScalar takes a float in XMM1 which
    syscall.SyscallN can't target without inline assembly; the
    Step* variants take only (this, ctx*) so they work via the
    existing callVTable helper. One step ≈ 2% (driver-defined).

    Frontend VolumePicker.tsx — full-screen modal, 21-segment
    horizontal bar visualising current step/stepCount + percentage,
    hot orange on the top 4 segments as a "loud" cue. Controller:
    ←→ ±1 step, LB/RB ±5 steps, A toggles mute, ↑ unmutes (matches
    VK_VOLUME_UP), ↓ mutes, B/Esc closes.

    Wired into DevicesMenu as a 4th tile (🔊 Громкость). Grid
    re-flowed to 4 columns.

    XInput multi-DLL fallback (item #1, palliative):

    internal/controller/xinput_windows.go — probe ALL three XInput
    DLL versions on init (1_4 / 1_3 / 9_1_0) plus the
    undocumented ordinal-100 XInputGetStateEx export from 1_3 (same
    XINPUT_STATE struct, also reports the Guide button). Try them
    in order on every poll until ONE backend reports a connected
    controller; stick with that (backend, slot) pair until it
    disconnects.

    Background: Moonlight / Sunshine ViGEm virtual gamepads
    sometimes register as XInput-class but only respond to specific
    XInput DLL versions, or only to GetStateEx. Without this the
    user had to launch Steam (Steam Input woke the slot) before
    GameSaver saw the pad. We now probe all four entry points.

    This is a palliative — the proper fix is a Windows.Gaming.Input
    fallback (WinRT API, also covers DualSense and other non-Xbox
    controllers natively). Saving for v0.11.0 with its own ADR
    because WinRT plumbing from Go is a substantial chunk
    (~400 LOC) that wants its own design pass.

    Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com

    Downloads