Skip to content

v1.4.22

Choose a tag to compare

@github-actions github-actions released this 06 Sep 15:42
· 9 commits to main since this release

Fixed

  • filter-chain.service restart storm could segfault PipeWire's convolver
    (#233).
    Only one call site parked the filter-chain graph
    (quiesce_filter_chain) before restarting it — every other one (EQ apply,
    tray actions, device-init repair) restarted it directly, racing PipeWire's
    realtime thread against the graph it was mid-teardown/rebuild on. Centralized
    in service_control.restart(): every "filter-chain" restart now quiesces
    first, and a standalone restart is additionally coalesced across processes
    (a burst of near-simultaneous calls — e.g. the GUI and the daemon reacting to
    the same preset/surround change — now reaches the service manager exactly
    once, not once per call). Verified live: a 10-call concurrent burst that
    previously would have produced 10 stop/start cycles now produces exactly one,
    with no coredump.
  • Raised api.alsa.period-size to 128 in the physical-sink no-suspend
    WirePlumber quirk (pw_quirks.py): keeping that sink permanently open
    (#223/#230 class) had it issuing USB isochronous transfers continuously,
    which measurably delayed a DualSense/DS5Dongle gamepad's HID reports on a
    shared USB controller. Doubling the period halves this sink's USB transfer
    frequency and frees bus time for the gamepad's polling.

Added

  • The headset's hardware auto-off timer works again (#180), without
    reintroducing #223/#230 — opt-in, disabled by default.
    A new whole-graph
    activity observer (idle_detect.py) watches every channel for a genuinely
    playing (not paused/corked) stream — including Discord and browser tabs,
    deliberately not built on the existing native-stream helper, which excludes
    pipewire-pulse clients and would repeat the #223 mistake of treating an
    app ASM cannot see as "not there". Once the whole graph has been idle long
    enough, ASM itself releases the last hop into the headset's own physical
    output — never by marking a node node.passive again — and restores it
    the instant any channel becomes active. New setting
    headset_idle_off_minutes (0 = disabled, the previous behaviour; no GUI
    control yet). Verified live against real usage: idle, Discord calls,
    paused vs. playing video, a game routed to an external output, and the
    full cut/restore cycle.