You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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.