Settings the user changes on the headset now survive a power cycle, the Arctis 7
ChatMix dial is read correctly, and the update banner stops lying about what is
available when a distro repository lags behind GitHub.
Fixed
- A headset that powers off and on gets its settings back. Sidetone, mic
volume, the volume limiter and the on-device EQ live in the headset, not the
dongle. Switch it off and they are gone; on wireless families the dongle never
leaves the port, so a power cycle fires no USB event and ASM never re-applies
anything. The user's saved settings stayed on the Devices page while the
hardware ran on firmware defaults — reported for the Nova 3 Wireless in #221,
but the gap covers the whole wireless line. GG re-pushes on the connection
event; this is the same re-push. The connection status already drives the
audio redirect inon_device_status_changed; it now also schedules a settings
replay from the profile's owndevice_initframes — mode switches included, so
the two paths cannot drift — plus any explicit settingdevice_initdoes not
cover and the stored EQ curve. Runs off the listen thread, debounced on the
last push. (#221) - The Arctis 7 ChatMix dial no longer freezes at the position it had when the
daemon started. SteelSeries' spec declaresgame_chat_statusas out
[0x06, 0x24], back[0x06, 0x24, game, chat]— it is not part of the
battery reply, and this dongle pushes nothing when the dial turns. The profile
asked for it exactly once indevice_init, and the status poll only asked for
battery, so the mix ASM showed stayed pinned for the whole session.
manage_mix_changeapplies those values to the Game and Chat channel volumes,
which meant a dial at one end at startup pinned a channel there forever. The
poll now sendsstatus.extra_requestsafter the main request, each reply
mapped by its ownstarts_with, and a failing extra never costs the battery
reading that already landed. (#220) - The Arctis 7 2019 ChatMix dial reported the wrong volume.
game_chat_status's game/chat fields are a signed byte of attenuation from
0x00(full volume), counting down through0xFF…0xC0toward mute — the same
conventionhardware_eq.pyalready decodes for EQ gain. The plain unsigned
percentage(0, 100)mapping read the loudest position as 0% and clamped every
attenuated one to 100%. A signedpercentageparser is added and pointed at
media_mixandchat_mixinarctis_7.yaml. Based on reporter jsuvanto's
raw USB capture on #220 — SteelSeries' own spec only declares game/chat as
plain uint8 with no documented scale, so real hardware behaviour is the only
source here. - Sonar EQ live-apply no longer lies about success on restricted systems.
On SteamOS and other setups that start clients restricted (#181),pw-cli set-paramcan be refused by PipeWire with "Operation not permitted" the same
waypw-linkis. Unlike the link-permission fix, this call site had no
repair-and-retry, so the refusal was silently eaten and_ApplyWorker
reported the apply as successful anyway — the conf on disk was correct but the
running graph kept the old values, matching the "presets do nothing" symptom.
grant_props_permissions()is added, mirroringgrant_link_permissions()'s
already-confirmed repair (raise the owning client to rwxml, retry once), and
wired intoset_filter_controls._ApplyWorkernow only reports success when
the push genuinely cannot be attempted (node not up yet). - The udev dialog no longer writes rules into the container on distrobox
installs.udev_checkeralready learned to read the host's rules through
distrobox-host-exec, butwrite_udev_rulesandreload_udev_rulesstill
targeted the container's own/etc, where udev never looks — the dialog's
"Run" button reported success and changed nothing. Rules are now staged under
~/.cache(shared with the host via distrobox's bind mount) and installed
throughdistrobox-host-exec, trying sudo then pkexec.container.py
centralizesrunning_in_container()/host_exec()/host_distro()/
host_is_immutable(), replacing three drifted copies. On an immutable host
reached through a container the dialog now offers the matching
scripts/distrobox/*.shinstaller instead of fabricating an untested
rpm-ostree command. Reported on Bazzite alongside #140. - The "positional fallback" log line no longer drowns out real device
reports. It fired at INFO before the "does this link already exist" check,
so it went out on every watchdog pass whether or not anything was created — on
a Nova Pro that is every loopback, since the headset's sink names its ports
AUX0/AUX1. Three to four INFO lines every five seconds run about 270
characters each, filling the "Recent daemon logs" section of a bug report with
nothing but noise. It now logs INFO the first time for a given pair and DEBUG
after. - The update banner no longer loops when a distro repository lags behind
GitHub. COPR lagged a release by roughly seven hours in discussion #140: the
banner announced 1.4.12 while the user's dnf could still install only 1.4.11,
so "Update now" ran an upgrade that found nothing and the banner came back.
The same pattern would have hit APT and pacman installs. The user's own
repository is what the upgrade command runs through — it is the only answer
that is actionable — so it now decides first. GitHub is the fallback for pipx,
pip and AUR installs.
Added
- A probe for the Arctis 7 ChatMix dial in
scripts/reverse-engineering/,
with a README explaining how to capture and analyse the raw USB report. Used
to confirm the signed-attenuation decoding in #220.