arctis-sound-manager (1.6.6-1) noble; urgency=medium

  * Quitting ASM no longer crashes when PipeWire stops answering (#349). The
    tray's last default-sink switch could time out and the error killed it
    before it finished; a unit that ignored the stop was then sent a second
    polite signal instead of being killed. Both are handled now. Thanks
    @ziggityzack for the reproduction and the analysis.
  * ASM no longer re-sends the same move to an idle native app every 5
    seconds (#349). An app pinned to an output but not playing has no link,
    so ASM never saw it as already there and asked PipeWire again and again
    for the whole session. It now asks once per stream.
  * Arctis Pro (2019, wired) gets a profile of its own, audio only. It was
    handled as a wireless Arctis 7, whose commands it does not have, so its
    battery, ChatMix and headset settings never worked. Like the Arctis 5
    (2018), it now gets the audio features (channels, Sonar EQ, spatial
    audio) and no controls that would do nothing.
  * Nova 7 Gen 2 / 7P Gen 2: the start-up sequence no longer loses commands
    after saving. After a save to the headset's memory, its firmware ignores
    every command for 1.5 seconds, and ASM sent the next ones straight away.
    It now waits, as GG does.
  * Arctis Nova 5 / 5X: the on-device EQ is no longer stuck at -10 dB
    (#347). This headset encodes each band's gain its own way, 2 × (10 + dB)
    with 20 for 0 dB, and ASM sent the signed form the other headsets use.
    In Sonar mode, where ASM flattens the headset's EQ so only Sonar's curve
    applies, every band went to -10 dB; in Custom mode the curve came out
    shifted. Thanks @gouwschristo, whose read-back of the stored curve
    showed it.

 -- loteran <axel.valadon@gmail.com>  Wed, 28 Oct 2026 00:00:00 +0000

arctis-sound-manager (1.6.5-1) noble; urgency=medium

  * Arctis GameBuds: choose the audio source, the 2.4 GHz dongle or
    Bluetooth, the switch GG makes when its EQ panel changes tab. On
    Bluetooth, this computer's audio through the dongle no longer reaches
    the earbuds. Not yet tried on real GameBuds.
  * Arctis 7 / 7 2019 and Arctis 1 Wireless / 1X / 7X / 7P: microphone
    volume, as GG offers it (0-100). Not yet tried on hardware: if you own
    one, please tell us on #331 whether it works.
  * Arctis Nova Pro Wired: line out, stream mix and screen dimming. Line out
    to speakers or streaming, the main / aux / mic stream mix, and when the
    GameDAC's screen dims, as GG offers them. Not yet tried on a real one:
    if you own one, please tell us on #331 whether each control works.
  * Arctis Pro Wireless: the settings GG offers for it. Volume limiter, the
    muted microphone's LED, the screensaver and its delay, Bluetooth at
    power-up and game mute during a Bluetooth call, each with GG's own
    values. Not yet tried on a real one: if you own one, please tell us on
    #331 whether each control works.
  * Arctis Pro GameDAC: the settings GG offers for it. DAC gain, line out
    (speakers or streaming) with its four stream mix levels (game, chat,
    aux, mic), and the screen brightness, each with GG's own values. Not yet
    tried on a real GameDAC: if you own one, please tell us on #331 whether
    each control does what it says.
  * Arctis Pro GameDAC: sidetone has GG's four levels (off, low, medium,
    high) instead of a 0-10 slider whose upper levels the DAC has no use
    for.
  * Nova Elite and Nova Pro Omni: ASM reads the base station's settings
    before changing any (#331). Every start used to push ASM's defaults over
    what the base already had: sidetone, microphone volume, noise
    cancelling, auto-off, line out and stream mix, screen saver and home
    screen, Bluetooth preferences. A setting you never changed in ASM now
    keeps the value the base holds, set in GG on a dual-boot or on the base
    itself. Thanks @FrDrebin and @PointyKite, whose probes gave the layout.
  * The headset is found again after a resume, without restarting ASM
    (#325). On SteamOS the dongle came back after sleep (lsusb listed it)
    but ASM kept saying "no device detected" until its service was
    restarted: the USB library only updates its device list from hotplug
    events, and that one never reached the container. When the system lists
    the headset and ASM does not see it, ASM now opens the USB library
    afresh and looks again. Thanks @rasmus91 for the logs that pinned it
    down.
  * Nova Elite: the microphone and Bluetooth EQ presets now apply; Nova Pro
    Omni gets them too. ASM sent them with commands that do not exist on
    this family, so picking one changed nothing. They now go out as GG sends
    them, with GG's own preset curves (Bass Boost from GG's interface: its
    database holds a copy of Smiley under that name, and an Elite base reads
    back the interface's curve); the Omni also gets its Walkie Talkie
    microphone preset. The Elite's wireless mode and base volume controls
    are gone: the base has no command to change either, and GG does not
    offer them. Both are still shown.
  * Arctis 9 Wireless: battery, ChatMix and on/off are read again, and
    "Shutdown after" means minutes (#331). The headset's status reply does
    not start with the command that asked for it, so ASM never recognised
    it. And the shutdown delay went out as seconds: "90 minutes" switched
    the headset off after 90 seconds. Thanks @globeFrEak for the probe that
    showed both.
  * The sidebar fits short windows instead of overlapping. Its seven buttons
    and the logo need about 990px; in a shorter window the fixed-height
    buttons ran into each other and the ASM logo was cut off. The buttons
    and their icons now shrink with the window until the column fits, and
    stay full size when there is room.

 -- loteran <axel.valadon@gmail.com>  Tue, 27 Oct 2026 00:00:00 +0000

arctis-sound-manager (1.6.4-1) noble; urgency=medium

  * Nix: the package builds again on recent nixpkgs (#344). nixpkgs switched
    Python packages to structured attributes in October, which passed each
    grouped wrapper option as a single argument that makeWrapper rejected.
    Each argument now stands on its own. Contributed by @jgopel.
  * Apps go back to their channel when the dongle or headset comes back
    (#343). When the channels disappear (dongle unplugged, headset off),
    every app falls back to another output, and on reconnect only the apps
    you had pinned to a channel came back; a game left on Game stayed on the
    monitor speakers. ASM now remembers which channel each app was on and
    puts it back, without touching an app you have since moved to another
    ASM channel. Thanks @Fabi0699.
  * Nova Pro Omni: the base station's own screen flashed over ASM's custom
    display (#330). ASM drew all 64 rows, over the 12-row status strip at
    the top that the base keeps for itself; each time its charging indicator
    changed, the Omni redrew its whole screen for up to a second. ASM now
    draws 128x52 below that strip, as GG does on this family (the Nova Elite
    too). Thanks @FrDrebin for tracking it down to the charging battery.
  * Nova Pro Wireless: starting ASM no longer flattens the base station's
    Custom EQ. Every start sent a three-band EQ write left over from an old
    capture, which set bands 4 to 10 of the Custom slot to -10 dB, over any
    curve set there in GG or on the base station. It is gone; ASM writes all
    ten bands itself when the EQ mode is Custom.
  * First-run setup ran again at every login, restarting PipeWire (#340).
    The autostart entry's check for ~/.config/arctis_manager/.setup_done was
    written so that systemd's autostart generator passed $HOME to the shell
    with a backslash in front, so the shell looked for a file literally
    named $HOME/..., never found it, and ran asm-setup each time. Its
    PipeWire restart could leave the screen-sharing portal unable to start a
    share. The entry now passes desktop-file-validate and finds the marker.
    Thanks @J-Norberto for the thorough report.
  * Only one output of a multi-output USB card could be picked (#339).
    WirePlumber names every output of a USB card "USB Audio", so the device
    pickers (redirect on disconnect, Output channel) listed only the first
    one, and choosing it could send audio to an output nobody listens to
    (S/PDIF instead of the speakers). Outputs sharing a name are now listed
    separately; if you had picked such a card, pick the output again in
    Settings.
  * A preset that failed to apply could be remembered as the game's choice
    (#338). When a game's automatic preset did not go through, the preset
    still active looked like one picked by hand and was saved for that game,
    so it came back at every launch. A failed apply is no longer remembered.
  * Arctis Nova 5: ASM starts from what the headset already has. Mic volume,
    sidetone, volume limiter, the sleep timer and the muted-mic LED
    brightness are read from the headset before ASM sends anything, so a
    setting you never changed in ASM keeps its value (set in GG, for
    instance) instead of being reset to ASM's default. Confirmed on hardware
    with asm-cli tools probe (#331), thanks @Fabi0699.
  * Nova Elite and Nova Pro Omni: the Custom EQ uses GG's own band layout
    (#327). The lowest and highest sliders were peaks at 31 Hz and 16 kHz,
    which you can barely hear on music, so the Custom EQ seemed to do little
    or nothing on exactly those two. GG makes them a low shelf at 32 Hz and
    a high shelf at 16 kHz (read off the frames it sends an Omni), and ASM
    now does the same, with GG's 32/64 Hz and Q. Thanks @PointyKite and
    @ninjapinja2 for testing.
  * Nova Elite and Nova Pro Omni: the Custom EQ sliders go to ±12 dB, the
    range of their on-device equaliser and what GG uses, instead of ASM's
    ±10. Other headsets keep ±10, and a curve saved on one headset keeps the
    same decibels on another.
  * A notification tells you when a preset is remembered for a game (#338).
    Picking a preset by hand while a game runs saves it for that game; this
    used to happen silently, so the game then kept "its" preset with no
    visible reason. The tray menu → "Preset for <game>" → "Automatic" undoes
    it.
  * asm-cli tools probe reads EQ bands right. A band is 6 bytes in a
    headset's reply, but the probe counted the 11 of GG's internal form, so
    every field after the bands (mic volume, sidetone…) was read from the
    wrong place or left out on the Nova 5, Nova 3 Wireless, GameBuds, Nova
    Elite and Nova Pro Omni. Bands now print as frequency, filter, gain and
    Q (#331).
  * 3 new Sonar presets from SteelSeries GG 122: Ace Combat 8: Wings of
    Theve, Control Resonant and Silent Hill: Townfall.

 -- loteran <axel.valadon@gmail.com>  Fri, 23 Oct 2026 00:00:00 +0000

arctis-sound-manager (1.6.3-1) noble; urgency=medium

  * The headset's own settings are on the Headset page. Sidetone, mic
    volume, volume limiter, sleep timer, ANC and the rest of what your model
    supports moved out of Settings, where they sat among the app's options,
    onto the Headset page: one card per group, next to the live status,
    shown as tiles. Settings keeps ASM's own options, in cards too, and
    neither page scrolls sideways any more. The Sonar tabs are joined to the
    panel they control, and the Micro tab gets the input picker the other
    tabs already had. Contributed by @Denkiyaa (#333).
  * Arctis Nova Pro Wireless: ASM starts from what the base station already
    has. Line out, the stream mix, mic volume, sidetone, gain, Bluetooth,
    the mute-LED brightness, the sleep timer and the wireless mode are read
    from the base station before ASM sends anything, so a setting you never
    changed in ASM keeps the value it had (set in GG or on the DAC) instead
    of being reset to ASM's default. Also new: the base station's home
    screen view (detailed or simple). Confirmed on hardware with asm-cli
    tools probe.
  * Windows owners can record what SteelSeries GG sends to their headset
    (#337). scripts/reverse-engineering/capture-gg-windows.ps1 finds the
    SteelSeries device plugged in and walks through that model's own
    settings in GG, one at a time, while USBPcap records; the result shows
    ASM exactly what each setting expects on that model. See #337 for the
    steps.
  * asm-cli tools probe shows what the headset reported, field by field
    (volume, line out mode, battery levels…), instead of only saving raw
    bytes.
  * No Sonar audio on SteamOS, continued (#325). The WirePlumber SteamOS
    ships (0.5.14) keeps a list of the objects it hides, forgets to remove
    an object when it goes away, and hides every id on the list from each
    program that connects afterwards. PipeWire reuses the ids, so ASM's own
    Sonar nodes ended up hidden from every tool ASM starts, and no link
    could be made; restarting WirePlumber did not help, as the list fills up
    again. On WirePlumber older than 0.5.18 with such a rule, ASM's PipeWire
    tools now identify themselves the way WirePlumber's own do, which that
    script leaves alone. Nothing changes elsewhere. Thanks @rasmus91 for the
    logs.
  * The whole desktop session could crash about 15 minutes after login
    (#336). The DAC wheel watcher in the tray opened a new D-Bus connection
    every two seconds while the daemon was not answering, and never closed
    the failed ones, until the session bus ran out of file descriptors and
    took Plasma, the browser and Steam down with it. Every attempt now
    closes its connection. Found and fixed by @justfaked.
  * Clips failed on the first frame with no element "h264parse" (#334). The
    capture needs h264parse (GStreamer's "bad" plugins), which ASM neither
    checked for nor installed, so the dependency check said everything was
    there. It now checks for it and installs it, and the packages recommend
    it. Thanks @ninjapinja2 for the report.
  * Sidetone switched on by itself on the Nova Elite and Nova Pro Omni. Both
    profiles sent the sidetone at half level on every connect for a headset
    nobody had configured; the earcup one is the "my own voice in one ear"
    reports. It now defaults to off, like every other model. Contributed by
    @Denkiyaa (#332).
  * A setting read back from the headset could disagree with what the
    headset actually had. The reply was absorbed on its own schedule while
    the start-up commands went out, so a value ASM had never set could be
    pushed as its default to the headset just as the app adopted the
    headset's own value. ASM now waits for the replies (half a second at
    most) before sending anything.
  * The DAC screen showed a Sonar preset while the Custom EQ was playing
    (#330). In Custom EQ mode the curve plays on the headset itself and
    Sonar is out of the path, but the screen kept naming the channel's Sonar
    preset (and the Chat one). It now shows "EQ: Custom", the mode badge
    reads C, and the Chat preset line is hidden.
  * "Show city name" did nothing on the DAC screen for most cities (#330). A
    name too long to fit beside the temperature went on a line below it,
    outside the area actually drawn, so only very short names (Paris) ever
    appeared. The line is now part of the screen and scrolls into view like
    the rest.

 -- loteran <axel.valadon@gmail.com>  Sun, 18 Oct 2026 00:00:00 +0000

arctis-sound-manager (1.6.2-1) noble; urgency=medium

  * asm-cli tools probe. Asks the headset for its state with read-only
    queries — the ones SteelSeries' specification lists for that model,
    nothing that changes a setting — and saves the raw replies to
    ~/asm-probe.json. One file from an owner is enough to check how a model
    reports its settings, instead of one question per setting in an issue.
  * Custom EQ and the base station settings on the Arctis Nova Pro Omni. The
    Omni's base station runs the same firmware family as the Elite and takes
    the same commands, so it now gets what the Elite already had: the
    Equalizer page's *Switch to Custom EQ*, the on-ear microphone sidetone,
    the line out (speaker or stream, with the stream mix volumes), and the
    screen's screensaver, its timeout and the home screen view and options.
    Written from SteelSeries' specification and not yet confirmed on a real
    Omni — Omni owners, please try it and report on #330.
  * Arctis 7: sound cut out while the log filled with "USB error: Overflow"
    (#317). The dongle can get stuck sending status frames larger than its
    USB endpoint allows, on every read, for hours; the sound came back only
    once ASM was quit. ASM now resets the dongle once when this lasts a few
    seconds, the way it already recovers a headset whose commands all fail,
    and logs the error every hundred reads instead of twice a second. Thanks
    @kevinhu12345 for the logs.
  * Clips could not be installed in a distrobox (Bazzite, SteamOS,
    Silverblue) (#329). The install asked for permission through pkexec,
    which has no way to show a password prompt inside the container and
    refused at once with "Not authorized. This incident has been reported."
    Inside a container the Clips packages are now installed with the
    container's own sudo, as the other missing components already were.
    Thanks @ninjapinja2 for the report.
  * The automatic preset was not applied to some games while they were on
    the Game channel (#328). Some games — Black Myth: Wukong under Proton —
    open audio streams that carry no process id; only the audio client
    behind them has one. Without it ASM could not read the game's Steam id,
    knew the game only by its executable name, and found no preset for it,
    while the same game on another channel was recognised. The process id is
    now taken from the client when the stream has none. Thanks @TheV-git for
    the reports and the diagnostic.

 -- loteran <axel.valadon@gmail.com>  Wed, 14 Oct 2026 00:00:00 +0000

arctis-sound-manager (1.6.1-1) noble; urgency=medium

  * Custom EQ on the Arctis Nova Elite. The Elite's own equaliser, inside
    the headset, can now be driven from the Equalizer page (*Switch to
    Custom EQ*), like the other models with an on-device EQ; the curve stays
    on the headset. Written from SteelSeries' specification and not yet
    confirmed on a real Elite — Elite owners, please try it and report on
    #327.
  * No Sonar audio on SteamOS: the permission repair removed permissions
    instead of granting them (#325, #181). ASM passed the permission to
    pw-cli as letters (rwxml), which pw-cli reads as the number 0, so every
    attempt to unblock a refused link took the remaining access away and
    made the refusal worse. It now sends the numeric value and reads the
    permissions back to check they took effect. Thanks @rasmus91 and
    @baccatuesday for the logs.
  * GameBuds charging case not shown, "Access denied" in the log (#217). The
    1.6.0 package from the pacman repository shipped empty udev rules, and
    ASM's own check did not notice: it ignored the charging case's product
    ids and accepted any complete copy of the rules, even one hidden by an
    older copy in /etc. The package build now fails instead of shipping
    empty rules, and the check looks at the file udev actually reads, so ASM
    rewrites outdated rules by itself. Thanks @Sev501.
  * Pacman repository: signed with a dedicated key (#322). The binary
    repository is signed with its own pinned key, and the installer's key
    check and AUR fallback now work when run through curl | bash.
  * Clips record at the game's real frame rate. A 60 fps game came out at
    17–34 fps: the capture dropped frames that arrived early, ran on the
    wrong clock, and waited on Python for every frame. Clips now keep 54–58
    fps, record at 60 fps by default with a GPU encoder (30 on the CPU), and
    exports re-encode on the graphics card (NVENC) when it has one. The
    editor plays sound from the first playback, shows the clip's real rate
    as "original", and lays out size and frame-rate choices as buttons.
    Contributed by @Denkiyaa (#323).
  * Scrolling a page no longer changes a dropdown. Moving the mouse wheel
    over a picker while scrolling (for example a channel's output device)
    used to select the next entry. Contributed by @Denkiyaa (#323).

 -- loteran <axel.valadon@gmail.com>  Tue, 13 Oct 2026 00:00:00 +0000

arctis-sound-manager (1.6.0-1) noble; urgency=medium

  * Streamer mode. Like Sonar's Stream mode in GG: a second, independent mix
    of Game, Chat, Media, Aux and the processed Mic, each with its own
    volume and mute, delivered as a "<device> Stream Mix" source for OBS or
    any recorder. Turn it on with the Streamer mode switch next to the
    Channels menu and every card gets a compact Stream slider and mute
    button. The mix is taken before your headphone volumes and EQ/spatial
    audio, so viewers hear the clean game (7.1 is downmixed to stereo with
    the dialogue kept), and your headset mix and ChatMix are unaffected. Off
    by default; toggling it restarts the filter-chain once (short audio
    dropout, same as switching a preset), volume and mute changes are live.
  * GameBuds charging case. With the case plugged into the computer over
    USB, the Headset page shows its battery, charging state, lid
    (open/closed) and which earbuds are seated in it, like GG. The case is
    read next to the dongle, never instead of it: plugging or unplugging it
    leaves your audio alone.
  * Arctis Nova Pro Wired: fixes for the volume knob cutting the sound,
    maxing the volume, killing the mic or lagging (#321). Thanks @TheV-git
    for the detailed report. ASM was talking to the wired DAC in the Nova
    Pro Wireless base's language: it polled a settings frame and set a
    mic-mute LED level that the wired DAC does not have, which it refuses
    with a Pipe error in the log. Those two commands are gone (the mic-mute
    LED brightness slider with them), and the daemon now asks for the wheel
    position instead. The OLED is drawn the way SteelSeries' own app does it
    (below the DAC's status area, in the report size the spec gives) and
    handed back to the DAC when ASM stops. The daemon also reads the knob's
    reports as fast as they come instead of ten a second. These changes
    follow SteelSeries' specification but are not yet confirmed on this DAC:
    if the knob still misbehaves, please comment on #321.
  * No Sonar audio on SteamOS and other distrobox setups (#181). Inside the
    container, pw-link could not see the Arctis and Sonar EQ ports and
    failed with "No such file or directory" on every channel, so the EQ
    stayed silent even though the same link works from the host. ASM now
    retries such a link through distrobox-host-exec and remembers that it
    works. Nothing changes outside a container. Thanks @baccatuesday for the
    detailed logs.
  * "Operation not permitted" kept coming back after the permission repair
    on SteamOS (#181). After switching to Game Mode, the session sets
    permissions object by object, and the repair's blanket grant skips
    those. ASM now also grants its own clients access to the exact ports and
    nodes of the refused link. Thanks @rasmus91.
  * ASM would not open on Linux Mint 22 / Ubuntu 24.04 (X11). There PySide6
    comes from pip, which does not bring the libxcb-cursor0 library Qt needs
    to open a window on X11, so the app crashed silently at launch. The .deb
    now depends on it, and if it is ever missing asm-gui shows the exact
    install command instead of crashing.

 -- loteran <axel.valadon@gmail.com>  Sun, 11 Oct 2026 00:00:00 +0000

arctis-sound-manager (1.5.2-1) noble; urgency=medium

  * Automatic Sonar preset per game. Turn on "Automatic preset per game" on
    the Sonar page and ASM applies the matching Game channel preset as soon
    as a game starts (Steam, Lutris, Heroic or by executable name), like
    GG's QuickSet. A preset you pick by hand while the game runs is
    remembered for that game. The tray menu lets you force a preset for the
    running game or choose "Do not change". Off by default; switching preset
    restarts the filter-chain (short audio dropout, same as GG).
  * The OLED screen shows the EQ of what you are listening to. The EQ line
    used to always show the Game preset; it now follows the channel actually
    playing (Media, Chat, Output…) and is labelled with its name. A Discord
    call never takes it over from a running game.
  * Bug reports include the kernel's USB and sound messages, from the
    current and the previous boot, so a report made after rebooting still
    shows what went wrong. (#317)
  * Mic card showed the previously selected input. Picking a microphone
    switched the input but the card kept the old name until the next pick.
    (#318)

 -- loteran <axel.valadon@gmail.com>  Sun, 11 Oct 2026 00:00:00 +0000

arctis-sound-manager (1.5.1-1) noble; urgency=medium

  * Mic card on the Channels page. A new card on the far left sets the
    volume of what your apps record, picks which microphone feeds it (same
    choices as Settings) and shows which apps are recording. (#315)
  * See where each channel plays. Every channel card now shows the name of
    its output device under its buttons, without opening the picker. (#316)
  * Hide any card. The Channels menu now lists every card (Mic, Master,
    Game, Chat, Media, Aux, Output), so you can keep only the ones you use.
    Hiding a card only removes it from the page; the channel keeps working.
  * Profiles remember which cards are shown, and restore them when applied.
  * Mic colour in every theme, editable in the theme editor. Older custom
    themes use their Master colour for it.
  * Removed the "Enable Game/Chat Volume Sliders" switch and the "Bring
    audio to headset" button from the Channels page. Bringing audio back to
    the headset is still in the tray menu.
  * Cards fit a laptop screen with all seven shown, and long channel or
    device names end with "…" instead of being cut off.
  * Headset not detected after quitting ASM on SteamOS/Bazzite (Distrobox).
    Opening ASM again now restarts its background service. Diagnosed by
    @baccatuesday. (#181)
  * No sound with Spatial Audio on some SteamOS systems. ASM mistook
    harmless PipeWire messages for a refused permission and never connected
    the channels. (#181)
  * Theme editor showed "Aux channel" twice. The two colours are now
    labelled Media and Output.

 -- loteran <axel.valadon@gmail.com>  Sun, 11 Oct 2026 00:00:00 +0000

arctis-sound-manager (1.5.0-1) noble; urgency=medium

  * Real 7.1 for Game, Media and Aux. These channels now accept 5.1/7.1, so
    a game set to surround sends its real centre and rear channels instead
    of a stereo mix. Spatial Audio (HeSuVi) now places those real channels
    around you; a stereo app still plays exactly as before.
  * Surround passthrough to speakers. A channel sent to a 5.1/7.1 receiver
    or TV gets its channels as they are, with no headphone rendering. A 5.1
    receiver that only has side or rear surrounds gets the other pair folded
    in instead of losing it.
  * Clean stereo downmix. With Spatial Audio off on a stereo device,
    surround content is folded into stereo (centre and surrounds at -3 dB)
    instead of keeping only the front left/right, which used to drop a 7.1
    game's dialogue.
  * "Only for surround sources" option for Spatial Audio, per channel, off
    by default (same as Sonar). When on, virtual surround applies only while
    something plays 5.1/7.1; music, video and games in their own headphone
    mode stay plain stereo. It switches by itself, without cutting the
    sound.
  * Sonar mic presets set the mic processing too. Loading one now applies
    its ClearCast, noise reduction, noise gate and volume stabilizer
    settings, not just its EQ.
  * 4 new Sonar presets from SteelSeries GG 121: Aniimo, Bodycam, EA Sports
    FC 27, Wardogs.
  * ChatMix follows Sonar's curve. The quieter side now fades the way it
    does in SteelSeries GG: half way is about -9.5 dB, where ASM used to
    drop it to about -18 dB.
  * Smart Volume uses Sonar's loudness targets (Soft -27, Balanced -18,
    Extreme -9 dB).
  * EQ filters other than peak and shelf. Notch, all-pass and band-pass
    filters in Sonar presets were played as a plain peak and drawn flat on
    the curve; they now sound and show as they should. The DOOM: The Dark
    Ages preset is the one shipped preset that used one.
  * Arctis Pro GameDAC (gen 1) screen now draws images the way SteelSeries
    GG does; the previous layout was a guess and scrambled them.
  * Arctis Pro Wireless base screen (#305) is left alone until its layout is
    confirmed: 1.4.34 drew noise on it.
  * Ubuntu 24.04 / Linux Mint 22: package installable again, and the GUI no
    longer fails to open when installed from a graphical installer.
  * Clips (#307, #308, #313): recovers from a dead video stream instead of
    recording audio only; no longer mistakes a video player on the Game
    channel or the Steam client for a game. Thanks to @Denkiyaa.
  * NixOS build (#310): a file the build needs was missing. Fixed by
    @Kolaigg.
  * SteamOS/Bazzite diagnostic report (#181) ran only its first lines when
    launched with curl … | bash.
  * Preset file names are ASCII-only (#132): one new preset's name would
    have broken the AUR build.
  * The bundled HRIR profiles are now credited to HeSuVi (MIT License) in
    the README, debian/copyright and a license file next to them.

 -- loteran <axel.valadon@gmail.com>  Thu, 08 Oct 2026 00:00:00 +0000

arctis-sound-manager (1.4.34-1) noble; urgency=medium

  * DAC Wheel Overlay. Turning the volume wheel on the base station /
    GameDAC floats a "DAC wheel" bar at the bottom of the screen, in the
    same place as the ChatMix bar (now called Chat/Mix Overlay). Can be
    turned off in the settings.
  * Arctis Pro Wireless: spare battery and base station screen. The spare
    battery charging in the base is shown on the Channels page, and the
    base's OLED can be used from the DAC page.
  * Arctis Pro Wireless battery stuck at 50% (#305). ASM read the radio link
    state instead of the battery; it now reads the real battery level.
  * asm-gui crashing on startup on Debian/Ubuntu (#306). The ChatMix overlay
    needed PySide6's QtDBus module, which those distributions ship as a
    separate package. It is now a declared dependency, and a missing module
    only disables the GNOME overlay instead of the whole GUI.
  * Apps losing sound after changing an EQ preset (#304). Changing a Game or
    Media EQ preset recreates the channel, and apps moved onto it dropped
    out until moved again by hand. They are now moved back automatically.

 -- loteran <axel.valadon@gmail.com>  Sun, 04 Oct 2026 00:00:00 +0000

arctis-sound-manager (1.4.33-1) noble; urgency=medium

  * Headset disconnecting every couple of minutes (#299). When a headset
    stopped answering commands, ASM reset its USB connection after every
    failed initialisation, so it kept dropping and reconnecting,
    interrupting audio. ASM now tries the reset only once; if that does not
    help, it leaves the device connected and logs that it needs a replug or
    power cycle.

 -- loteran <axel.valadon@gmail.com>  Thu, 01 Oct 2026 00:00:00 +0000

arctis-sound-manager (1.4.32-1) noble; urgency=medium

  * ChatMix on-screen display. Turning the ChatMix dial (or the mixer page's
    bar) floats the ChatMix bar at the bottom of the screen for 1.5 s, above
    the taskbar and over fullscreen games. Works on KDE and wlroots Wayland
    (layer-shell), X11, and GNOME Wayland (through a small bundled GNOME
    Shell extension). On by default, can be turned off in the settings.
  * Plasma 6 widget. Shows the headset power state and battery, the base
    station's spare battery, noise cancelling and microphone state, and
    opens asm-gui. It is fed by a new StatusChanged D-Bus signal emitted by
    the daemon, so it no longer needs to poll. Its strings are translated
    through Crowdin.
  * OLED: now-playing line. The base station / GameDAC custom display can
    show "Artist - Title" of the playing MPRIS player, with a marquee.
  * OLED: screen off while you are away. The panel goes dark when the
    session is locked, idle or the screensaver is active, and lights back up
    when you return (helps against burn-in).
  * OLED: wakes up when you turn the wheel. Turning the volume or ChatMix
    wheel lights a dark panel back up.
  * OLED: spec alignment and new screens. Nova Elite and Nova Pro Omni now
    follow the SteelSeries spec (1036-byte frames, brightness 1-10). Arctis
    Pro GameDAC (gen 1) gets its OLED. Arctis Pro Wireless gets a screen
    brightness setting for the base station.
  * ChatMix now acts on the channels' loopback streams instead of the
    channel sinks. This stops Plasma from showing its own volume OSD at
    every turn of the dial and keeps the channel volumes separate from the
    mix.
  * SteamOS and Distrobox (#181):
  * SteamOS ALSA loopback streams were taken for applications and pinned to
    Arctis_Media, creating a routing cycle that silenced the headset.
  * A headset plugged in after ASM started was never detected in a rootless
    container (the udev monitor never received events). ASM now polls in
    that case.
  * EQ presets all sounded the same: refused live updates were not detected.
    ASM now reloads the filter chain instead.
  * The dependency dialog now works inside a SteamOS container (host pkexec
    lookup, host LADSPA paths written into the filter-chain config,
    container-side installs, "Copy cmd" on immutable hosts).
  * SteamOS systemd 258+ uaccess ACLs: ASM now ships the
    70-steelseries-arctis-uaccess companion udev rules file. (#297)
  * The dependency dialog detects and can self-heal the GNOME ChatMix OSD
    tools (gsettings, gnome-extensions). (#297)
  * Native streams without an application name (Stardew Valley through
    SMAPI) are now moved by object.serial, so they go to the right channel.
    (#291)
  * Missing English strings for device settings and status values (mostly
    Nova Elite, also Nova 3 Wireless, GameBuds and Pro Wireless). Nova Elite
    value labels with spaces were renamed, they used to break neighbouring
    translations.

 -- loteran <axel.valadon@gmail.com>  Thu, 01 Oct 2026 00:00:00 +0000

arctis-sound-manager (1.4.31-1) noble; urgency=medium

  * asm-cli status shows the headset state: battery, power, mic and
  * Drag an application onto a channel card to move it, from its icon on
  * New documentation pages: SteelSeries headsets on Linux, one page per
  * The Settings page was blank in generic device mode, including the
  * Games that only name their audio stream by node (Stardew Valley launched

 -- loteran <axel.valadon@gmail.com>  Tue, 29 Sep 2026 00:00:00 +0000

arctis-sound-manager (1.4.30-1) noble; urgency=medium

  * Applications are shown as icons under each channel slider, centred
  * A redesigned, fully themed mixer. Sliders and the ChatMix bar use
  * The EQ preset and output device pickers on each channel card open a
  * Native Linux Steam games (Team Fortress 2, for example) landed on Media
  * After an upgrade, a crash of the previous version was reported again

 -- loteran <axel.valadon@gmail.com>  Sun, 27 Sep 2026 00:00:00 +0000

arctis-sound-manager (1.4.29-1) noble; urgency=medium

  * An EQ preset picker on each Channels card. Game, Chat, Media, Aux
  * A read-only "DAC wheel" gauge on the Master card, next to its
  * Four new Sonar game presets from SteelSeries GG 120.0.0.
  * Nova Pro Wireless volume had to be turned up about twice as far as
  * With Arctis GameBuds X plugged in next to another headset, the Game card
  * The tray crashed when the package upgrade asked it to restart
  * A tray whose window was never opened did not notice an upgrade and kept

 -- loteran <axel.valadon@gmail.com>  Sun, 27 Sep 2026 00:00:00 +0000

arctis-sound-manager (1.4.28-1) noble; urgency=medium

  * A software ChatMix bar on the Channels page. It balances Chat
  * A Master card for the headset's own physical output. The hardware
  * "Redirect audio on connect" can now send the system default to Game or
  * The Arctis 7 (2019) dongle dropped off the USB bus about once a minute
  * A headset that answers no command at all (every write timing out) is
  * The GUI crashed at startup on Ubuntu when pacman was installed but
  * Streams moved to Aux played into a dead end until the output device
  * ASM no longer forces a card profile back when the headset's analog
  * The redirect-on-connect channel setting showed its raw key instead of

 -- loteran <axel.valadon@gmail.com>  Thu, 24 Sep 2026 00:00:00 +0000

arctis-sound-manager (1.4.27-1) noble; urgency=medium

  * **The Equalizer tab now has its own output-device picker for Game, Chat,
  * The Channels page's Aux add/remove button is now a "Channels ▾" menu
    with
  * Support for the SteelSeries Arctis 5 (2018). This headset has no
  * The ChatMix "Include in ChatMix" checkbox row on Media/Aux pushed
  * The station volume dial (Nova Pro's DAC master wheel) was read from HID
  * Releases were silently failing to reach the PPA since v1.4.25. The CI

 -- loteran <axel.valadon@gmail.com>  Mon, 21 Sep 2026 00:00:00 +0000

arctis-sound-manager (1.4.26-1) noble; urgency=medium

  * The daemon froze on wake from suspend (1.4.25 regression, #238). Two
  * Chat channel routed to an external output device now stays stereo
    instead of collapsing to mono/left-only, since ASM now owns its link
    (PipeWire no longer force-negotiates the chat EQ output to the headset's
    native mono PCM format). (#242)
  * Turning the Aux channel off (or back on) never actually told the daemon.
  * **ASM's own internal PipeWire nodes (the filter-chain/loopback plumbing
  * The system tray's Output Routing menu never listed the Aux channel at
    all, even when it was switched on — the per-channel device picker there
    was hardcoded to Game/Chat/Media. Aux now appears whenever the channel
    is enabled.
  * **The Output channel could briefly play through the headset at startup
  * **The headset's physical ChatMix knob has always crossfaded exactly two

 -- loteran <axel.valadon@gmail.com>  Mon, 14 Sep 2026 00:00:00 +0000

arctis-sound-manager (1.4.25-1) noble; urgency=medium

  * **Nova Pro Omni: the ChatMix knob did nothing after boot until the
    daemon
  * A failed init frame was never retried. send_command() logs USB errors
  * **ChatMix on the Nova Pro Omni also stayed dead specifically after a
    system
  * ASM never told the DAC it was leaving. SteelSeries' own engine sends
  * **After the *wireless* headset itself reconnects (powers back on, or
    comes
  * DeepFilterNet noise cancellation silently stopped the microphone.
  * **A native (non-PulseAudio) application stream with no application.name
  * **The external Output channel could get silently and permanently stuck
  * **GameBuds: the Volume Limiter and Wear Sense toggles were silently
  * Bug reports no longer leak the weather widget's raw GPS coordinates
  * **GameBuds: ANC intensity, and independent playback volume per
    connection
  * 4 new Sonar presets from SteelSeries GG 119.0.0: Bombanana!, Mortal
    Shell

 -- loteran <axel.valadon@gmail.com>  Sun, 13 Sep 2026 00:00:00 +0000

arctis-sound-manager (1.4.24-1) noble; urgency=medium

  * Volume Boost had no audible effect with Spatial Audio on. The HeSuVi
  * **A system sound-settings UI (GNOME Settings, Cinnamon's sound applet,

 -- loteran <axel.valadon@gmail.com>  Tue, 08 Sep 2026 00:00:00 +0000

arctis-sound-manager (1.4.23-1) noble; urgency=medium

  * The auto power-off feature added in 1.4.22 (#180) is now reachable from
    the

 -- loteran <axel.valadon@gmail.com>  Sun, 06 Sep 2026 00:00:00 +0000

arctis-sound-manager (1.4.22-1) noble; urgency=medium

  * **filter-chain.service restart storm could segfault PipeWire's convolver
  * Raised api.alsa.period-size to 128 in the physical-sink no-suspend
  * **The headset's hardware auto-off timer works again (#180), without

 -- loteran <axel.valadon@gmail.com>  Sun, 06 Sep 2026 00:00:00 +0000

arctis-sound-manager (1.4.21-1) noble; urgency=medium

  * **Reverted node.passive everywhere: it kept causing the very channel it

 -- loteran <axel.valadon@gmail.com>  Sat, 05 Sep 2026 00:00:00 +0000

arctis-sound-manager (1.4.20-1) noble; urgency=medium

  * **Reverted the #223 and #230 fixes from 1.4.19: they made filter-chain

 -- loteran <axel.valadon@gmail.com>  Sat, 05 Sep 2026 00:00:00 +0000

arctis-sound-manager (1.4.19-1) noble; urgency=medium

  * Switching output device could crash the filter-chain (SIGSEGV). The
  * **A channel could go silent until something else in the chain was
  * **Clips dependencies were flagged missing on Fedora/Nobara even when a
  * The new-preset announcement stays a dialog by default, with a
  * The AUR package could sit releases behind GitHub with nothing retrying.
  * **Bazzite/immutable-host container setup could leave pkexec and the
  * A sixth diagnostic check in diagnose-sonar-eq.py, walking the chain

 -- loteran <axel.valadon@gmail.com>  Fri, 04 Sep 2026 00:00:00 +0000

arctis-sound-manager (1.4.18-1) noble; urgency=medium

  * Copy cmd / Copy command buttons ne copient pas sous Wayland
    (Bazzite/KDE).

 -- loteran <axel.valadon@gmail.com>  Wed, 02 Sep 2026 00:00:00 +0000

arctis-sound-manager (1.4.17-1) noble; urgency=medium

  * In-app update check lagged AUR helpers on Arch. The checker trusted
  * In-app update check lagged AUR helpers on Arch. The checker trusted

 -- loteran <axel.valadon@gmail.com>  Wed, 02 Sep 2026 00:00:00 +0000

arctis-sound-manager (1.4.16-1) noble; urgency=medium

  * Audio cuts out after a few seconds of silence on Game, Chat, and Aux.

 -- loteran <axel.valadon@gmail.com>  Wed, 02 Sep 2026 00:00:00 +0000

arctis-sound-manager (1.4.15-1) noble; urgency=medium

  * Steam Game Recording captured no game audio (issue #225). The router
  * Applications changed channel on their own after any EQ or profile
    change.
  * The Linux test matrix never reached the install step. Every job on every
  * A preset was missing for anyone installing from a release tarball. The
  * The bug report now lists playback and capture streams and where each one

 -- loteran <axel.valadon@gmail.com>  Wed, 02 Sep 2026 00:00:00 +0000

arctis-sound-manager (1.4.14-1) noble; urgency=medium

  * Audible pop/click on track change with Spatial Audio on Media. The
  * deps-checker false failures in containers. The HOST/CONTAINER scope
  * 3 new Sonar presets from SteelSeries GG 118.0.0.
  * Automated preset delivery via GitHub Actions. A weekly workflow (Mondays

 -- loteran <axel.valadon@gmail.com>  Wed, 02 Sep 2026 00:00:00 +0000

arctis-sound-manager (1.4.13-1) noble; urgency=medium

  * A headset that powers off and on gets its settings back. Sidetone, mic
  * **The Arctis 7 ChatMix dial no longer freezes at the position it had
    when the
  * The Arctis 7 2019 ChatMix dial reported the wrong volume.
  * Sonar EQ live-apply no longer lies about success on restricted systems.
  * **The udev dialog no longer writes rules into the container on distrobox
  * **The "positional fallback" log line no longer drowns out real device
  * **The update banner no longer loops when a distro repository lags behind
  * A probe for the Arctis 7 ChatMix dial in scripts/reverse-engineering/,

 -- loteran <axel.valadon@gmail.com>  Sun, 30 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.4.12-1) noble; urgency=medium

  * The first launch no longer looks like a freeze. Two people described the
    same first contact with ASM, five weeks apart and on different
    distributions: the window comes up and nothing responds. Nothing had
    crashed — a dialog was waiting for them behind the main window. Every
    startup dialog is created without a parent, because the main window may
    not exist yet when the first one is due, and an unparented dialog is
    exactly what focus-stealing prevention pushes to the back. They were
    also scheduled to collide: a modal runs its own event loop, so the
    remaining timers keep firing while one is open, and two of them were due
    at the same moment. They now open one at a time, in the order they come
    due, and each asks for the foreground. (#17)
  * "Copy cmd" copies. In the system dependencies window it appeared to do
    nothing at all. Under Wayland the clipboard belongs to the focused
    window, and a compositor silently drops the request from a window that
    does not have keyboard focus — which this one did not, being one of the
    dialogs opening behind the main window. It now takes the foreground
    first, and says "Copied!" on the button, because there was no way to
    tell a copy that worked from one that was refused.
  * On a container install, the udev rules are looked for on the host. A
    distrobox container has its own /etc, and udev only ever reads the
    host's. The install scripts put the rules there, from the host, which is
    correct — but ASM looked inside the container, found nothing, and
    reported them missing on an install that was fine. Its offer to fix that
    would have written them where nothing reads them. Reported on Bazzite,
    alongside a pkexec that is missing for the same reason: installing
    polkit in the container would not help, since it cannot elevate on the
    host, so ASM now says to run those lines from a host terminal instead.
  * An Arctis Nova Pro Omni whose mode switch is in the wrong position is
    named as such. The DAC has a physical USB-1 / USB-2 / XBOX switch and
    enumerates as a different device on each. Only the USB-1 position speaks
    the SteelSeries protocol; on the other two there is nothing to drive,
    which is why only that one is declared. ASM saw a product id no profile
    claimed and asked its owner to open an issue for an unsupported headset
    — hardware it knows exactly, in a state it documents. The other two
    positions are now declared as what they are, so the daemon names the
    device and the switch position, and says there is nothing to report.
    (#218)
  * The bug report no longer claims the udev rules are missing when they are
    not. Failing to read a device's name only proves ASM cannot open it, and
    a product id that no rule matches lands there with a perfectly valid
    rules file installed — so the device list said "udev rules missing — run
    asm-setup" on the same page that reported the rules as valid. It now
    points at the section that answers the question per device. (#218)

 -- loteran <axel.valadon@gmail.com>  Sun, 30 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.4.11-1) noble; urgency=medium

  * Headsets that 1.4.10 stopped detecting are detected again. 1.4.10 added
    a step that works out a headset's control interface from the HID usage
    page it declares, and it was too eager in three ways, each enough on its
    own: it moved a device on a single vendor page seen anywhere, it read an
    unreadable descriptor as "not the control channel" rather than "no
    idea", and — the one that did the damage — it moved the address commands
    were written to without also claiming that interface, so every command
    hit an interface the kernel still held and failed silently, once every
    ten log lines. An Arctis 7+ lost its battery, its status and its
    automatic output switching; a set of GameBuds lost battery and online
    status. A device is now moved only on proof, read from the hardware's
    own report descriptor, that the interface its profile names cannot be
    the control channel — and the interface it moves to is always the
    interface it claims. A missing or wrong usage page can no longer
    misroute a headset that works. (#216, #217)
  * The usage pages themselves, which were read from the wrong field of the
    specification. SteelSeries write two different declarations —
    (usage-page …) for the interface commands go to, (sync-interface …) for
    the interface a device pushes events on — and 1.4.10 took the second and
    wrote it in as the first. Thirteen profiles ended up carrying the same
    wrong value. The field is removed everywhere sync-interface was its only
    source, and kept only where the command interface's page is
    independently attested: the Arctis 7+, the GameBuds and the Nova 7P.
    (#216, #217)
  * Bug reports and the USB diagnostic now say which interface is the
    control channel, and where audio is going. Each HID interface lists its
    class and the usage page it declares — the one thing no report could
    show before, and the whole question #216 and #217 turned on — and the
    diagnostic records the default sink and the sink every playback stream
    sits on, so "ASM is holding my audio" and "the default was left
    somewhere dead" can be told apart.

 -- loteran <axel.valadon@gmail.com>  Wed, 26 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.4.10-1) noble; urgency=medium

  * Clips records where the desktop has no ScreenCast portal. It built one
    pipeline whose source was a portal session, so XFCE, MATE, Cinnamon and
    plain window managers — anything using xdg-desktop-portal-gtk, which
    does not implement that interface — could not record at all. X11 is now
    captured directly there, with the same encoder, the same frame rate and
    the same per-channel audio tracks. Nothing to configure: the portal is
    asked whether it exists rather than inferred from the session type,
    because X11 under GNOME or KDE has a working one and must keep using it.
    (#214)
  * Bug reports say how Clips can capture this screen — the desktop, which
    portal backends are installed, whether ScreenCast answers, and which
    GStreamer elements and encoders exist. Only when Clips is switched on.
    There is also scripts/diagnose-clips-capture.py for anyone who cannot
    open the window to produce a report in the first place. (#215)
  * A headset's control interface is found from what it declares, not from a
    number written by hand. SteelSeries' own device specifications address
    it the way Windows does — by HID usage page — and never carry the
    interface number Linux needs, so every profile's was transcribed, and
    several were wrong. The number is now read back from the device's report
    descriptor. A profile that already names the right interface is
    untouched, so nothing that works today changes. (#213)
  * The Arctis Pro GameDAC has its own profile. It shared one with the
    Arctis 7 dongle and inherited all of it: an interface that does not
    exist on this device, so every command failed twice a second and its
    status came back empty; a battery request, which a mains-powered DAC has
    none of; ChatMix on the wrong command; and the wrong sidetone opcode.
    Read from SteelSeries' specification for this product rather than
    carried over by name. (#213)
  * The ChatMix dial no longer skips whole ranges. The read loop waited on
    every interface at once, so the slowest set the pace for all of them:
    the dial pushes its frames on one while another blocks for a full second
    on a polled status frame. Reported on a Nova 7 Gen 2, where the wheel
    jumped from 100 to 53 rather than moving through the values. (#211)
  * The Nova 5's dial interface, lost when its profile was copied. Upstream
    lists two interfaces for it and ASM's profile has carried one since the
    day it was written, so the wheel worked only when the runtime detection
    happened to catch a frame, and stopped whenever that cache was cleared.
  * An application listed once per tick. Two sources feed the row of
    applications under each channel and they were drawn in sequence, the
    first clearing the card and the second appending to it. Once the first
    learned to skip the rebuild when nothing had changed, the second kept
    appending to a card nobody had cleared — a game running under Proton
    gained a copy of itself twice a second, and closing it left them behind.

 -- loteran <axel.valadon@gmail.com>  Tue, 25 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.4.9-1) noble; urgency=medium

  * An Aux channel, off unless you ask for it. A fourth playback channel
    with its own output device, its own equaliser and the whole Sonar preset
    catalogue — for anyone using Media for video who wants music somewhere
    else. Add it from the profile bar, beside "Save current settings"; press
    it again to put it away. It is a twin of Media rather than a
    stripped-down extra: its own spatial stage, so its immersion settings
    never bleed into another channel, its own routing button beside every
    running application, and its own entry in Stream Guard. The channel
    cards narrow when it is on, because five cards at the old width needed a
    window wider than a 1366 px laptop screen. (#209)
  * Choosing which headset ASM drives, from the Headset tab. The preference
    existed only in Settings, but the tab showing the device is where you
    are looking when you notice the wrong one is being driven. Both pickers
    are one setting: change it in either and the other follows. It appears
    once a second Arctis is detected, which is exactly when there is a
    choice to make. (#199)
  * The Aux channel's colour is themeable, and shared themes made before it
    existed still import. The share format now fills in colours added after
    a link was made, rather than refusing it — a link missing one of the
    original colours is still rejected, since that means truncated rather
    than older.
  * The virtual channels are called Sonar on generic hardware. Running ASM
    on a device it cannot talk to put "Generic audio device Game" in every
    application's output picker. Naming a channel after the headset is right
    when there is one — it says which headset the channel belongs to — so a
    profile can now name its channels separately, and only the generic one
    does. (#208)
  * Updating no longer leaves the headset unrecognised. The install scripts
    re-emitted an "add" event for every USB device on the machine, while the
    daemon still held the headset's interface with the kernel driver
    detached. The running daemon lost its device mid-upgrade, the kernel's
    own HID driver took the interface back, and the headset read as absent
    until it was physically unplugged and replugged — after every single
    update. Scoped to SteelSeries devices now, which is what that step was
    ever for.
  * An application listed once per tick. Two sources feed the row of
    applications under each channel, and they were drawn in sequence: the
    first cleared the card, the second appended to it. Once the first
    learned to skip the rebuild when nothing had changed — which is what
    made dragging an application stutter — the second kept appending to a
    card nobody had cleared. A game running under Proton piled up a copy of
    itself twice a second, and closing it left them behind.
  * A Qt version mismatch no longer tells you to install Qt. Carried over
    from 1.4.8 for anyone who missed it: PySide6 binds Qt's private ABI, so
    the two must be the same version, not merely both installed.

 -- loteran <axel.valadon@gmail.com>  Tue, 25 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.4.8-1) noble; urgency=medium

  * Seven Sonar presets from GG 117.0.0. Assassin's Creed Black Flag
    Resynced, Backrooms: Escape Together, Digimon Story Time Stranger, Halo:
    Campaign Evolved, Heave Ho 2, Moonlight Peaks and The Binding of Isaac:
    Rebirth. They are taken from SteelSeries' own catalogue, in the same
    shape ASM already stores, and they reach you without waiting for a
    release — the app checks for new ones at every launch.
  * ASM tells you when presets arrive. New presets used to appear silently,
    which left people wondering whether the list had grown or they had
    misremembered it. A dialog at launch now names what was added and which
    SteelSeries GG release it came from. It only appears when something
    actually arrived.
  * Presets say where they come from, in colour. Anything that was not
    shipped inside the package landed in one folder, and the Sonar page
    treats that folder as your own work: sorted first, tinted, with a rename
    and a delete offered. So a SteelSeries preset pulled from the catalogue
    looked hand-made, and offered to delete a file that comes straight back
    on the next check — while presets imported from the community site were
    indistinguishable from either. There are three origins now: SteelSeries'
    keep the default text colour, yours stay in the accent colour, and
    community imports wear the teal of the site they were shared on. Presets
    already downloaded are moved into place on the next check, and one you
    made yourself cannot be caught by that — the name would have to match a
    published preset exactly.
  * A preset of yours is never shadowed by a downloaded one. If you have a
    preset under a name that later gets published, yours is the one that
    loads: a sync adds choices, it does not overwrite them. Rename and
    delete now also cover community imports, since those are files you chose
    to have; they stay off SteelSeries' presets, which return on the next
    check.

 -- loteran <axel.valadon@gmail.com>  Mon, 24 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.4.7-1) noble; urgency=medium

  * Opening ASM no longer starts recording. Clip autostart shipped switched
    on, so a session opened while a game was already running found the
    screen being captured before anyone had asked for it. Following the game
    is still there for whoever wants the buffer armed without thinking about
    it — it is one checkbox on the Clips page, and anyone who ticked it
    keeps their setting. Only the default changed.
  * The microphone links to its EQ even when PipeWire is slow to enumerate
    it. The device's capture node was looked up once, at connect time,
    within a fixed four-second budget — and right after connecting, ASM
    detaches and reattaches the USB kernel driver twice to push the
    on-device equaliser, which is exactly the churn that can delay that
    node. When the window was missed the empty result was kept for the whole
    session: the capture link was never even attempted, while the watchdog
    retried it forever and escalated to a filter-chain repair that could not
    help, because the filter chain was never the problem. The node is now
    looked for again while it is missing, which costs nothing once it is
    known. (#206)
  * ASM stops overwriting its own service file with an outdated copy. A unit
    in your home directory replaces the packaged one rather than extending
    it, and the copy ASM rewrote at every session start had drifted: it no
    longer waited for the filter chain. That let the daemon start before the
    node the microphone has to link into even existed, making the failure
    above more likely. Where your distribution ships the unit, none is
    written now; a copy ASM recognises as its own is cleared away, and one
    you edited yourself is left alone with a warning. (#206)
  * A channel whose meters move while the headset stays silent. A filter
    declared in both pipewire.conf.d/ and filter-chain.conf.d/ is loaded
    twice — once by the PipeWire daemon and once by the filter-chain service
    — so two nodes answer to one name and every route ASM sets by name
    becomes ambiguous. The cleanup for this has existed since April as a
    hand-written list of four filenames; the Output EQ and the Media
    surround stage were added to the generator later and never added to that
    list, so those two survived every startup. It is derived from what is
    actually generated now, so the next config added cannot be forgotten.
    (#205)
  * Bug reports show duplicate node names and PipeWire drop-ins. The report
    that led to the fix above gave no way to see the duplication at all. The
    graph section now leads with any routing target owned by more than one
    node, listing each id so the owning clients can be told apart. (#205)
  * The wired GameDAC's screen halves no longer scroll a quarter-second
    apart. That DAC carries out screen writes without ever acknowledging
    them, so each half of a 128 px panel spent the full timeout waiting for
    an answer that was not coming — invisible on a static screen, plainly
    visible on anything that scrolls. The timeout is now learned from the
    device rather than guessed: once a whole frame has gone unanswered, it
    drops to a value still several times what a working panel needs to
    reply. (#196)
  * A Qt version mismatch no longer tells you to install Qt. Every PySide6
    import error printed the same advice — install qt6-wayland, qt6-base —
    which is right when Qt is missing and actively misleading when it is
    present but built against another version. PySide6 binds Qt's private
    ABI, so the two must be the *same* version, not merely both installed.
    Someone followed that advice, installed a package that was already
    there, saw no change, and concluded the app did not work.

 -- loteran <axel.valadon@gmail.com>  Sun, 23 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.4.6-1) noble; urgency=medium

  * The Arctis GameBuds report battery and connection state. The profile
    said no status request was known for the family, so the tray never
    showed a percentage and every status row stayed blank. That was out of
    date rather than true: SteelSeries' own device specification describes
    the frame in full, for the GameBuds and the Xbox variant alike. Each
    earbud reports its own 0-100 level; the tray shows the lower of the two,
    since the bud that dies first is the one that ends the session, and you
    count as connected when either bud is — which is what the vendor's own
    firmware does, so wearing a single bud no longer reads as offline. The
    charging case keeps its percentage to itself: it answers on its own USB
    product rather than through the dongle. (#202)
  * Two diagnostics for problems that need someone else's hardware.
    scripts/diagnose-sonar-eq.py answers "where does the EQ chain break?" in
    five read-only checks ordered so the first failure is the answer — safe
    mode, the filter-chain unit's LADSPA path, a plugin that fails to load,
    an EQ node missing or unlinked, a config carrying no filters at all.
    scripts/reverse-engineering/gamebuds_battery_probe.py finds out whether
    a headset reports a battery at all, by listening while you put a bud in
    its case rather than by asking you to capture USB traffic on Windows.
    (#181)
  * A clips folder on a disconnected drive no longer stops the window
    opening. With clips on removable media, pulling the drive leaves the
    mount point behind: it still looks like it exists and answers an I/O
    error on the first read. That error escaped out of the Clips page while
    the main window was being built, so the whole window failed — no mixer,
    no Sonar, no settings, because a disk was not there. The folder is now
    read defensively, entry by entry, since on failing media some reads
    succeed and others do not. (#204)
  * Clip capture stops relaunching itself when it cannot start. The same
    missing drive made every automatic start fail, and nothing remembered
    that: with a game running, ASM asked the desktop portal for a new screen
    capture every five seconds, for as long as the game lasted. A failed
    automatic start is now left alone until something changes — a different
    game, or you pressing the button yourself — and the reason is written to
    the log instead of being repeated in silence. (#204)
  * A microphone chain referencing a plugin by name is repaired again. The
    check that spots it required the plugin and the node type to sit on the
    same line, and the noise-reduction nodes are written across two — so a
    config that could not load was never regenerated, which is the failure
    that check exists to prevent, left open for the one channel formatted
    differently.
  * Two tests that only passed on the author's machine. One needed a Python
    new enough for tomllib, the other needed LADSPA plugins to be installed;
    both went green locally and red everywhere else, which proves nothing
    about anybody's machine.

 -- loteran <axel.valadon@gmail.com>  Sun, 23 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.4.5-1) noble; urgency=medium

  * Choose which Arctis ASM drives when several are plugged in. Keeping a
    GameBuds dongle in a port next to a Nova Pro Wireless base station meant
    ASM picked whichever one happened to be enumerated first — invisible,
    unchangeable, and only avoidable by unplugging the other. Settings now
    lists the Arctis units actually detected and remembers the one to drive.
    The choice applies immediately, and an unplugged preferred unit falls
    back to the other headset rather than to nothing. (#199)
  * The Nova Elite answers its own status request. The profile mapped only
    the individual asynchronous pushes, so every status row stayed blank
    from startup until each control had reported once. The combined reply
    its own vendor specification defines is now decoded.
  * A bug report says which kernel driver holds the USB interface. libusb
    only answers yes or no, so a refused claim never said who was in the
    way. It matters more from Linux 7.3 on, where an in-kernel
    hid-steelseries driver will bind to the same interface on 25+ models.
  * The .deb on the releases page could not start. It shipped without
    Pillow, so the daemon died on a bare ModuleNotFoundError at first launch
    — and the dependency checker written to catch exactly that never ran,
    because the failing import comes first. Debian is built two ways and the
    two dependency lists had drifted; they are now derived from one source,
    and the pre-release check reads both. The same list also lacked Babel,
    which silently gave wrong plural forms in every non-English locale.
  * Sound on SteamOS through Distrobox. Three separate faults, all reported
    with measurements: the filter-chain unit never told PipeWire where ASM
    stages its LADSPA plugins, so the surround stage failed to load and
    audio stopped half a second in; ASM overwrote the host's own service
    file with a path that exists only inside the container, so every reboot
    left the daemon dead; and a channel whose link PipeWire refuses on
    permissions is now regenerated as a linkable node instead of retrying
    forever. (#203)
  * Safe mode delivers the flat path it promises. When the filter-chain
    crash-loops, ASM sets the EQ configs aside and says audio will be flat
    but stable. The channels kept pointing at the equaliser nodes it had
    just removed, so the fallback meant to guarantee sound produced silence
    instead.
  * GameBuds are no longer reported as absent. A headset whose family has no
    known status request — battery and connection state genuinely
    unavailable — was rendered as "No device detected" on every surface
    while its audio played and its controls worked. (#202)
  * "Redirect audio on disconnect" does something. The switch and the device
    it redirects to are two settings, and the device defaults to unset:
    turning the feature on without also picking one made it return silently.
    It now falls back to the best other output and says so. (#48)
  * The uninstaller stops breaking installs it does not uninstall. It
    stopped and disabled ASM's services before asking anything, so answering
    no — or running the documented one-liner, which has no terminal to
    answer on — left the user with ASM dead and nothing removed. A
    successful uninstall also ended without its final line and returned an
    error code. (#190)
  * Your equaliser survives a repair. When a channel's configuration was
    missing or damaged, the repair rebuilt it as a flat bypass — every band,
    macro and boost gone, under a log line that only said "regenerating".
    Repairs now rebuild the real curve, back up what they replace, and write
    atomically so an interrupted write cannot leave a truncated file. The
    microphone chain is covered too, noise reduction included.
  * The Output channel finds somewhere to go. When its device disappeared —
    a monitor switched off, a Bluetooth speaker walking away — anything
    routed there played into a dead end for as long as the tray application
    was not running. It now falls back to the headset without touching your
    saved choice, and returns on its own.
  * Another process can no longer take over a channel. PipeWire does not
    enforce unique node names: a node created with the name of one of ASM's
    own made the watchdog tear down the real link, connect the impostor, and
    report success forever. Names that resolve to more than one node are now
    refused outright and logged.
  * Fewer random audio dropouts. A pw-dump slower than its timeout was read
    as "the whole graph is gone", which had the watchdog rebuild an audio
    path that was fine. An unreadable graph is now told apart from an empty
    one.
  * The stream guard stops cutting the wrong thing. It destroyed PipeWire
    objects by an id read moments earlier, and ids are recycled within
    seconds — on a graph churning because Discord is relinking, which is
    exactly when it runs.
  * ASM only kills processes that are really its own. The orphan cleanup
    decided what to terminate from a name the target process chooses for
    itself.
  * Running asm-daemon by hand no longer cuts the running daemon's audio. It
    reaped the live daemon's channels before discovering another instance
    was already there — and the error message invited exactly that.
  * Settings cannot be poisoned from outside. Values arriving over D-Bus are
    checked against what each setting actually declares, not against the
    type of its default, so a single call can no longer set a system-wide
    PipeWire value out of range or write arbitrary data into the
    configuration. A corrupt per-device settings file now falls back to
    defaults with a backup instead of leaving the headset unconfigured while
    the daemon reported itself healthy. Custom equaliser values are clamped
    before they reach headset firmware, and an imported preset can no longer
    carry non-finite values into the audio graph.
  * Nova 7 and 7P (first generation): four status values were invented. The
    profiles decoded bytes the vendor specification does not define, which
    also left the microphone auto-switch permanently inert on six product
    ids while the interface offered it. The setting now shows why it is
    unavailable instead of pretending.
  * Battery and mix readings cannot show absurd percentages — the clamp
    applied only when a profile asked for rounding.
  * Distrobox installs can bind the Clips shortcut, which needs the tray
    unit name the rest of ASM has used since 1.3.0; the Distrobox generators
    still wrote the old one. On systemd, the post-upgrade restart also left
    the tray on pre-upgrade code.
  * On dinit, "Restart Now" restarts the daemon. It only ever knew how to
    talk to systemd, so an upgrade there gave a new interface talking to an
    old daemon. Safe mode can arm on dinit as well, and setup no longer dies
    with a traceback when dinitctl is missing.
  * The dependency dialog no longer freezes the window while an elevation
    prompt the user may not have seen waits for an answer. (#200)
  * Hotplug keeps working if the udev listener dies — replug and power-cycle
    used to stop being noticed, with nothing saying so.
  * The Clips page stops polling PulseAudio once a second and stops its
    timers when it closes.
  * The equaliser mode switch always releases its button, instead of
    freezing on "restarting audio" and leaving playing streams on torn-down
    nodes.
  * A fresh Arch install resolves. A hard dependency failing to build no
    longer passes as a warning, and the release audit checks it reached the
    repository.
  * Filter-chain service updates reach existing installs. The copy in your
    home directory took precedence over the packaged one and was never
    refreshed.

 -- loteran <axel.valadon@gmail.com>  Sun, 23 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.4.4-1) noble; urgency=medium

  * The right half of a wired GameDAC screen updates again. On a wired Nova
    Pro the custom display only ever filled the left half of the panel; the
    right half kept whatever the DAC firmware had drawn there. The panel is
    128 px wide and a frame goes out as two 64 px strips, one USB report
    each — and that DAC carries out screen writes without ever acknowledging
    them, so the first strip came back as a timeout on a write that had in
    fact drawn. ASM read that as a failure, retried it five times at a full
    second each, and then abandoned the rest of the frame, so the second
    strip was never sent at all. An unacknowledged report is not an
    unexecuted one: timeouts now count as delivered and are not retried, and
    a frame always sends every one of its strips. This is also why ggoled
    text "hello" printed he on the same hardware — the same
    give-up-on-first-error, in a different program. (#197)
  * Sidetone can be turned off on the Nova Elite. The lowest setting was
    level 1, not silence — quiet enough to look like off, loud enough that a
    keyboard next to the boom mic came back through the earcups with no way
    to stop it. The frame carries the on/off state in one byte and the level
    in another, and the state byte was pinned to "on" whatever the slider
    said. It now follows the setting, on the sliders and in the sequence ASM
    replays every time the DAC is plugged in — fixing only the first would
    have let the next reconnection put it back. This is the same fix the
    Nova Pro Omni already carried. (#201)
  * The repair for restricted audio clients now actually runs. On SteamOS
    ASM's clients come up with restricted permissions, and the routine meant
    to grant them has never once succeeded since it shipped: it passed an
    argument that the tool it calls reads as an option, so the command died
    before it ever got to the word "permissions". The repair fired, failed
    instantly, logged it where nobody would see it, and left the caller
    retrying a link PipeWire kept refusing — audio in one ear, an equaliser
    that changed nothing, applications that would not move between Game and
    Media. The command is now formed correctly, a refusal is recognised as a
    refusal even when the tool exits successfully, and a failed repair is
    logged loudly enough to end up in the journal. (#181)
  * The documented one-liner uninstall works. curl -fsSL .../uninstall.sh |
    bash aborted before printing anything: piped into bash the script has no
    file of its own to sit in, and two lines assumed it did. The instruction
    has been in the README the whole time.
  * Arch users are no longer offered an update command that cannot work. The
    updater suggested a command that does not apply to a package installed
    from the AUR, which fails wherever it is pasted.
  * Bug reports read USB access from the kernel instead of asking a library.
    The access check went through a userspace call that can answer "fine" on
    a device the daemon cannot open, which is the exact situation the
    section exists to diagnose. It now reports what the kernel says about
    the device node, so a permissions problem shows up in the report as a
    permissions problem.

 -- loteran <axel.valadon@gmail.com>  Fri, 21 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.4.3-1) noble; urgency=medium

  * A headset that reports nothing is no longer described as connected. When
    ASM had not managed to read a single status frame, it filled in "Online"
    by itself — a placeholder meant for wired headsets that have no power
    state to report, but applied to every device. So a headset ASM could not
    hear from was shown as connected, with no battery, while the DAC screen
    right next to it said "Offline" for the same headset at the same moment.
    The window and the screen now agree, and when nothing has been read, ASM
    says so instead of inventing an answer. (#198)
  * USB timeouts in the status poll are no longer silent. That poll runs
    every two seconds for as long as ASM is running, and three kinds of USB
    failure were being discarded outright — including the one that means
    "this device never answers". A headset that had stopped talking to ASM
    therefore produced no log line at all, indefinitely: no battery, no
    explanation, nothing to report. It now says so once when the trouble
    starts, once a minute while it lasts, and once when it clears, and it
    names what the failure costs you. This is what turned a user's missing
    battery into a three-day investigation. (#198)
  * "Offline" is no longer used to mean "this device has no battery". A
    wired DAC has no battery anywhere in it, and the screen said Offline —
    which reads as a connection fault rather than as "there is nothing here
    to report". Devices with no battery no longer get a battery element at
    all, and the checkbox offering one is hidden on hardware that cannot
    fill it. A headset that is genuinely off still says Offline, because
    there the word is correct. Along the way, a battery reading that arrived
    without a power state beside it was being hidden; it is now shown, which
    is what a device that reports the level but not the state was owed.
  * Bug reports list every SteelSeries device, not just the first one. Only
    one device was ever read, so on a desk with a SteelSeries keyboard or
    mouse next to the headset, whichever one the system returned first was
    the only one described — and the headset was simply absent from the
    report. That section is the one used to identify which model someone
    has, so a report from anyone with two SteelSeries devices was describing
    the wrong one. (#197)
  * Bug reports now include what the daemon reads from your device. The
    battery level, the power state, and every other value ASM decodes,
    exactly as it sees them. The report already said which device was
    plugged in; it never said what ASM was making of it — and the difference
    between "this model has no battery" and "the battery is not being
    decoded" is the whole answer to a class of report that otherwise takes
    several rounds of questions.

 -- loteran <axel.valadon@gmail.com>  Fri, 21 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.4.2-1) noble; urgency=medium

  * Clips can be switched off. It could be switched on, but the only control
    that turned it back off was "Uninstall" — which opens by asking whether
    ffmpeg and GStreamer should be removed from your machine, packages the
    rest of your desktop shares. Saying "stop recording" meant answering for
    your whole system, so the feature read as having no off switch at all.
    The Clips tab now carries a plain on/off switch next to its title. Off
    stops the capture and hands the tab back to its start screen, whose
    button says Enable — one switch, two faces. Your clips stay, the
    packages stay, and Uninstall is still there for the day you want them
    gone.
  * Clicking the tray icon could kill ASM outright. Window, tray icon and
    all — from the outside it read as "the app just closed". ASM showed the
    battery percentage in a *second* tray item and took that item away
    whenever the level became unknown, which is exactly what happens when
    the headset powers off — and also the moment you are most likely to
    click the tray, to find out why your audio just moved to another output.
    Hiding a tray item destroys it, so a click already on its way from your
    panel landed on memory that was no longer there. The battery now lives
    in the ASM icon itself, in a strip under the logo: one tray item,
    created when ASM starts and never taken away, so there is nothing left
    to click on that can disappear first. A headset that is off simply shows
    the logo on its own. (#194)
  * Clips held on to your screen and your keyboard shortcut after being
    switched off. The screen-recording session and the shortcut registered
    with your desktop both outlive the page that created them, and neither
    was handed back when the Clips tab closed. Turning Clips off and on
    again therefore left the old session and keybinding behind, and the new
    recorder then competed with one nothing on screen could account for.

 -- loteran <axel.valadon@gmail.com>  Thu, 20 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.4.1-1) noble; urgency=medium

  * A channel's volume can be bound to a key. Sonar on Windows let you bind
    a key to a channel — turn a dial on a macropad, and Chat goes up or down
    by a fixed step without alt-tabbing. ASM cannot claim a key for itself
    on Wayland (the compositor owns that, and the mechanism that hands keys
    out is neither available everywhere nor able to grant a *specific* key
    like F20), so the action is a command your desktop binds instead:
    asm-cli volume game +5, chat mute, media 40, or several at once with
    game +5 chat -5. Bind it in your desktop's keyboard settings like any
    other shortcut. It goes straight to PipeWire, so a bound key works
    whether or not the window is open, and the new level is remembered
    exactly as the sliders' are. (#193)
  * The clips folder can be changed. Under the gear in the Clips page, next
    to the capture settings: pick any folder you can write to, and new clips
    go there. Clips already recorded stay where they are — moving a library
    means moving each clip's trim, mix and track files with it, possibly
    across drives and possibly while a capture is running, and a library you
    want moved is one you can move yourself. "Default" returns to your
    desktop's video folder. (#192)
  * The USB permissions popup at every boot. Reported in July, fixed once,
    and still happening on clean installs a month later. Your dongle is
    usually enumerated early in the boot, before udev has applied its rules
    to it, so ASM's first attempt to open it fails even though the rules on
    disk are perfectly valid. A retry was added for that — but it gave up
    after ten seconds, and the only things that ever refilled its budget
    were a successful connection or unplugging the dongle. On the ordinary
    setup where the dongle never leaves its port, one slow boot meant the
    dialog stayed until you physically replugged it, no matter how correct
    your system was. ASM now keeps checking for a full minute before saying
    anything, and then goes on checking every thirty seconds instead of
    giving up — so rules that land late, or a fix applied from anywhere
    else, are picked up on their own. And if access comes back while the
    dialog is open, the dialog closes itself rather than asking you to fix
    something that is no longer broken. (discussion #140, discussion #190)
  * The uninstaller now finds the installs it used to walk past. Two of
    them. A pip install --user copy in ~/.local was printed as a note and
    then ignored — so someone who had removed their distro package and still
    found ASM starting at every boot was told "No Arctis Sound Manager
    installation detected — nothing to do", three lines after the script had
    listed the offending file. And on Nobara and Ultramarine, where the
    package comes from Terra under the name python3-arctis-sound-manager,
    nothing was detected at all, because only our own package name was
    checked. Both are now found and removed, with --pip-user to target the
    ~/.local copy alone. A removal that fails also says so instead of
    reporting success. (discussion #190)
  * Clips now go to your actual video folder. The save location was the
    literal path ~/Videos/ASM Clips — but "Videos" is the English name of a
    folder every desktop translates: ~/Vidéos, ~/Videók, ~/ビデオ. On any
    system not running in English, ASM quietly created a second video folder
    beside the real one, and clips landed somewhere the file manager never
    points at. The folder is now read from your desktop's own configuration,
    so it follows whatever your system calls it. If you already have clips
    in ~/Videos/ASM Clips, that stays your folder — nothing is moved out
    from under you. (#192)
  * The headset can finally fall asleep. With ASM running, a headset set to
    power off after N minutes of inactivity simply never did — stop ASM and
    it powered off normally. The cause was in every audio chain ASM builds:
    none of its nodes declared node.passive, so each one kept pushing its
    chain even with nothing playing. The physical device sat in RUNNING
    permanently, the firmware never saw an idle moment, and its auto-off
    timer never started counting. All six output chains and the three
    channel loopbacks are now passive: they follow the audio instead of
    driving it, so once applications stop, the whole graph — loopback, EQ,
    spatial audio, device — suspends, and the headset powers off exactly as
    configured. Playback wakes it back up. Confirmed on a Nova Pro Wireless:
    with auto-off at one minute, the headset powered down in 45 seconds, and
    all three channels still play normally. Existing configs are repaired in
    place on the next start, so nobody's EQ is touched. Thanks to
    @Michsior14 for six rounds of captures on an Arctis 7+, and for the fix
    to the diagnostic script along the way. (#180)

 -- loteran <axel.valadon@gmail.com>  Thu, 20 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.4.0-1) noble; urgency=medium

  * ASM now runs without a SteelSeries headset. Asked for twice, two months
    apart — once with a Beyerdynamic TYGR 300R, once with a Focusrite
    Scarlett and an HD560S — and answered no both times, because the daemon
    only ever started once an Arctis replied over USB. That was true of the
    daemon, not of the app: the four channels, per-channel volume, the Sonar
    EQ, HeSuVi spatial audio, the application router and Clips never touch
    USB at all. They manipulate PipeWire sink names, nothing more. What
    genuinely needs an Arctis is the conversation with the headset —
    battery, ANC, sidetone, ChatMix, the OLED — and this mode does without
    it. Turn on *Use ASM without a SteelSeries headset* in Settings, pick
    the output your headphones are plugged into, and the channels are built
    on it. The Headset and DAC pages come up empty rather than showing
    controls that would do nothing, and no microphone has to be chosen if
    you only want playback. Nothing changes for a SteelSeries headset: the
    mode is off by default, it can only be reached deliberately, and a
    connected Arctis always wins. (#189, discussion #95)
  * "Launch at login" stopped working after updating to 1.3.0. 1.3.0 renamed
    the tray unit so the desktop can attach a keyboard shortcut to it —
    necessary, and correct. What was missed is that the rename left the old
    unit behind: for anyone whose autostart pointed at the one shipped in
    the package, the update deleted the file it pointed to and never
    switched the replacement on. The tray simply stopped appearing at login,
    on a machine where nothing else looked wrong, and starting it by hand
    gave a window with no daemon behind it. The daemon now moves the setting
    across on its own, at the first start after the update — it restores an
    autostart that existed and never grants one to someone who had turned it
    off. Reported on two machines by @TheJurassicSnark. (#191)

 -- loteran <axel.valadon@gmail.com>  Thu, 20 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.3.0-1) noble; urgency=medium

  * Clips: save the last thirty seconds, with each Sonar channel on its own
    audio track. Installed from Settings rather than shipped with ASM, and
    deliberately so: capture is the one feature that needs packages a
    desktop does not already have — PyGObject, four GStreamer plugin sets
    and ffmpeg — and an install that only wants the mixer and the equaliser
    should not carry a screen recorder's encoders. Settings offers an
    Install button that fetches exactly those packages and nothing else, and
    an Uninstall that turns the feature off and offers to take them away
    again; removal is a separate question with No as the answer it defaults
    to, because ffmpeg and GStreamer belong to your video player and your
    browser as much as to this. If a package goes missing afterwards the
    button says Repair rather than claiming the feature works. A rolling
    capture runs in the background; the Clips page — or asm-clipd bound to a
    key — writes the preceding seconds to ~/Videos/ASM Clips as an .mkv
    carrying Game, Chat and Mic as separate tracks, so what you keep can
    still be remixed afterwards. The library is a grid of poster frames
    rather than a list of timestamps that differ only by the second they
    were taken; the frame is lifted from five seconds before the end, inside
    the span the editor opens with, because the middle of a clip is usually
    the part where nothing has happened yet. The editor trims, remembers the
    span per clip, and exports to a separate Shared/ folder so an export
    never comes back as another card in the library. Exports are always MP4,
    whatever the settings: Matroska is the only container that holds a track
    per channel, and it is also one Discord will upload and then refuse to
    play, so the recording format and the sharing format are deliberately
    not the same thing. Exporting ends in a share step with the poster frame
    as a drag-out card — drag it straight into Discord. Select, rename and
    delete in bulk; deletion goes through the system trash, because a
    mis-click on a grid of near-identical cards should be recoverable.
  * Clips: the editor's preview is a mixer — every channel plays at once,
    with a live level and mute on each. A media player decodes exactly one
    audio track and picks the first, Qt's included, so a clip whose Game
    channel was empty played back in total silence with three perfectly good
    channels sitting beside it, and the only available reading was that
    clips record no sound. Each channel is now given a player of its own and
    run in step with the picture, so the sliders and Mute do what a mixer's
    controls do: you hear the change while you make it, and what you hear is
    exactly what the export will contain. Those levels are remembered per
    clip, alongside the trim — deciding the microphone was too loud is a
    judgement about *that* recording, and reopening a clip used to make you
    decide it again. Channels holding nothing are marked *silent*, and if
    every one of them is, the editor says so and points at the Sonar routing
    on the Home page, which is where that is actually fixed.
  * Clips: the editor lost its transport bar and gained a scrubbable
    timeline. The play button and seek slider above the preview were a
    second, worse copy of the trim band below them — two scrubbers for one
    clip, and the one that also showed the span being exported was the one
    worth keeping. Click the picture to play or pause (or press Space), and
    drag the playhead along the band to run back and forth over a moment,
    which was not possible at all before: dragging inside the selection
    moved the selection, and everywhere else was a single click.
  * Clips: choose the capture frame rate, and pin an exact one when you
    export. The Clips page offers 30 or 60 fps, and the editor offers *As
    recorded*, 30 or 60. These are different things and both are worth
    having. The screen portal only produces a frame when the picture
    changes, so what capture takes is a ceiling and never a promise — 30 is
    the new default because asking for 60 sets the keyframe interval and the
    encoder's budget against a rate the compositor rarely reaches. A rate
    can only genuinely be *fixed* on the way out, where the gaps can be
    filled, so that is where the export offers it (at the cost of a
    re-encode, which the dialog says up front).
  * Clips: the capture rate read-out now shows both numbers. A status bar
    reading 20 fps that saves a 12 fps clip looks like a bug and is not one:
    the live figure covers the last few seconds and the file averages its
    whole length, idle stretches included. Both are shown when they
    disagree, alongside the rate the screencast itself is producing, and a
    save reports the rate the file actually ended up with.
  * Clips: you can change what is being captured, without a terminal. The
    screen picker appears once and never again — the choice is persisted and
    replayed on every later start, which is what stops a rolling capture
    from prompting each time it rebuilds its pipeline. The cost was that the
    first answer was permanent: pick the wrong monitor, or pick a window and
    later want the whole screen, and the only way back was asm-clipd
    --forget from a terminal. There is now a Capture control beside Length
    and Frame rate that asks again, and if a capture is running it restarts
    there and then rather than springing the picker on you twenty minutes
    later. What is captured still cannot be *displayed* — the choice lives
    inside the portal and Wayland never tells the app what was picked — so
    the control offers the only honest thing, which is the way back to the
    picker.
  * Clips: the controls were rearranged, and Select all finally has an
    opposite. The two things you press, Start and Save, sat in one row among
    the four you set once and leave alone, so they carried no more weight
    than a spin box; they are now a row of their own above the settings. The
    shortcut stopped being a loose sentence with a button after it and
    became a labelled control like the others. And a grid that offered
    Select all offered no way out of a selection: clicking empty space
    clears one in a file manager, but a grid of cards usually leaves no
    empty space to click, so the only route was ctrl-clicking every card
    back off.
  * ASM no longer asks whether audio should go through Sonar — it just does.
    A dialog used to offer, once per installation, to make a Sonar channel
    your default output. It was asking permission for the thing ASM exists
    to do, seconds after launch, before you had seen a single channel; and
    it read the audio graph only, with no idea whether the headset was
    switched on, so with a wireless headset off it offered to route audio
    into a channel pointing at a device that was not there — which would
    have taken the sound away. The daemon has adopted the default on every
    connect since 1.2.28 anyway, with redirect_audio_on_connect in Settings
    to turn it off, and unlike the dialog it checks the headset is actually
    on first.
  * Switching Clips on could take your sound away, and keep it away. The
    switch opened ASM's general dependency dialog whenever a capture package
    was missing. That dialog lists every failing check in the app, and one
    of them — "pipewire-pulse running" — is fixed by restarting PipeWire and
    pipewire-pulse, so its Install-all button restarted the audio stack. The
    headset's card came back with its profile switched off, WirePlumber
    remembered that as a deliberate choice, and replugging the headset
    afterwards did not help because the remembered answer was replayed each
    time. Clips now installs and removes only its own packages, through its
    own commands, and cannot restart a service.
  * Record symbols piled up in the corner of the screen, one per capture you
    had ever started. Three overlapping indicators, reported from a session
    that had stopped and restarted the capture a couple of times. They were
    real: each one was a live screen-share session that ASM had opened and
    then let go of without closing. Releasing the reference is not the same
    as closing the session — the portal keeps one alive until its client
    closes it or leaves the bus, and the app goes on running after a capture
    stops. So every Stop and Start, every pipeline restart, and every
    capture that failed to begin left another session open, each still
    drawing its own indicator and each still telling the desktop that the
    screen was being recorded. Sessions are now closed when the capture that
    owns them ends, including the half-made one left behind when the screen
    picker is cancelled.
  * A clip opened outside ASM played in silence, with two perfectly loud
    tracks sitting inside it. Reported as "the clips have no sound — it
    failed to capture the audio". The capture was fine; the file was telling
    every player something untrue. Matroska's FlagDefault means *yes* when
    it is not written, and the muxer never writes it, so a clip carrying
    five channels announced all five as the default one and each player fell
    back to its own tie-break. Most channels in a real session hold nothing
    — nothing routed to Chat, the microphone muted — so what got picked was
    usually one of the empty ones, and the only available reading was that
    nothing had been recorded. Exactly one track is now flagged on the way
    out, chosen by how many encoded bytes each channel holds: Opus
    compresses silence to almost nothing, so the loudest channel is already
    known from the capture buffer and costs nothing to find. That beats
    keeping the first track, which is Game and is empty for anyone playing
    through the headset directly. It is a stream copy rather than a
    re-encode, and any failure leaves the clip exactly as it was written —
    an awkward default flag is worth immeasurably more than no clip.
  * Clips were labelled after whatever browser happened to be playing. A
    clip taken while Chrome had a tab open came out named "Google Chrome",
    and the Clips page announced it as what was being recorded — to a user
    who had picked their game's window in the screen picker. Two faults met
    there. The list of applications a clip is never about was matched
    against whole names, so it caught the bare binary name chrome and missed
    the Google Chrome that PulseAudio actually reports; the same hole let
    OBS, Brave and Firefox through under their display names. And the name
    itself was labelled "Recording:", which it never was — it comes from the
    audio graph, and what is on screen was chosen in the portal picker,
    which Wayland never reveals to us. The list now matches on words, so
    display names are caught without a game called *Observation* being
    mistaken for OBS, and the label reads "Game:".
  * Everything that followed the system default was filed as game audio. ASM
    makes one of its channels the default output when the headset connects,
    so a browser, a music player, system sounds — anything not routed by
    name — lands there. That channel was Game, not Media: the constant
    naming it said "media" and held Arctis_Game, because the headset's
    ChatMix dial reports its own two halves as "media mix" and "chat mix"
    and its "media" half *is* Game. So a podcast was equalised as game audio
    and then balanced against Discord by the ChatMix dial. The default is
    now the Media channel; the dial keeps driving Game, which is what it is
    for.
  * The microphone EQ could be missing entirely, on an install that never
    opened the Sonar tab. effect_output.sonar-micro-eq is created by a
    filter-chain config that nothing guaranteed: the config generator
    covered Game, Media, Chat and Output and skipped the microphone, no
    package shipped the file, and its only writer was the Apply button in
    the mic EQ tab. Meanwhile the daemon makes that node the default input
    at every startup. So on an install where nobody had pressed Apply, the
    headset microphone was absent from the selectable inputs, and the mic
    input-source setting and auto-switch did nothing at all. The daemon now
    writes a flat config when the file is missing — never over an existing
    one, which would drop your mic processing.
  * The Output channel's device disagreed with itself across three tabs.
    Setting it in the Equalizer left Channels and Settings showing the old
    device, and the other way round. Two causes met: the Equalizer's picker
    kept its own preference file that nothing else read, and the two sides
    did not even spell a device the same way — one saves a node.nick, the
    other keys its list on node.name, so a value that did travel could still
    fail to match. One setting is the source of truth now, both spellings
    resolve, and a fresh pick is held until it is saved rather than being
    overwritten by a stale read.
  * Every diagnostic report ever filed claimed there was no settings file.
    The report looked one directory above where settings are actually
    written, so the section meant to show what you had configured — spatial
    audio, HRIR, the external output device, the forced quantum — always
    came up empty, and each of those has had to be asked for by hand in a
    recent issue. It reads as a clean default configuration and never was
    one.
  * The ASM logo at the bottom of the sidebar was cut off. A seventh page
    pushed the column past the window. The Help icon is a little smaller now
    and the sidebar's own spacing a little tighter; no other icon changed.
  * SteamOS: the Distrobox installer stopped part way through, looking as
    though it had worked. steamos-readonly disable needs root and was called
    without it, so it failed, the udev step returned an error and the
    install stopped — after printing the steps it had already completed.
    Reported and diagnosed by @emoeckel. (#188)
  * The .deb on the releases page was missing pieces every other package
    had. Debian is built two ways — debian/rules for the PPA,
    debian/build-deb.sh for the release attachment — and the second had
    drifted: no arctis-stream-guard unit, and a hand-kept list of console
    scripts holding five of the eight entry points, so asm-stream-guard and
    asm-clipd were not in the package at all. A unit file and a keybinding
    pointed at executables that did not exist. The list is now read from
    pyproject.toml, and a test compares the two build paths.

 -- loteran <axel.valadon@gmail.com>  Tue, 18 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.2.34-1) noble; urgency=medium

  * Applications could stay stuck on the headset itself, outside every
    channel. Anything ASM does not recognise by name, which is most things
    once you go past browsers and the usual chat apps, would sit directly on
    the headset output rather than on Game, Chat or Media: audible, but with
    no equaliser, no per-channel volume, no ChatMix, and absent from the
    mixer. ASM has a pass whose whole purpose is to bring such applications
    back onto a channel, and it was skipping them, because the headset's own
    output is named after the headset and so counted as a channel it was
    already on. The two are now told apart. Applications you deliberately
    placed on the hardware yourself stay where you put them. Reported on
    Discord by autune.
  * Moving an application between channels no longer stutters. The Home page
    rebuilt every application tag and every row of the "other applications"
    list twice a second, including while you were dragging one of those
    widgets onto another channel. Both are now left alone when nothing about
    them has changed. Contributed by @Denkiyaa. (#187)
  * The full test suite now runs on every push. Continuous integration ran a
    single test file out of the fourteen hundred tests in the project;
    everything covering routing, the mixer, the audio graph and bug reports
    was never executed. It caught five tests that had been failing silently
    since the Media channel gained its own surround chain, and it means a
    contributed change is now verified by the project rather than by whoever
    happened to run the tests locally.

 -- loteran <axel.valadon@gmail.com>  Sun, 16 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.2.33-1) noble; urgency=medium

  * Channels could be completely silent on SteamOS, with everything
    appearing to work. The audio never reached the headset because the
    system refused to let ASM connect its channels to its own processing, on
    permission grounds. Nothing in the app looked wrong: the channels were
    there, the settings were saved, and a video would simply stall after a
    few seconds with a fraction of a second of sound. Affected users could
    not work around it either, since connecting the two by hand failed
    exactly the same way. ASM now recognises that refusal and asks the
    system for the one permission it needs before trying again. Reported by
    @baccatuesday, who ran every test that made the diagnosis possible, and
    confirmed by @emoeckel.
  * Bug reports explain refused audio connections. Reports now say which
    program owns each part of the audio graph and what the system allowed
    each of them to do, which is what a refused connection turns on. asm-cli
    diagnose and the in-app report button now also carry the same
    information as each other: until now each had sections the other lacked,
    so which one you used decided whether your report could answer the
    question being asked of it.

 -- loteran <axel.valadon@gmail.com>  Sun, 16 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.2.32-1) noble; urgency=medium

  * Applications playing outside the Game / Chat / Media channels are now
    visible, and movable. The mixer only ever listed applications that were
    already on one of its channels. Anything playing elsewhere — on the
    headset's own device rather than a channel, on an HDMI output, on a
    second sound card — was audible but absent from ASM, so the only way to
    assign it was an external tool like pwvucontrol. A new Other
    applications section appears under the channel cards whenever there is
    something to show, listing each application with the device it is
    currently playing on and the same one-click buttons to send it to Game,
    Chat, Media or Output. Applications you deliberately keep elsewhere can
    be dismissed from the list with the ×, and a *Show hidden* button brings
    them back at any time; dismissing only stops the listing, it never moves
    your audio. The section stays hidden when everything is already on a
    channel, so nothing changes for setups that were fine. Suggested by
    @autune, whose Nova Pro dock feeds his speakers from its AUX output — an
    arrangement where routing everything through a channel would be the
    wrong answer.
  * Installing on Bazzite, SteamOS or Silverblue could still leave the
    container empty. Setting up the package repository needs a local signing
    key, and the installer only created one when the container's keyring
    looked completely empty. Container images ship with the public part
    already filled in and no signing key, so that step was skipped on
    exactly the systems it was meant for: registering the repository failed,
    and the install ended with "target not found" and nothing installed. The
    key is now always prepared. Reported on Discord by binx9612.
  * Bug reports now state which output device is the system default. Whether
    an Arctis channel holds that spot decides how much of ASM applies at
    all, and its absence from reports has cost a round of questions with
    someone whose setup was perfectly deliberate.

 -- loteran <axel.valadon@gmail.com>  Sat, 15 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.2.31-1) noble; urgency=medium

  * Bug reports now describe what your audio is actually doing, not just
    what exists. Until now a report listed your audio devices and their
    names, but not whether each one was playing, idle or asleep, nor what
    was connected to what. That is the difference between "something is
    keeping the headset busy" and "the surround processing is keeping it
    busy", and chasing the gap has cost real back-and-forth with people who
    took the time to report a problem. Reports now include every audio node
    with its live state, every connection between them, which ones are
    actually processing sound (with the glitch counters behind crackling),
    how each of ASM's own pieces is configured at that moment, and the
    kernel's own view of the sound card. Applications that pin their audio
    to a specific device show that too, which is what explains cases where
    another program's feature stops working. Nothing extra is asked of you:
    it is the same button and the same command as before, and the report
    stays a plain text file you can read in full before sending it.

 -- loteran <axel.valadon@gmail.com>  Fri, 14 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.2.30-1) noble; urgency=medium

  * Installing on Bazzite, SteamOS or Silverblue could leave you with
    nothing installed. The installer created its container, then stopped
    partway without saying so: the application entry appeared, but opening
    it landed in a plain terminal where asm-gui was not found. This was a
    regression introduced in 1.2.27, when the installers switched to the
    signed package repository: if registering that repository failed for any
    reason (no network for the signing key, a keyring it could not sign
    into), the script aborted right there, after creating the container and
    before installing anything. Registering the repository can no longer
    interrupt the installation, and if the install itself fails you now get
    the reason and the commands to investigate instead of a silent stop.
    Reported on Discord by binx9612 on Bazzite.
  * Audio from another app's virtual microphone is no longer hijacked. A
    stream that an application deliberately pins to its own virtual device,
    such as a soundboard feeding a virtual microphone, was being pulled onto
    an Arctis channel like any other audio. That did not merely move the
    sound somewhere else, it broke the other application's feature outright,
    and it happened to soundboards whose ordinary playback you had assigned
    to a channel, since both streams share one application name. Such
    streams are now left where their application put them, and one that had
    already been moved is returned. Streams pinned to real outputs are
    untouched, so pulling audio from other speakers onto your headset still
    works as before. Contributed by @nobodys-tools. (#185)

 -- loteran <axel.valadon@gmail.com>  Fri, 14 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.2.29-1) noble; urgency=medium

  * ASM now tells you when the surround processing can't keep up. Spatial
    Audio missing its deadline sounds like random crackling, and until now
    nothing in the app explained where it came from — leaving you to blame
    the headset, the cable or the drivers. If the surround chain drops
    frames steadily, you get a notification saying so and pointing at the
    stability setting that fixes it. It deliberately stays quiet about
    one-off glitches: a single burst while a game loads a level or a build
    finishes is normal and not worth interrupting you for, so it only speaks
    when the problem persists for a few minutes, and only once per session.
    Suggested by @nobodys-tools. (#183)
  * The Spatial Audio profile picker now shows how much CPU each profile
    costs. The bundled profiles range from tiny to nearly a megabyte, and
    the larger ones cost proportionally more processing — enough that on a
    busy machine the choice decides whether the audio stays clean. Each
    entry is now marked *light on CPU*, *moderate CPU* or *heavy on CPU*, so
    the trade-off is visible while you choose instead of discovered
    afterwards. This says nothing about sound quality: a heavier profile is
    not a better one, just a more demanding one. Suggested by
    @nobodys-tools. (#183)
  * The Discord invite on the README and website works again. The previous
    invite had expired, so anyone following the "Join the Discord" badge —
    the first thing shown at the top of the project page — landed on an
    error. The replacement is set never to expire. Reported by
    @nobodys-tools. (#184)

 -- loteran <axel.valadon@gmail.com>  Wed, 12 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.2.28-1) noble; urgency=medium

  * A stability setting for when the surround chain crackles. Spatial Audio
    runs fourteen convolvers per channel, and with a large HRIR that
    processing can miss its deadline under ordinary desktop load — heard as
    random crackling, with nothing in the app to explain where it comes
    from. Settings now offers Audio stability (buffer size): leave it on
    *Automatic* (the default, unchanged behaviour) or pick a larger buffer,
    which gives the surround processing more time per cycle and stops the
    glitches. Reported with measurements showing the crackling disappear at
    the larger size. Worth knowing before you turn it on: this is a
    system-wide PipeWire setting, so the extra buffering applies to every
    application, not only ASM — comfortable for music and films, less so for
    competitive play, which is why it is off by default and left to you. ASM
    releases it when it exits, and restores your choice when it starts.
    Suggested by @nobodys-tools. (#183)
  * The app kept scanning your audio system after you closed its window. The
    Channels page started a twice-a-second refresh when it was first shown
    and never stopped it, so once the main window had been opened the work
    carried on for as long as the tray icon was there — with nothing on
    screen to show for it. Each pass inspected the whole PipeWire graph,
    which on a busy system was enough to keep a core noticeably occupied and
    to disturb the Spatial Audio processing, heard as crackling. The refresh
    now runs only while the page is actually visible, and the expensive part
    of it runs less often, so nothing changes on screen. Found and diagnosed
    precisely by @nobodys-tools. (#182)

 -- loteran <axel.valadon@gmail.com>  Wed, 12 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.2.27-1) noble; urgency=medium

  * Provisional support for an Arctis 7+ hardware revision (0x220c). A
    dongle reporting this product id was in no device profile, so ASM
    recognised nothing and sent it nothing at all — no settings, no battery,
    no ChatMix. Audio worked throughout, because that side is plain USB
    audio handled by the kernel, which makes the gap easy to miss:
    everything sounds fine while nothing you set in the app reaches the
    headset. It also meant no udev rule was generated for it, so the device
    was denied access even after running asm-setup. This revision exposes a
    different USB layout from the other 7+ variants (HID interfaces 0 and 1,
    where they use interface 3), so it gets its own profile rather than a
    fifth product id on the existing one. Marked provisional: the control
    interface and command set are inferred from the endpoint sizes and the
    rest of the family, and not yet confirmed on hardware — if your 7+
    behaves oddly rather than simply working, please say so in the issue.
    Reported by @Michsior14. (#180)
  * The Channels tab's per-channel output device now actually sticks.
    Sending a channel to something other than the headset — Media to your
    speakers, say — appeared to do nothing for any app that also had a saved
    routing override on that channel. The setting was saved correctly and
    the move itself worked; two enforcement passes then fought over the
    stream every few seconds. The per-app override pass resolved to the bare
    virtual sink and moved the stream back to the headset, the
    channel-output pass moved it out to the speakers again, forever. Both
    passes now resolve through the same destination before acting, so the
    pick holds — and when the configured output isn't currently plugged in,
    the channel falls back to the headset instead of routing to a sink that
    doesn't exist. Contributed by @relxek. (#177)
  * Arch and CachyOS were stranded on 1.2.25. The v1.2.26 repository publish
    lost its database upload to a transient HTTP 503 from GitHub. The
    packages went up, the index did not — and pacman resolves against that
    index, so the signed repository kept advertising the previous version to
    everyone while the new package sat there unreferenced. Uploads are now
    retried, and the database is published *after* the packages it names, so
    an interrupted run leaves the previous coherent repository rather than
    an index pointing at missing files. The release delivery check was also
    looking the wrong way: it verified the AUR — which nothing on this side
    can guarantee, since pushing depends on aur.archlinux.org's git being
    reachable — while never checking the repository Arch users install from.
    It now reads the actual pacman database, and an AUR outage no longer
    fails a release or buries a real problem under recurring noise. (#178,
    #176)
  * pacman -S noise-suppression-for-voice was missing from the signed
    repository. v1.2.26 made the mic noise-cancel plugin an optional
    dependency shipped alongside ASM, but it had silently stopped building:
    GCC 15 no longer pulls in a header the plugin's 0.91 release relies on.
    The build step tolerates failures by design — a broken upstream must not
    hold back a release — so it only logged a warning, and the repository
    shipped without it. It builds and is published again. (#175)
  * SteamOS, Bazzite and Silverblue could not update. The Distrobox
    installers built ASM from the AUR, so when aur.archlinux.org went into
    maintenance there was no supported way forward on an immutable OS — the
    workaround being shared around was hand-editing a PKGBUILD, re-running
    checksums and manually installing service files a stale package
    definition never knew about. They now register the signed repository
    inside the container and install from there, falling back to the AUR
    only if it is unreachable. Updating becomes a plain pacman -Syu inside
    the container. Reported by @baccatuesday, with help from
    @TheJurassicSnark. (#175)
  * The DAC screen no longer flashes the ASM logo when Custom Display is
    off. Turning Custom Display off means keeping the DAC's own interface,
    but the startup splash was drawn anyway — at daemon start, and again
    every time the app was opened or the tray icon clicked. It did more than
    flash a logo: showing it also paused the refresh loop for its full
    duration, and that loop is what hands the panel back to the firmware, so
    the screen sat frozen on the ASM logo for a few seconds before snapping
    back. Reported on Discord by Messiah Complex on a Nova Pro Wired DAC.

 -- loteran <axel.valadon@gmail.com>  Wed, 12 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.2.26-1) noble; urgency=medium

  * A second microphone noise-cancellation engine: DeepFilterNet. Next to
    the existing RNNoise (ClearCast), the mic noise-cancel card now lets you
    choose DeepFilterNet — a deep-learning suppressor many find cleaner
    across different microphones. It isn't packaged by distributions, so if
    you switch to it (or turn noise cancellation on) without the plugin
    installed, ASM offers to download the prebuilt LADSPA plugin with one
    click, into ~/.ladspa; if you install a newer version yourself later,
    ASM uses that instead. Works on glibc x86_64/aarch64/armv7 Linux,
    including immutable distros via the bind-mounted ~/.ladspa. Suggested by
    the community.
  * SteamOS: the app crashed on launch, and couldn't reinstall its
    dependencies, after a system update. A SteamOS update replaces the whole
    root filesystem — which wipes the pacman-installed ASM package and its
    Python dependencies (like pulsectl) — and pacman can't write them back
    because the filesystem is read-only. Three separate problems came out of
    that, all fixed. The GUI no longer crashes when pulsectl is missing: it
    opens with external-output routing disabled instead of dying on an
    unguarded import. The in-app dependency installer now installs
    pure-Python modules (pulsectl, dbus-next, ruamel.yaml, pyusb, Pillow)
    with pip install --user into your home directory — root-less, and
    surviving the next OS update — so its Install button actually resolves
    them on SteamOS, and the copied command no longer carries a pointless
    sudo. And pacman -S arctis-sound-manager from the signed repository now
    completes, where before it aborted on noise-suppression-for-voice — an
    AUR-only plugin that was wrongly a hard dependency and wasn't in the
    repo; it's now optional (the mic noise-cancel toggle degrades gracefully
    without it, and DeepFilterNet is an alternative) and shipped in the repo
    for those who want it. Reported by @baccatuesday. (#175)

 -- loteran <axel.valadon@gmail.com>  Mon, 10 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.2.25-1) noble; urgency=medium

  * The DAC's custom display now updates as you change its settings. Turning
    display elements on or off, changing their fonts or scroll speed, or
    editing the weather only *saved* the setting — the screen was redrawn
    just for the brightness slider and the Custom Display on/off switch, so
    every other change appeared only after toggling Custom Display off and
    on again. Those settings now apply live, the moment you change them — no
    toggle, and no Apply button needed. Reported by @jnunez2301. (#172)
  * Two copies of the app could open at login. The single-instance guard
    waited briefly for a reply from an already-running instance and, on
    silence, concluded its socket was stale, deleted it and started a second
    full GUI — but a freshly-launched instance accepts connections for a few
    seconds before it finishes starting and can reply, and login (the
    systemd unit and the desktop entry a moment apart) lands squarely in
    that window. It now settles the question on the connection being
    *accepted* rather than answered, and never unlinks a socket that is
    still live, so exactly one instance runs. Contributed by @Denkiyaa.
  * Clicking the tray icon could crash the whole app. The click arrived as a
    D-Bus call the tray host was still waiting on, and the handler built the
    main window inline; Qt processed events underneath it, a status update
    carrying no battery level hid the battery tray item, and hiding it
    destroyed the object whose click handler was still on the stack — a
    use-after-free that took the whole app down, which read as the app
    closing itself. The click now opens the window on the event loop instead
    of inline. Contributed by @Denkiyaa.

 -- loteran <axel.valadon@gmail.com>  Sun, 09 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.2.24-1) noble; urgency=medium

  * The Sonar equaliser now applies as you edit it — no Apply button, and no
    drop in the audio. Adding, removing or muting a band used to regenerate
    the channel's filter-chain and restart it, which tore down every EQ node
    and silenced the channel for several seconds; only dragging an existing
    band applied live. Bands now sit in a fixed-shape rack, so every edit —
    add, delete, mute, move — is a control change pushed straight into the
    running graph in tens of milliseconds instead of a restart. The Apply
    button is gone with the cost that justified it; Revert stays, and now
    returns to the curve the preset holds. Contributed by @Denkiyaa. (#170)
  * The chat EQ could lose the output it was pointed at. The GUI regenerates
    a channel's filter-chain config on every EQ edit, but only the daemon
    knows which headset is attached — so the GUI wrote the chat channel's
    target out empty, and PipeWire's session manager then tried to route
    that output to the default sink (one of ASM's own loopbacks), failed on
    the resulting cycle, and retried on every graph change: 23 failed link
    attempts in three minutes on the machine it was caught on, audible as
    interruptions on whatever was actually playing. The GUI now keeps
    whatever target is already on disk when it can't resolve one itself, and
    the daemon repairs a config that was already written without one.
    Contributed by @Denkiyaa. (#170)
  * A headset added by an update could still be refused USB access. If
    ~/.config/arctis_manager/devices/ held an old copy of a device profile —
    the pre-2026 asm-setup wrote one there on first run — it shadowed the
    packaged profile when the udev rules were generated, so a product id
    added in a later release (for example the Arctis Nova 7P Gen 2's 0x2298)
    never reached the rules file even after upgrading, and the headset was
    denied access. The rules generator now unions the product ids across
    your copy and the packaged profile, so a stale copy can no longer hide a
    newer PID — and a product id you add by hand is granted access too.
    Reported by @camperotactico. (#146)

 -- loteran <axel.valadon@gmail.com>  Sat, 08 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.2.23-1) noble; urgency=medium

  * **Auto mic-switch can now trigger on disconnect *or* mute together. The
    microphone-switching feature added in 1.2.22 let you pick one trigger —
    headset disconnects, or headset mic muted. There is now a combined
    option: switch to your alternate microphone whenever the headset is
    either powered off or** muted, and back to the headset mic only once it
    is both connected and unmuted. Handy if you want the desk mic to take
    over the moment you step away *or* mute, without choosing between the
    two.
  * The Spatial Audio Immersion and Distance sliders now actually do
    something — on both Game and Media. Moving a slider only ever wrote the
    new value to a settings file; the virtual-surround chain was never
    rebuilt, so the sound never changed unless you deleted the config by
    hand and restarted the daemon. The reason was subtle: the slider handler
    asked to regenerate the chain from the GUI process, which — unlike the
    background daemon — has no headset registered, so the request quietly
    did nothing. The daemon now rebuilds the chain when a slider moves and
    applies it live. On top of that, Game and Media each get their own
    independent Immersion/Distance instead of sharing one chain fed only by
    the Game values, so you can run, say, more reverb on Game and none on
    Media. Moving a slider briefly restarts the surround chain (a short
    audio glitch), which is the cost of applying it. Reported with a precise
    root-cause analysis by @cookiekiller. (#169)
  * Nova Pro Wireless / GameDAC 2: the volume and ChatMix dial responds
    immediately again. Turning the dial only registered every few seconds,
    because the daemon's endpoint listener treated a normal "nothing to read
    yet" timeout as a fault and backed off for a full second before
    listening again — so most of the dial's rapid updates arrived during the
    back-off and were dropped. A routine read timeout is no longer treated
    as an error, so dial movements come through as you make them. Reported
    on Discord.

 -- loteran <axel.valadon@gmail.com>  Thu, 06 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.2.22-1) noble; urgency=medium

  * Switch the microphone the Sonar Micro EQ uses between your headset and a
    desktop mic — by hand or automatically. Picking the input by hand was
    already possible; this adds doing it on an event. Choose an alternate
    microphone and a trigger: switch to it when the headset disconnects or
    powers off (and back to the headset mic when it returns), or when you
    mute the headset mic (and back when you unmute). The change happens
    behind the Sonar Micro EQ, so an app — a Discord call — never sees its
    microphone disappear; it keeps recording from the same node while the
    source underneath it swaps. Manual switching works on every headset; the
    automatic triggers act on whatever a given headset actually reports, so
    one that never announces its mute state simply won't use that trigger
    rather than misbehaving.
  * The update button no longer runs a command that can't do anything. When
    ASM was installed from a package you downloaded by hand — a .deb, .rpm
    or .pkg that no repository tracks — the in-app update ran your package
    manager's upgrade command, which found nothing to fetch, reported
    success, and left the version unchanged while the "update available"
    banner kept coming back. ASM now notices that case up front (on apt, dnf
    and pacman alike) and instead offers the one-line command to add its
    repository — after which updates apply normally — or a button to
    download the latest release. (#163)

 -- loteran <axel.valadon@gmail.com>  Tue, 04 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.2.21-1) noble; urgency=medium

  * Random audio dropouts on a healthy setup are gone. ASM reads the
    PipeWire graph with pw-dump, and once in a while — when a node appears
    or disappears at the exact moment it runs — pw-dump prints a second,
    tiny JSON fragment stuck onto the end of the real one. ASM took that as
    a parse error and concluded the entire graph had vanished, so its
    watchdog tore down and rebuilt the loopbacks and restarted the
    filter-chain — audible as a dropout every 15–25 minutes on hardware that
    was working perfectly the whole time. The graph is now read back even
    when pw-dump doubles up its output. Diagnosed on a Nova Pro Wireless by
    @relxek. (#164)
  * Ubuntu 26.04: the app now starts after a clean install. On 26.04,
    PySide6 is split into separate per-module packages, and ASM's dependency
    on them was written in a way (… | python3-pip) that let the package
    manager consider it satisfied by python3-pip — which nearly everyone
    already has — and skip the actual Qt modules. asm-gui then died at
    launch with No module named 'PySide6.QtNetwork'. The Qt modules are now
    hard dependencies, so a plain install pulls them in. Traced to the exact
    missing submodules by @n6dlh. (#163)

 -- loteran <axel.valadon@gmail.com>  Mon, 03 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.2.20-1) noble; urgency=medium

  * Stream Guard: screen sharing no longer broadcasts your whole system.
    Discord's Linux client has no way to pick which audio a screen share
    carries. When a share starts it creates its own capture node and links
    *every* playback stream into it — the browser tab you left open, your
    music, the voice call itself — and it keeps relinking, so unlinking by
    hand does not hold. A new bar at the top of the Sonar page picks which
    channels are allowed out: leave it on Game and only the game goes to the
    call, while Media and Chat stay in your headset. The asm-stream-guard
    service enforces the choice on PipeWire graph events rather than on a
    timer, so a stream Discord has just relinked is cut in tens of
    milliseconds instead of on the next poll — the gap during which private
    audio is already on the wire. Sources are matched by the channel they
    play on, not by application name, so anything you move to an allowed
    channel is included automatically and nothing needs to be kept in a
    list.
  * The microphone chain could be fed by the headset's own output — and
    other people heard it. On an Arctis Nova 7 sitting on an iec958-stereo
    profile the headset exposes no capture node of its own, and the
    microphone slot fell back to the *output* sink. That sink's monitor was
    then linked into the microphone EQ, so everything audible on the machine
    — a browser tab, the game — was transmitted as if it were the
    microphone: a video played in a browser went out over a Discord call as
    though the user were speaking it. It came back on every daemon restart,
    which is why it reappeared with each update. The input no longer
    inherits the output's fallback, and the capture link is now refused
    outright when the proposed source is a sink. This is the one input-side
    mistake that is completely inaudible to the person making it.
  * Arctis Nova Pro Omni: the microphone sidetone could not be turned off.
    The command that sets it kept its on/off byte pinned to on, so the
    slider's lowest position was a quiet sidetone rather than silence — and
    it switched itself back on at every reconnect no matter what you chose.
    The slider now reaches a true off, and off is the default. (#161)

 -- loteran <axel.valadon@gmail.com>  Sun, 02 Aug 2026 00:00:00 +0000

arctis-sound-manager (1.2.19-1) noble; urgency=medium

  * Profile fixes now reach you even if you installed ASM months ago. This
    one was silently cancelling out a lot of the work in recent releases. At
    first launch, ASM copied every device profile into your own
    configuration folder — and that copy takes precedence over the packaged
    one, forever, because no update ever refreshed it. So every profile fix
    shipped after your first run was inert for you: new headsets ASM had
    just learned to drive, corrected status byte offsets, fixed EQ commands,
    none of it landed. You would update, see the new version number, and
    keep running the protocol of the release you first installed. If you
    have been reporting a problem that "still isn't fixed" after several
    updates, this is very likely why. The daemon now reconciles that folder
    at every start: a copy identical to the packaged profile is removed, one
    you modified is moved aside to devices-disabled/ and named in the log so
    nothing of yours is destroyed, and a profile for a headset ASM doesn't
    ship is left strictly alone.
  * Arctis Nova 7 / 7P Gen 2, Nova 5, Nova 3 Wireless, GameBuds: the custom
    EQ sliders did nothing at all. Every equaliser frame went out one byte
    off, so the headset read an opcode of zero and discarded the curve
    without a word. Confirmed on hardware: a Nova 7P Gen 2 reported its
    untouched factory preset while a custom curve was set in the app. The
    readback decoder was misreading its answer by one byte too, and both are
    now pinned against real replies from the headset.
  * Arctis Nova Pro Wireless and Nova Pro Wired GameDAC: a custom EQ you
    could see and not hear. The base station drew your curve on its screen
    as you moved the sliders — proof the command was arriving — while the
    sound never changed, because the headset kept applying its Flat preset
    and nothing ever switched away from it. The curve is now selected once
    it has been written. If you never touch these sliders, nothing changes:
    the headset stays neutral behind the Sonar EQ exactly as before.
  * The two equalisers no longer stack. ASM equalises either in software
    (Sonar mode) or in the headset (Custom EQ mode), never both — but only
    the software half of that was enforced. Switching to Sonar left the
    on-device curve applied underneath it, so neither setting meant what it
    said. The hardware equaliser now follows the mode you chose.
  * Pop!_OS and Ubuntu 22.04: ASM would not start at all on a headset with a
    display. The daemon crashed while setting up the OLED — on a version of
    the Pillow imaging library older than the one it assumed — and because
    that happens while the audio pipeline is being built, it took everything
    down with it: no mixer, no EQ, no device settings, not just no screen.
    It now works with the Pillow versions those releases ship, and a display
    failing can no longer stop the rest of ASM from running. (#154)
  * Arctis Nova 3P / 3X Wireless: the Microphone section was missing from
    the Devices page. Nothing was wrong with reading the mic state — the
    headset only announces it when it changes, and if you had not pressed
    mute since starting ASM there was nothing to show, so the whole section
    stayed hidden. With the boom mic unplugged, pressing mute reported
    nothing either, leaving no way at all to make it appear. ASM now asks
    the headset for the mic state at startup instead of waiting to be told.
    (#149)

 -- loteran <axel.valadon@gmail.com>  Thu, 30 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.2.18-1) noble; urgency=medium

  * Custom EQ: your saved curve now reaches the headset at startup. On the
    Nova 7 / 7P Gen 2, Nova 5, Nova 3 Wireless and GameBuds, the curve
    stored in the app was replayed at every start in a format only the Nova
    Pro Wireless understands, so the headset discarded it without a word.
    The custom EQ was effectively inert after each restart and only came
    alive if you happened to move a slider by hand.
  * Arctis Nova 3P / 3X Wireless: the ChatMix dial should now report to the
    app. Turning the wheel produced no USB traffic whatsoever — it was
    acting as a plain local volume knob. On this dongle ChatMix is a mode
    the computer has to switch on, and ASM never did; it does now. (If your
    dial still does nothing after this update, please say so in #149 — this
    one could not be tested on hardware here.)
  * Bluetooth indicator no longer shows a state the headset never sent. On
    the Nova 7 Gen 2, Nova 7P Gen 2 and Nova 5, the connection indicator
    read a byte SteelSeries' own specification marks as unused, so what it
    displayed was padding dressed up as a link state — on the Nova 5, a
    headset that has no Bluetooth at all. The row is gone rather than wrong.
  * Arctis Nova 7 WoW Edition (post-update firmware): battery percentage was
    wildly wrong. That dongle's PID was filed with the first-generation Nova
    7, whose battery is reported on a four-step scale. After its firmware
    update the headset speaks the Gen 2 protocol and reports a real 0-100 %,
    so a battery at 76 % came out as 1900 %. It is now read with the right
    family.
  * asm-cli tools read-hardware-eq — read the equaliser curve back out of
    the headset. For the Nova 7 / 7P Gen 2. When the custom EQ sliders seem
    to do nothing (#146), this tells apart the three cases that look
    identical from the outside: the curve arrived and is stored, the curve
    arrived and the headset ignored it, or nothing reached the headset at
    all. It also prints the raw reply, so a decoding that turns out to be
    off can be corrected from a real report rather than a guess.

 -- loteran <axel.valadon@gmail.com>  Wed, 29 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.2.17-1) noble; urgency=medium

  * Sonar equaliser: delete a point with a keypress, quick-save, and revert.
    From user feedback (#152). Select a point on the EQ curve and press Del
    (or Backspace) to remove it, alongside the existing double-click. The
    preset Save button now overwrites the active preset directly — updating
    a custom preset is one click, no retyping its name — while a new Save
    as… button creates a new one. And a Revert button appears next to Apply
    whenever there are unapplied curve edits, so a set of changes can be
    dropped back to the last-applied state without hunting for the previous
    values.
  * Arctis Nova 3P / 3X Wireless: the microphone mute state now shows in the
    app. Pressing mute did nothing visible, because the headset sends that
    event (and its battery, connection and charging pushes) on a USB
    interface ASM wasn't listening to — a raw HID capture from @rhavinx
    pinned it down. ASM now listens on that interface too, so the Microphone
    section tracks mute live, and battery/connection/charging update the
    moment they change instead of only on the next poll. (ChatMix on the
    dial is still being investigated — on this hardware the wheel doesn't
    report a mix level over USB at all, which is a different problem from
    the mute one.)

 -- loteran <axel.valadon@gmail.com>  Tue, 28 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.2.16-1) noble; urgency=medium

  * Arctis Nova 3P / 3X Wireless: the ChatMix dial and the mic-mute button
    now do something in the app. The new profile shipped in 1.2.14 read both
    of the headset's live events one byte too far, so turning the dial never
    moved the Game/Chat balance — it felt like plain system volume — and
    pressing mute was never reflected anywhere, with the Microphone section
    staying blank. Both are read from the right place now: the dial moves
    the Game/Chat sliders, and the mute state shows in the app. As a side
    effect the profile no longer forces Sonar Game volume down to a sliver
    on start-up. Thanks to @rhavinx, who captured the real hardware traffic
    that pinned it down. Battery, charging and connection state — already
    working — are unchanged.

 -- loteran <axel.valadon@gmail.com>  Mon, 27 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.2.15-1) noble; urgency=medium

  * An update now actually takes effect, instead of waiting for your next
    reboot. A package manager replaces files on disk; it does not touch what
    is already running. ASM went on executing the version it had loaded at
    startup — so someone who updated *because* of a fix still saw the bug,
    and reported it against a version number they were not running. The
    background services are now restarted at the end of the update, on Arch,
    Fedora and Debian alike. The window, which your desktop starts rather
    than the system, notices on its own and offers a restart: "Version X is
    installed — restart ASM to run it". Nothing of the sort appears for
    anyone running from a source checkout.
  * The in-app update no longer insists on an AUR helper on Arch, CachyOS
    and derivatives. It proposed paru -S whatever the origin of the package;
    installed from a repository, a plain pacman -Syu does the job and your
    system's own updater picks it up unprompted. ASM now asks pacman which
    of the two situations it is in.
  * ASM can be installed from a signed binary repository on Arch, CachyOS,
    EndeavourOS and other Arch derivatives — no AUR helper, no compilation,
    and updates arriving with the rest of the system. Packages and database
    are signed with the project's key, and the repository is rebuilt on
    every release.
  * ASM can appear in graphical software centres — Discover, GNOME Software
    and other AppStream front-ends. The file describing the application
    named no package, which is what those tools match on, so the entry
    existed and connected to nothing: a search returned an empty list even
    where the package was perfectly installable. The packaging now ships
    that link, on all three distributions. (Arch users also need packagekit,
    and packagekit-qt6 on KDE — neither is installed by default, and the
    README says so.)

 -- loteran <axel.valadon@gmail.com>  Mon, 27 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.2.14-1) noble; urgency=medium

  * The in-app update no longer reports success while updating nothing, on
    Fedora, Nobara and Ultramarine. ASM checked for its system package by
    name — and on those distributions the project is redistributed under a
    different one, python3-arctis-sound-manager. So the check concluded
    there was no system package at all, fell through, and offered a *pip*
    update to someone running one; and even once found, the upgrade command
    named the package too, so the update ran, announced success, and left
    the version untouched. Both now ask the package manager which package
    owns the running code, whatever a repackager chose to call it. (#146,
    discussion #140)
  * The custom equaliser button is back on the headsets it was written for.
    1.2.11 brought the on-device equaliser to nine models, but the switch
    stayed hidden on most of them: the daemon decided whether a headset had
    one by looking for a single command, and the families using a parametric
    format don't declare one. The Nova 7 Gen 1 and Gen 2, Nova 7P, Nova 5,
    GameBuds and Nova 3 Wireless all lost the control they had just gained —
    only the two families using the older plain-gain format kept it.
    Reported by @camperotactico, who asked whether his Nova 7P Gen 2
    supported the feature at all. It does. (#146)
  * The fourth audio channel now carries your headset's name, like the other
    three. In a system audio picker you saw "*headset* Game", "*headset*
    Chat", "*headset* Media" — and "Sonar Output EQ", which reads as an
    unrelated technical entry rather than the output of the same device.
    Reported by @camperotactico, who counted seven headset-related outputs
    and could not tell which was which. (#146)
  * Bug reports and asm-cli diagnose now name the package the running code
    came from, with its version and vendor. ASM is redistributed by third
    parties whose builds don't necessarily declare the same dependencies —
    one of them ships no dependency list at all, which brings back crashes
    on a missing pactl (#117) and silent spatial audio (#88) on code where
    both were fixed long ago. One line now answers "is this our build?"
    before anyone starts reading code that isn't the code being run.

 -- loteran <axel.valadon@gmail.com>  Mon, 27 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.2.13-1) noble; urgency=medium

  * The Arctis Nova 3P / 3X Wireless now report their state as it changes.
    The profile released yesterday only polled the headset for its status;
    this family relies on the dongle announcing changes instead —
    SteelSeries' own documentation calls the connection event "crucial for
    Nova 3 wireless devices to ensure accurate data retrieval". ASM now
    listens to all five: ChatMix, microphone mute, battery level, connection
    state and charging state. In practice that means the battery and the
    charging indicator actually follow the headset, ChatMix moves with the
    dial, and the mute button is reflected in the app. Found by comparing
    notes with @rhavinx, who had reverse-engineered the same headset from
    USB captures (#149) — his captures caught three frames the documentation
    alone had not led me to.

 -- loteran <axel.valadon@gmail.com>  Sun, 26 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.2.12-1) noble; urgency=medium

  * The Arctis Nova 3P and 3X Wireless have their own profile at last. They
    were sharing one with the *wired* Nova 3 and being driven as if they
    were that model — a different report id, a different transport, and on a
    USB interface whose endpoint is physically too small to carry their
    commands. Which is why several of their controls did nothing, and why
    they had no battery reading at all. Owners now get the battery level and
    powered on/off detection — and with it the automatic audio switching
    that depends on knowing whether the headset is on — plus ChatMix, a
    sidetone with ten steps where the shared profile offered four, the
    volume limiter, the sleep timer, the range/quality switch, and the
    on-device equaliser. One control disappears: the microphone LED
    brightness, which these dongles have no command for — ASM was sending it
    into the void. Huge thanks to @rhavinx (#149), whose hardware listing
    supplied the one detail SteelSeries' protocol documentation does not
    contain.

 -- loteran <axel.valadon@gmail.com>  Sun, 26 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.2.11-1) noble; urgency=medium

  * Your headset's own equaliser is now used, on nine models. Until now the
    custom EQ was applied by the computer, and only ever reached the
    hardware on the Nova Pro Wireless and Wired — on every other model it
    did nothing at all. The curve is now set inside the headset on the Nova
    7 Gen 1 and Gen 2, Nova 7P, Nova 5, Nova 4 and Arctis GameBuds as well.
    That means it follows the headset to a console, a phone or another
    computer, costs no CPU, and stays active even when ASM isn't running.
    Each family speaks a different dialect for this — different opcodes,
    different frame layouts, some needing a pause between writes — all of
    which is now handled per model. Not yet verified on hardware for the
    newly added families: if your equaliser sounds wrong rather than absent,
    please say so in #146.
  * The Nova Pro Omni and Nova Pro Wireless expose their Bluetooth
    preferences: whether Bluetooth comes up with the base station, and what
    an incoming call does to game audio (nothing, lower by 12 dB, or mute).
    Both were previously forced to a fixed value at every start, silently
    undoing whatever you had set from the DAC itself or from SteelSeries GG.
  * The Nova Pro Omni's microphone noise reduction — done inside the base
    station, rather than by a plugin on your computer.
  * ASM now asks the headset what it already has instead of assuming, on the
    Nova 7 Gen 2 family. A headset configured elsewhere — in GG on a
    dual-boot machine, or from its own controls — used to be reset to this
    app's defaults the first time ASM ran. Its own values are now adopted
    for anything you have never set here; anything you have set stays yours.
  * The Noise Cancelling section no longer appears on headsets that don't
    have it. It sat there with controls that could not do anything, which
    reads as a broken app rather than an absent feature. (#146, reported by
    @camperotactico)
  * The mixer's help tooltip is readable again. It rendered as a plain black
    rectangle on dark themes: the app styled every other widget but never
    tooltips, so their text came out dark on dark. Fixes every tooltip in
    the app. (#146)
  * Outputs no longer go missing from the device lists. Two optional
    PipeWire properties were required to list a sink, and one declaring
    neither was dropped without a word — which is how ordinary desktop
    speakers ended up "not in the list". (#146, and the same cause as the
    Bluetooth speakers of #134)
  * The battery reading no longer implies precision the hardware doesn't
    have on the Nova Pro Wireless. It reports nine levels, not a percentage,
    so its readout showed values like 62 % for something measured in steps
    of about twelve points. It now snaps to round numbers. Headsets that do
    measure to the point are untouched.
  * The Nova 5's sidetone slider had a dead zone: its top third sent levels
    the headset has no meaning for.

 -- loteran <axel.valadon@gmail.com>  Sun, 26 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.2.10-1) noble; urgency=medium

  * The Arctis Nova 4 and Nova 4X are now supported. A whole family ASM
    simply did not recognise. You get the battery level, powered on/off
    detection and the audio routing that follows from it, sidetone,
    microphone volume, mute-LED brightness, the volume limiter and the sleep
    timer. Its battery is reported in five steps rather than as a
    percentage, which is how the headset itself works. If ASM detects your
    Nova 4 but no control does anything, please say so in #149 — one
    command's output is all that's needed to finish the job.
  * The Arctis Nova 7X White and the Arctis Nova Pro Wired V2 are now
    recognised. Both speak a protocol ASM already implements and has had
    validated by users; only their product ids were missing, so the headsets
    were simply not detected.
  * The charging indicator no longer disappears when your headset finishes
    charging. The headset reports four charging states — unknown, charging,
    plugged in but not charging, and running on battery — and ASM only
    understood two of them. The other two showed nothing at all, which meant
    the indicator went blank at the two moments you are most likely to look
    at it: once the battery reached full on the cable, and while the headset
    was off. Fixed on the Arctis 7+, Nova 5, and all four Nova 7 families.
    (Arctis 7+ owners: "on battery" was previously indistinguishable from
    "not charging".)
  * ASM no longer asks for USB permissions on every boot. Two users on
    Nobara reported having to click through the "USB device permissions not
    applied" dialog after every restart, with perfectly valid rules
    installed. Their rules were never the problem: a dongle that never
    leaves its port is detected while the machine is still booting, and
    ASM's background service starts right behind it — sometimes before the
    system has finished granting access to the device. That first attempt
    failed, and ASM reported it as missing permissions. Worse, it then gave
    up on the headset entirely and never tried again, so the click was
    genuinely what got the headset working each time. ASM now retries a few
    seconds later, so a boot-time race resolves itself silently while a real
    permissions problem is still reported. (discussion #140, diagnosed
    thanks to @jsuvanto and @DefactoCasual)
  * The Nova 5's sidetone slider no longer has a dead zone. Its top third
    sent levels the headset has no meaning for, so pushing it past roughly
    two-thirds changed nothing.

 -- loteran <axel.valadon@gmail.com>  Sun, 26 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.2.9-1) noble; urgency=medium

  * The Arctis Nova Pro Omni's controls finally work. Its profile was a Nova
    Pro Wireless copy, and the DAC quietly refused almost everything ASM
    sent it: commands went out with the wrong HID report id, so the base
    station dropped them without a word — which is why sidetone, the volume
    limiter and the DAC screen looked dead however you set them. Huge thanks
    to @joorklee, who reverse-engineered the real protocol on hardware (a
    Windows capture of SteelSeries GG driving the DAC, GG's own device
    specification, and Linux writes confirmed by reading the values back off
    the base station) and shared everything in #147. Sidetone, the volume
    limiter, ANC and its level, transparency, mic volume and LED, the OLED
    screen and the auto-off timer now speak the language this DAC actually
    understands, and the headset's battery, charging state and Bluetooth
    status are reported as the device really sends them instead of being
    guessed from a sibling model's layout. The base station also pushes
    changes as they happen, so what you do on the DAC shows up in ASM
    without waiting for the next poll. (#70, #147, protocol by @joorklee)
  * Arctis Nova 7P Gen 2 (1038:2298) is now recognised out of the box.
    (#146, reported by @camperotactico)
  * New Sonar presets show up the day they are published. The check ran at
    most once every 24 hours, so a preset pack released shortly after your
    last check stayed invisible for a full day and reopening the app changed
    nothing. ASM now looks for new presets on every launch.
  * A device you added yourself was ignored when writing the udev rules. The
    documented way to support a headset ASM doesn't know yet is to drop a
    copy of its configuration file into your own configuration folder and
    add the product id there. That copy drove device detection, but the
    bundled file silently won when the rules were generated — so the new
    product id never reached the rules file, with no error to explain why
    nothing happened. Your copy now wins everywhere. (#146)
  * sudo asm-cli udev write-rules looked in root's home instead of yours,
    which put your own device files out of reach entirely — the same
    symptom, from the other end. The command reads the invoking user's
    folder when elevated (and still never writes anything into your home as
    root). It doesn't need sudo in the first place: it asks for the password
    itself when it needs one. (#146)
  * asm-cli diagnose now warns when it is run as root. A dump taken with
    sudo describes root's session — no audio server, no settings, no device
    files — which looks exactly like a badly broken installation and sends
    troubleshooting down the wrong path. (#146)
  * An unreadable device folder no longer aborts the whole udev rules
    generation.

 -- loteran <axel.valadon@gmail.com>  Sun, 26 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.2.8-1) noble; urgency=medium

  * The Output channel now has a device selector in the Channels tab, like
    Game, Chat and Media. Its destination could previously only be changed
    from the Settings page. Both places stay in sync, and your headset
    appears in the list. (#139)
  * The headset can now be selected as the Output channel's device. It was
    deliberately hidden from the external-output list, on the assumption
    that it already had its own routing. That prevented a legitimate setup:
    sending the Output channel to the headset gives you a second path to it
    with its own equaliser — typically flat — and no spatial processing,
    which is what you want for video editing or music production without
    swapping EQ profiles every time. The headset now appears in the list
    alongside your other outputs; ASM still never picks it automatically, so
    nothing changes unless you choose it. (#139, requested by @Malev0)
  * ASM could vanish from the app launcher after an update. Its launcher
    entry is installed by the package, and setup skipped writing its own
    copy whenever that one was present — so when a package update left the
    system file missing, nothing restored it and the app disappeared from
    the menu even though it still ran fine. ASM now always writes its own
    entry, which takes precedence over the packaged one without duplicating
    it, and removes it again when you uninstall. (reported on Discord by
    @林莫英, Fedora/COPR)
  * An app you moved to another channel no longer drifts back. When the
    headset came online, ASM moved every stream sitting on one of its
    channels onto the default one — a safeguard for apps left stranded on a
    channel that no longer exists. It also moved apps you had deliberately
    placed elsewhere, and the media router, whose job is to notice your
    manual moves, recorded that as your choice: your pick was overwritten on
    every restart. Apps you placed yourself are now left where you put them.
  * The media router no longer stays dead after you quit and reopen ASM.
    Quitting from the tray stops every ASM service, as intended; reopening
    brought back everything except the router, so ASM looked healthy while
    the part that remembers where you move your apps was silently missing.
    It is restarted automatically — unless you disabled it yourself.
  * Changing the Output device from the Settings page is now reflected in
    the Channels tab (and vice versa), instead of showing a stale selection
    until a device was plugged or unplugged.
  * Your chosen external output could be silently reverted. The app applied
    your selection, but the background service resolved that setting on its
    own and could land on a different device — then rewrite the
    configuration to match, undoing your choice on every startup and every
    repair. Both now read the same saved setting.

 -- loteran <axel.valadon@gmail.com>  Wed, 22 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.2.7-1) noble; urgency=medium

  * Arctis_Game / Arctis_Chat / Arctis_Media could appear duplicated in the
    mixer, with one copy stuck silent, after a daemon crash or a forceful
    systemctl restart. Each virtual channel is a pw-loopback process kept
    alive across brief hiccups with node.linger=true; when the daemon itself
    died without going through a clean shutdown, those processes survived it
    as orphans the next daemon instance had no record of, so it started
    three brand new ones with the exact same names right alongside the old
    ones — PipeWire accepts the duplicates without complaint. The daemon now
    sweeps for and terminates any leftover loopback claiming a channel's
    name before starting its own, so a restart always comes back to a clean
    set of three, however the previous instance went down.
  * Apps routed to the "Output" channel could play into silence. The last
    hop of that channel — its equaliser output into the external sink (HDMI,
    TV, speakers) — was the only one in ASM that belonged to nobody: it was
    not covered by the link ownership applied to Game and Media, nor by the
    watchdog that re-establishes the Chat and surround outputs. Every
    filter-chain restart tore that link down and nothing ever put it back,
    so an application pinned to the Output channel kept playing into a dead
    end, with no sound and no error message. The watchdog now enforces this
    hop too, following the external output you selected.
  * Releasing the headset no longer leaves USB interfaces in limbo. ASM
    claims every USB interface it uses when it takes the device over, but on
    teardown it released only one of them before handing the device back to
    the kernel driver — which cannot take back an interface still held by
    another process. Should that happen while switching between two
    different headset models, the affected interfaces ended up owned by
    neither ASM nor the kernel until the device was replugged. Claim and
    release now cover the same set.
  * A channel could stay silent for minutes after the headset was plugged
    back in. The watchdog's anti-flapping protection — which deliberately
    backs off from a channel that keeps failing — tracked channels by name,
    and that name outlives the process behind it. A channel that had been
    struggling shortly before you switched the headset off was therefore
    still being skipped when it came back, for up to five minutes, even
    though its process was brand new. The protection now resets whenever the
    headset session is rebuilt, while continuing to back off exactly as
    before within a session.
  * Apps pinned to a channel stopped following the headset after a replug.
    Reconnecting the headset rebuilds all three virtual channels, which
    drops every application you had pinned to them back onto the system
    default output. Only the Chat channel was restoring those pins, so pins
    on Game and Media were silently lost — after a replug or a channel
    restart, browsers, games and video players simply stopped following the
    headset. Pins are now replayed on every path that rebuilds a channel.
  * Brief audio dropouts when the audio graph changed underneath ASM. Each
    watchdog pass resolved its PipeWire connections from a single snapshot
    taken at the start of the cycle; when ports moved in between — a
    WirePlumber restart, an audio reconfiguration — the links it tried to
    make pointed at things that no longer existed, and part or all of a
    channel went unlinked until the next cycle five seconds later. A failed
    pass now retries immediately against a fresh snapshot, and the three
    connections that previously had no recovery path at all (surround,
    physical output, microphone) escalate to a filter-chain repair if they
    stay broken.
  * The "Output" channel disappeared from application output pickers once it
    had an active equaliser. Its sink was declared as an internal node in
    the stereo case, unlike every other code path that builds it, so
    applications could no longer see it and a saved routing pin to that
    channel could not be restored. It is now a regular output everywhere,
    whatever its channel count.

 -- loteran <axel.valadon@gmail.com>  Tue, 21 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.2.6-1) noble; urgency=medium

  * New tray "Maintenance" submenu to restart the audio engine or ASM daemon
    without a terminal. There was previously no discoverable way to recover
    from a stuck filter-chain or a config that only takes effect after a
    restart — the daemon isn't a systemd/dinit unit a user would know to
    look for ("how do I restart the asm daemon? there's no systemctl
    service", asked on Discord). The tray now offers "Restart audio engine"
    (filter-chain only — the common case for applying a regenerated config),
    "Restart ASM" (the daemon and filter-chain, plus the video router if it
    was running), and "Regenerate audio configs" (force-repairs stale
    Sonar/HeSuVi filter-chain configs, then restarts filter-chain). All
    three go exclusively through the existing service_control abstraction
    (so they work identically on systemd and dinit), run off the UI thread
    so the tray never freezes, never touch pipewire itself, and report
    success or failure via a tray notification. The submenu greys out with
    an explanation if no service manager (systemctl/dinitctl) is present.
  * Virtual surround could still oversaturate after upgrading to 1.2.5. That
    release added a fast-lookahead limiter to the HeSuVi chain to fix
    clipping on hot HRIRs, but the fix only applied to *newly generated*
    configs — anyone who already had a sink-virtual-surround-7.1-hesuvi.conf
    from an earlier version kept their old, limiter-less config forever,
    since none of the daemon's staleness checks recognised it as out of
    date. Generated filter-chain configs now carry a version marker, and the
    daemon regenerates the surround config whenever its marker is missing or
    behind the current version — so an update that changes what that config
    contains actually reaches existing installs, starting with this limiter.
    Your Immersion and Distance settings are preserved across the repair,
    and your equaliser configs are left untouched. (reported on Discord by
    @craciu25_YT)

 -- loteran <axel.valadon@gmail.com>  Tue, 21 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.2.5-1) noble; urgency=medium

  * Virtual surround could clip ("oversaturate") on loud passages with hot
    HRIRs (e.g. Nahimic 3). The Immersion slider applies a broadband boost
    (up to +12 dB, +6 dB at the default 50%) to all eight channels *before*
    the HRTF convolution, and each stereo output is the sum of four
    convolved channels — with no headroom stage, loud content pushed peaks
    past 0 dBFS and clipped. A fast-lookahead limiter (LADSPA
    fast_lookahead_limiter_1913, from swh-plugins — the same package already
    used for the Distance reverb) is now inserted on the surround output; it
    tames only the peaks that would clip and leaves quieter content
    untouched, so hot profiles stop oversaturating regardless of the
    Immersion setting. The plugin is staged into ~/.ladspa like the reverb
    so it also loads on the host under Distrobox, and if swh-plugins is
    unavailable the chain falls back to the previous behaviour with no
    limiter. (reported on Discord by @craciu25_YT)

 -- loteran <axel.valadon@gmail.com>  Mon, 20 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.2.4-1) noble; urgency=medium

  * Spatial Audio stayed silent inside Distrobox even after the 1.2.3 fix.
    On atomic hosts (Bazzite, etc.) where ASM runs in a container, the
    HeSuVi surround filter includes a LADSPA reverb plugin (plate_1423, from
    swh-plugins, powering the Distance effect). ASM's daemon scans the
    container — which has the plugin — but the PipeWire filter-chain that
    loads the config runs on the *host*, which does not, so the plugin was
    written by bare name and failed to load there. Because a single failing
    node takes the whole filter-chain module down, the surround node never
    appeared and Game/Media were routed at a sink that did not exist —
    silent. ASM now stages the plugin into ~/.ladspa (shared between
    container and host) and references it by absolute path so the host can
    always load it; existing configs are regenerated to pick this up. The
    same fix covers the Smart Volume and noise-gate plugins, which hit the
    identical container/host split. (#100, reported by @ninjapinja2)

 -- loteran <axel.valadon@gmail.com>  Sun, 19 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.2.3-1) noble; urgency=medium

  * Audio no longer defaults to the headset when it comes online. Older
    versions forced the Arctis Game channel as the default output on
    startup; that behaviour later moved into the daemon but ended up gated
    behind a "Redirect audio on connect" option that defaulted to off, so on
    a fresh setup nothing claimed the default sink and audio stayed on the
    TV/HDMI. In a Steam Game Mode session this meant every app had to be
    moved onto the Game channel by hand. The headset is now selected as the
    default output automatically as soon as it is powered on — and only
    while it is on, so it never routes you to a dead sink. Turn "Redirect
    audio on connect" off if you prefer a non-headset default; that choice
    now sticks. (#135, reported by @zany130)
  * Spatial Audio no longer goes silent when no HRIR profile was chosen. The
    HeSuVi surround filter reads its impulse response from a WAV that was
    only written once you explicitly picked an HRIR profile. With none
    chosen the file was missing, the surround node failed to load, and
    enabling Spatial Audio routed Game/Media at a node that did not exist —
    dead silence until the app was closed. A sensible HRIR profile now ships
    as the default and is put in place automatically, so Spatial Audio works
    out of the box; you can still switch to any other profile live. As a
    safety net, if the surround node ever cannot load, Game/Media fall back
    to the headset's normal output instead of going silent. (#100, reported
    by @ninjapinja2)

 -- loteran <axel.valadon@gmail.com>  Sat, 18 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.2.2-1) noble; urgency=medium

  * Bluetooth speakers and headphones can now be selected as an output
    device. The output pickers — per-channel routing on the home page, the
    tray "Output routing" menu, the Sonar output override, and the
    external-output setting — only listed ALSA sinks, so Bluetooth devices
    (bluez_output.*) never appeared. They are now listed everywhere and
    identified by their stable node name, so they stay selectable even on
    setups where the device exposes no node.nick. (#134, requested by
    @akio4800)
  * Game / Chat / Media volume jumped back to 100% on its own. The virtual
    channel sinks are pw-loopback processes; every time ASM recreated one —
    after a PipeWire socket change, an EQ-mode switch, a config
    regeneration, or the watchdog reviving a crashed process — the fresh
    sink came up at the PipeWire default of 100%, silently discarding the
    level you had set. Channel volumes are now persisted and re-asserted by
    the daemon after each recreation (retried until the sink reappears), so
    a level you set stays put instead of drifting back to full. (#134,
    reported by @akio4800)

 -- loteran <axel.valadon@gmail.com>  Fri, 17 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.2.1-1) noble; urgency=medium

  * No sound at all after the headset was switched off and back on. Powering
    the headset off destroys its physical PipeWire sink; powering it back on
    recreates it as a new node. ASM's filter-chain nodes run with
    node.autoconnect = false — by design, WirePlumber never links them, ASM
    owns those links — but nothing was watching the *last* hop, from the
    EQ/surround chain to the physical output. So that link was never
    restored, the headset sink stayed suspended, and audio was gone until
    both filter-chain and arctis-manager were restarted by hand. The
    loopback watchdog now enforces the final links (Chat EQ and HeSuVi
    surround → physical output) on every tick, so sound comes back on its
    own when the headset returns.
  * Installing from the AUR failed with bsdtar: Failed to set default locale
    and a ModuleNotFoundError on asm-setup. Two independent packaging bugs.
    The HRIR asset files for the Spatial Sound Card "Shanghai" presets
    carried a non-ASCII character in their filename, which bsdtar silently
    skips when the build environment has no UTF-8 locale; they are now named
    in plain ASCII (ssc_hu), and a settings migration keeps working for
    anyone who had selected one. Separately, the PKGBUILD installed
    dbus-next and pulsectl from PyPI during package() — into a site-packages
    whose Python version depended on whichever interpreter uv happened to
    pick — and used uv run to execute build scripts, which could create a
    venv on a different Python than the system one. Both are gone: those two
    libraries are now declared as proper package dependencies, and the build
    scripts run on the system Python. (#132, reported by @eapzzz)
  * Streams were shuffled between headset channels when the headset was off.
    Follow-up to the routing change in 1.2.0: when the headset powers off,
    streams parked on its virtual sinks are moved to the default output —
    but if the default output *is* one of the headset's own channels, there
    is nowhere useful to go, and moving them just undid the user's own
    channel assignments. ASM now leaves them alone in that case.

 -- loteran <axel.valadon@gmail.com>  Tue, 14 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.2.0-1) noble; urgency=medium

  * Headset reported as offline while it was powered on. ASM detached the
    kernel driver (usbhid) from the DAC's HID interface but never claimed
    the interface. An unclaimed interface stays free, so the kernel was
    liable to rebind usbhid behind our back, after which every USB transfer
    failed with EIO (errno 5) — the daemon then looped on USB error: [Errno
    5] forever with no recovery, leaving the device status frozen on its
    initial values (headset shown as offline with 0% battery, even though
    audio kept working). ASM now claims each interface after detaching it,
    and recovers from EIO by re-acquiring the interface, falling back to a
    full device reset if that fails.
  * Battery icon stayed visible on a powered-off headset (Nova Pro Wireless,
    Nova Elite, Nova Pro Omni, Arctis Pro Wireless). The power-off detection
    added in 1.1.95 only matched the off power status used by the Nova
    7/9/1/5 families, while these devices report offline. Power status
    handling is now centralised in a shared helper that understands both
    vocabularies. (follow-up to #124)
  * Apps could not be pinned to the Chat or Game channel when the default
    sink was not the Arctis. The router force-moved any stream sitting on an
    Arctis virtual sink back to the default sink, and did so before loading
    the saved routing overrides — so an explicit user choice (e.g. Discord
    pinned to Chat while the TV is the default output) was silently ignored
    and undone every couple of seconds. Arctis_Media was missing from that
    list, which is why only the Media channel appeared to work. Saved
    overrides are now always honoured, whatever the default sink; streams
    are only pulled back to the default sink when the headset is actually
    powered off, and such a move is transient — it never overwrites the
    user's choice, so the app returns to its channel when the headset comes
    back.

 -- loteran <axel.valadon@gmail.com>  Tue, 14 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.1.100-1) noble; urgency=medium

  * Choose which microphone feeds the Sonar Micro EQ. A new "Sonar Micro EQ
    input" setting lets you keep the default (your Arctis microphone), pick
    a specific input device, or select "Manual" so ASM stops enforcing the
    mic routing and leaves whatever you wired up in a patchbay like qpwgraph
    in place. (#131)
  * Tray icon color setting. The system-tray icon can now follow your
    system's light/dark theme automatically, or be forced to white or black,
    for better contrast on panels where it was hard to see. (#130)
  * Spatial Audio OFF is no longer silent on some headsets. On outputs whose
    ports are exposed without channel names (the Nova Pro Wireless pro-audio
    output uses AUX0/AUX1 instead of FL/FR), turning Spatial Audio off left
    the channel with no audio because ASM matched ports by name and found
    none. It now falls back to positional matching (front-left → first port,
    front-right → second), so sound keeps flowing with Spatial Audio off.
    (#129)

 -- loteran <axel.valadon@gmail.com>  Mon, 13 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.1.99-1) noble; urgency=medium

  * Share and import color themes, just like presets. Any theme you create
    in the theme editor can now be shared with other ASM users: copy a
    self-contained share link, save it to a file, or publish it to the
    community theme gallery. Themes can be imported from a shared link, a
    file, or by browsing the community — either from the theme editor or
    from the Import/Export buttons on the Settings page.

 -- loteran <axel.valadon@gmail.com>  Sun, 12 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.1.98-1) noble; urgency=medium

  * Audio now stays on your speakers/TV after waking from sleep when the
    headset is off. With the headset powered off — so sound is meant to play
    through your TV or external speakers — resuming from sleep could bounce
    media apps (VLC, Spotify, browsers…) back onto the headset's Media
    output, and the only fix was to toggle the headset off and on. On resume
    ASM now re-asserts the correct routing based on whether the headset is
    actually powered on, so audio stays where it belongs. (#128)

 -- loteran <axel.valadon@gmail.com>  Sun, 12 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.1.97-1) noble; urgency=medium

  * The Sonar Micro EQ no longer steals your microphone. Adjusting any Sonar
    Micro EQ setting used to detach the EQ from your headset mic and
    re-attach it to a different input device (a second microphone), forcing
    you to fix the routing by hand after every change. ASM now takes the mic
    capture out of WirePlumber's routing and owns and continuously
    re-asserts the headset-mic → Micro EQ link, so it can no longer be
    stolen — while leaving any other app that uses your mic untouched.
    (#127)

 -- loteran <axel.valadon@gmail.com>  Sat, 11 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.1.96-1) noble; urgency=medium

  * The runtime dependency self-healing checker now knows about pw-loopback
    (which implements the virtual Game/Chat/Media sinks), so a missing one
    is detected and can be offered for install per distro. (#123)

 -- loteran <axel.valadon@gmail.com>  Sat, 11 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.1.95-1) noble; urgency=medium

  * Changing the EQ or toggling Spatial Audio no longer restarts the audio
    engine. Adjusting EQ gains, the macro sliders or the boost — and
    switching Spatial Audio on or off — is now applied live to the running
    filter-chain instead of restarting it. On PipeWire 1.6.7 that restart
    could crash the filter-chain and briefly cut Game/Media audio or leave
    Spatial Audio silent; these changes now take effect instantly with no
    dropout. Changes that genuinely alter the graph (adding/removing an EQ
    band, switching preset, changing the HeSuVi immersion/distance) still
    restart as before. (#100, #88)
  * Fixed a rare daemon crash-loop that produced random SIGSEGVs. The daemon
    spawned its helper processes (pw-dump, pw-loopback, pw-metadata,
    systemctl…) with a fork() that, while the daemon was talking to the
    headset over USB in another thread, could corrupt memory and crash it
    with nonsensical errors (seen as a 10-crash restart loop). Every helper
    spawn now uses a fork-free posix_spawn path. (#123)
  * The tray battery percentage now disappears when the headset is powered
    off. The wireless adapter keeps reporting a battery level even when the
    headset is off, so the tray number used to stay on screen; it now hides
    once the headset powers down. (#124)
  * Added a Distrobox troubleshooting section to the README for silent
    Spatial Audio / audio cut-outs inside containers (host-vs-container
    PipeWire version skew, and the filter-chain 1.6.7 crash on restart).
    (#100)

 -- loteran <axel.valadon@gmail.com>  Sat, 11 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.1.94-1) noble; urgency=medium

  * "Bring audio to headset" button. One click moves any application that
    ended up on the wrong output device (HDMI, S/PDIF, another sound card)
    back to your headset — handy when an app is silently playing to a device
    you're not wearing. Available on the Home page and in the system tray.
  * Audio now follows your "redirect on disconnect" device when you quit
    ASM, not only when the headset powers off. Closing ASM could previously
    leave sound on whatever output PipeWire happened to pick; it now
    switches to your configured device instantly.
  * Phantom "Multiple ASM installations detected". On usr-merge distros
    (modern Arch/Fedora/Ubuntu) /bin is a symlink to /usr/bin, so a single
    asm-daemon was counted twice and the app wrongly hid the "Update now"
    button and warned about a duplicate install. Distinct real paths are now
    counted, so a normal single install is no longer flagged. (#114)
  * The tray battery percentage now hides immediately when you turn it off.
    Toggling "Battery % in system tray" off previously left the number on
    screen until the next status change or an ASM restart; it now updates as
    soon as the setting changes. (#119)
  * Settings toggles are now aligned. The Launch at startup and Telemetry
    rows sat slightly to the left of the other setting rows, so their
    switches didn't line up with the General and Device toggles.
  * The runtime dependency self-healing checker now knows about pw-link and
    wireplumber, so a missing one is detected and can be offered for install
    per distro.

 -- loteran <axel.valadon@gmail.com>  Fri, 10 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.1.92-1) noble; urgency=medium

  * Battery percentage in the system tray. The headset battery level is
    shown as its own full-size item next to the ASM tray icon. Can be turned
    off with the new Battery % in system tray toggle in Settings → General.
    (#119)
  * 24-hour / 12-hour clock toggle for the OLED. A new option under the Time
    element in the DAC tab switches the on-screen clock between 24-hour
    (14:05) and 12-hour (2:05 PM).
  * "Re-enable EQ" button for safe mode. When the audio filter-chain
    crash-loop safety net has disabled the EQ, a banner on the Sonar page
    now lets you re-enable it in one click (previously there was no in-app
    way out). See the new Troubleshooting section in the README. (#88)
  * Clean installs no longer crash on startup with pactl not found.
    pulseaudio-utils (which provides pactl, used at launch and for audio
    routing) is now a hard dependency of the .deb/RPM, and a missing pactl
    degrades gracefully instead of crashing. (#117)
  * The EQ point editor is no longer transparent. The popup that shows a
    band's Gain / Frequency / Q was see-through, so the EQ curve behind it
    made the values hard to read; it now has a solid background. (#120)
  * Safe mode clears itself once the crash is fixed. Previously, if the
    filter-chain crash-loop safety net disabled the EQ, it stayed off until
    manually reset — so a fixed crash (e.g. after an update) left you stuck
    with flat audio. ASM now automatically re-enables the EQ after an ASM or
    PipeWire version change and re-tests the audio graph. (#88)
  * A single bad line break in a community translation no longer hides an
    entire language. A stray newline in one string made the whole
    translation file unparseable, so a fully translated language (e.g.
    Turkish) silently disappeared from the language menu. Such files are now
    repaired automatically.

 -- loteran <axel.valadon@gmail.com>  Thu, 09 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.1.91-1) noble; urgency=medium

  * Passthrough toggle on the Output tab. You can now send audio to the
    external output device exactly as-is, bypassing the Output EQ profile.
    When enabled, the EQ curve and macro sliders are greyed out since they
    no longer affect anything. (#111)
  * Two Electron apps that both report as "Chromium" (e.g. Vesktop and Pear
    Desktop) would not keep their channels across restarts. The GUI saved
    the manual routing override under the app's display name instead of the
    same name+binary key the router reads, so the choice never persisted
    deterministically. The GUI now stores overrides under the exact key the
    router uses. (#108)
  * Virtual-channel loopbacks could be stolen by another output device. When
    a second USB DAC (or any competing sink) was present, WirePlumber kept
    re-routing the Game/Chat/Media loopbacks to it while the watchdog fought
    back — an unwinnable, hardware-specific tug-of-war. The loopbacks are
    now taken out of WirePlumber's routing entirely (node.autoconnect=false)
    and ASM owns their link to the Sonar EQ directly, so no other device can
    ever steal them regardless of what is plugged in. (#100)
  * A missing per-channel EQ config no longer causes an endless "target
    absent" loop with no audio. When a sonar-*-eq.conf was simply missing,
    the watchdog kept health-checking a perfectly healthy filter-chain,
    which could never bring the node back. It now regenerates the missing
    config and reloads the filter-chain first, only treating it as a
    crash-loop when there is genuinely nothing to regenerate. (#111, #88)
  * The Output channel is now regenerated reliably — on startup, on device
    attach, and on every global apply — instead of only when its EQ tab is
    opened, so sonar-output-eq.conf no longer goes stale or missing. It
    keeps applying the Sonar EQ and adapts its channel count (2.0–7.1) to
    the external sink's real capability. (#111)
  * Bug reports now surface the filter-chain safe-mode state and which EQ
    configs are present or missing. A stuck safe mode (which suppresses EQ
    config regeneration) is now visible at a glance instead of being
    indistinguishable from configs a user moved away by hand. (#88)

 -- loteran <axel.valadon@gmail.com>  Wed, 08 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.1.90-1) noble; urgency=medium

  * Arctis Nova Elite is now recognised when the PC is on the GameHub's rear
    USB ports 2/3 — in that wiring the base station enumerates with product
    id 0x2246 instead of 0x2244, which ASM did not know about. (#110)
  * The external output device list refreshes when you open the settings
    panel — a device plugged in after ASM started now appears without
    restarting the app, instead of being stuck with the list captured at
    launch. (#106)
  * Rhythmic crackle / growing xruns on Arctis Nova Pro Wireless. The
    headset's USB playback endpoint is synchronous (no clock feedback), so
    the loopback clock drifts against the free-running USB clock and the
    default ALSA headroom is too small to absorb it. ASM now raises
    api.alsa.headroom on this device automatically (via a WirePlumber
    drop-in it only rewrites when it changes), eliminating the crackle out
    of the box. (#105)
  * AI Noise Cancellation (ClearCast / rnnoise) and the other filter-chain
    plugins could fail to load on Fedora. ASM now writes the plugin's
    absolute path into the generated filter-chain config so dlopen()
    succeeds even when the systemd user unit does not inherit LADSPA_PATH
    (/usr/lib64/ladspa). Under Distrobox / Flatpak, where the filter-chain
    runs on the host, ASM keeps using the bare plugin name for system-wide
    plugins so the host resolves them itself. (#88)
  * The Sonar EQ could be disabled at boot when the filter-chain had simply
    not started yet. The startup health check now starts the filter-chain
    and waits to see whether it stays up before deciding anything; it only
    falls back to flat/safe mode if the service genuinely keeps crashing.
    (#88)
  * Two apps with the same generic name (e.g. two "Chromium" clients like
    Vesktop and a music app) could not be routed to different channels —
    they shared a single routing override. Overrides for generically-named
    apps are now keyed by application plus binary, so each app keeps its own
    channel. (#108)
  * Rapid WirePlumber sink flips no longer poison the saved routing. A
    detected move is only stored once its target has stayed stable for a
    moment, so a transient flip that is immediately reverted never
    overwrites your chosen channel. (#102)
  * The OLED could flood the log with "Resource busy" warnings when its USB
    interface was held by another process or a container passthrough.
    Repeated failures now suspend OLED updates for 60 seconds with a single
    warning instead of retrying every frame. (#100)
  * A pyudev monitor thread leaked on each USB monitor cycle, and the
    weather widget could be blocked by CDN security filters — the monitor
    observer is now stopped cleanly and the weather request sends a proper
    User-Agent.

 -- loteran <axel.valadon@gmail.com>  Tue, 07 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.1.89-1) noble; urgency=medium

  * ASM could crash when the "update available" dialog was closed quickly —
    the "Copy command" button scheduled a 2-second timer to reset its label,
    and if the dialog was dismissed before it fired the timer touched an
    already-deleted Qt button, raising libshiboken: Internal C++ object
    already deleted. Every such timer is now bound to its widget's lifetime
    and cancelled when the dialog closes. (#100)
  * Endless loopback relink/recreate loop on WirePlumber 0.5.x (Nova Elite,
    Distrobox / Steam Deck). WirePlumber's restore-stream could re-pin a
    virtual-channel loopback (Game / Chat / Media) to the physical headset
    output on every recreate; the watchdog then fought it in a tight loop,
    restarting the filter-chain over and over. The loopbacks now opt out of
    target restoration (state.restore-target=false), and the bug report
    surfaces any stored Arctis targets so a stale one can be spotted and
    cleared. (#100)
  * LADSPA plugin detection now works on read-only-rootfs distros (SteamOS /
    Steam Deck). ASM now searches LADSPA_PATH and ~/.ladspa — the only place
    a user can add plugins when /usr is immutable — alongside the system
    directories, so it no longer reports a plugin as missing when the
    filter-chain can actually load it. The blocking dependency check also
    verifies the Smart Volume (sc4m_1916) and mic noise-gate (gate_1410)
    plugins, not just the reverb one, since all three ship in the same
    package and a single missing .so can crash the whole filter-chain. (#88)

 -- loteran <axel.valadon@gmail.com>  Fri, 03 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.1.88-1) noble; urgency=medium

  * Apps did not stay in their assigned channel on WirePlumber 0.5.x (Nova
    Pro Wireless) — the Game and Chat pw-loopback playback nodes only set
    node.target, whose string-name fallback in WirePlumber 0.5.x is
    unreliable and sometimes linked the loopback to the physical ALSA output
    instead of the Sonar EQ node. They now set target.object (the reliable
    object lookup honoured first by WirePlumber ≥ 0.5) while keeping
    node.target for 0.4.x compatibility. (#102)
  * The routing override daemon did not restart after being killed —
    arctis-video-router.service used Restart=on-failure, which systemd never
    triggers when a process is terminated by SIGTERM (treated as a clean
    exit), so the router stayed dead and channel assignments were no longer
    enforced. The router units now use Restart=always. (#102)
  * WirePlumber-induced sink flips were saved as manual overrides — when a
    stream bounced between the virtual channels, video_router recorded each
    move as a user choice and overwrote routing_overrides.json with the last
    random target. A debounce now ignores moves that repeat too rapidly
    (WirePlumber-induced) so the user's actual channel choice is preserved.
    (#102)
  * Hardened the PipeWire filter-chain against crash-loops (Steam Deck /
    SteamOS). ASM now detects a filter-chain that systemd is restart-looping
    at session start — not only when ASM itself restarts it — and falls back
    to a stable flat-audio safe mode that persists across sessions. LADSPA
    effect nodes (Smart Volume, mic gate / noise suppression) are now
    skipped with a warning when their plugin is missing, instead of risking
    a filter-chain segfault. The loopback watchdog no longer recreates
    orphan loopbacks endlessly when their target EQ node is absent.
    Investigation of the underlying SteamOS segfault is still ongoing. (#88)
  * Reduced audio churn when changing Spatial Audio / EQ settings (Arctis
    Nova Elite). A single Sonar control change (or preset load) no longer
    triggers several filter-chain restarts in a row (previously 3–4, up to
    ~10 on a preset load), and an unchanged configuration now skips the
    restart entirely. Loopback and EQ nodes also advertise target.object so
    WirePlumber 0.5.x links them to the Sonar EQ reliably instead of the
    physical output. A full Spatial Audio fix is pending user diagnostics.
    (#100, #102)

 -- loteran <axel.valadon@gmail.com>  Thu, 02 Jul 2026 00:00:00 +0000

arctis-sound-manager (1.1.87-1) noble; urgency=medium

  * Sonar devices (e.g. Arctis Nova Elite) went silent when Spatial Audio
    was enabled — with surround on, the loopback watchdog mistook a
    single-cycle transient (the Sonar EQ → HeSuVi surround chain rebuilding)
    for a mis-routed loopback and killed/recreated the pw-loopback, which
    churned the graph and fed a self-sustaining loop that muted the channel
    (and spammed the OLED with Resource busy). The watchdog now waits for
    the mismatch to persist before acting, and corrects a genuine mislink
    with a non-destructive pw-metadata relink instead of tearing the
    loopback down. (#100)

 -- loteran <axel.valadon@gmail.com>  Tue, 30 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.86-1) noble; urgency=medium

  * "Redirect Audio on Disconnect" did nothing even with a device selected
    (especially USB outputs) — the settings dropdown only saved your choice
    when the selected *index changed*, so picking the device that was
    already displayed (or re-selecting it) saved nothing, and the daemon
    kept reading an empty value. On top of that, when the stored value
    didn't match any current device the dropdown silently showed the first
    device as if it were selected, so the option *looked* configured while
    nothing was actually persisted. Dropdowns now persist on every pick
    (including re-selecting the current item) and show an unset state
    instead of faking a selection (#97).
  * Fedora: the ClearCast / rnnoise noise-suppression plugin couldn't be
    installed — the install instructions (system-deps dialog, RPM %post,
    README) pointed at the uriesk/noise-suppression-for-voice COPR + package
    noise-suppression-for-voice, but that COPR only ships a source package,
    so dnf install failed with "matches only source packages". Switched to
    the lkiesow/noise-suppression-for-voice COPR and the
    ladspa-realtime-noise-suppression-plugin binary package (verified on
    Fedora 44).

 -- loteran <axel.valadon@gmail.com>  Sun, 28 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.85-1) noble; urgency=medium

  * Arctis Nova Elite "Sage & Gold" colorway (PID 0x2270) is now recognised
    out of the box (#101).
  * Arctis Nova Elite crashed the daemon at startup — the command interface
    was declared as interface 0 instead of the real interface 3, so the
    daemon could not find it and exited on launch. It now targets the
    correct interface, and the daemon falls back to HID SET_REPORT (control
    transfer) instead of crashing whenever a unit's command interface is
    missing (#100).
  * Microphone volume (and other device settings) could reset to the minimum
    on launch — when a saved setting value was missing while initialising
    the headset, ASM pushed 0 to the device, dropping the mic to 1/10
    instead of your saved level. Missing values now fall back to the device
    profile's default.
  * asm-setup skipped the udev rules when run from a source checkout — it
    now falls back to the in-tree CLI module when the asm-cli binary isn't
    on PATH, so the udev rules and desktop entry get written instead of
    being silently skipped.

 -- loteran <axel.valadon@gmail.com>  Sun, 28 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.84-1) noble; urgency=medium

  * Wrong version reported in the GUI footer and bug reports — on installs
    that share a single site-packages directory (typical on Arch/CachyOS,
    and inside Distrobox), the version lookup matched the *first* enumerated
    distribution rather than the one that actually ships ASM, so the footer
    and Report a bug output showed nonsense versions like 0.1 or 1.9.0 for a
    1.1.83 install. The version is now resolved by checking which
    distribution genuinely owns the running arctis_sound_manager package
    files, while still preferring the copy that is actually imported
    (resolves a stale ~/.local shadow of the system install).
  * Hardened virtual-sink routing against PipeWire socket changes (Steam
    Game Mode / Distrobox) — pw-loopback processes are now spawned with the
    resolved host PipeWire socket pinned in their environment (falling back
    to /run/user/<uid>/pipewire-0), and the loopback watchdog detects when
    the active PipeWire socket changes (e.g. a Desktop ↔ Game Mode session
    switch under Gamescope) and recreates all loopbacks so they rebind to
    the new socket instead of going silent on the stale one. (#90)

 -- loteran <axel.valadon@gmail.com>  Fri, 26 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.83-1) noble; urgency=medium

  * Package uninstallable on Ubuntu 24.04 (and any Debian/Ubuntu) from the
    PPA — arctis-sound-manager declared a hard Depends:
    noise-suppression-for-voice, but that package (the rnnoise LADSPA
    plugin) is not in the Debian or Ubuntu archives nor the PPA, so apt
    refused to install ASM at all (Depends: noise-suppression-for-voice but
    it is not installable). It is now a Recommends:, matching the binary
    .deb build, so ASM installs cleanly; the optional ClearCast mic
    suppression plugin is still offered and built from source on demand by
    ASM's dependency installer. (#96)
  * Dependency installer wrongly tried apt install
    noise-suppression-for-voice on Debian — the package does not exist on
    Debian either, so the install would have failed. Debian now builds the
    LADSPA plugin from source, like Ubuntu and its derivatives. (#96)

 -- loteran <axel.valadon@gmail.com>  Thu, 25 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.82-1) noble; urgency=medium

  * Audio cuts in and out in Steam Game Mode / Gamescope (Bazzite, SteamOS)
    — under Gamescope, WirePlumber keeps reshuffling routing, so the
    loopback watchdog saw a permanent mislink and recreated the Arctis_Game
    / Arctis_Chat / Arctis_Media loopbacks every few seconds, each
    recreation causing a brief cut, looping forever. The watchdog now has an
    anti-flapping guard: when a channel is recreated 3 times within 30 s it
    enters a cooldown (60 s, doubling up to 5 min) during which it is left
    alone — a stable loopback, even if temporarily mislinked, is far less
    disruptive than constant cuts. (#90)
  * Filter-chain crash-loop left audio permanently broken (Steam Deck /
    SteamOS) — when the PipeWire filter-chain SIGSEGVs on startup (e.g. a
    LADSPA plugin present in a Distrobox container but missing on the host),
    systemd restarted it endlessly, so the virtual sinks kept appearing and
    disappearing. ASM now detects the crash-loop, moves its EQ configs aside
    ("safe mode") and restarts once more to give flat-but-stable audio
    instead of perpetual cuts. (#88)
  * Phantom "update available" that never goes away (Fedora and similar) — a
    leftover pip install --user copy in ~/.local shadowed the distro package
    on sys.path, so ASM read that stale copy's old version and nagged about
    an update that was already installed. ASM now reports the version of the
    package actually running, detects a shadowing pip install and shows a
    clear "multiple installations detected" message instead, and the dnf
    update command uses --refresh so a real new version is never hidden by
    stale COPR metadata.
  * Bug reports now capture the filter-chain coredump backtrace and the
    generated filter-chain.conf.d/ configs (to pinpoint segfaults), whether
    the session is Steam Game Mode / Gamescope, and a summary of recent
    loopback watchdog activity.

 -- loteran <axel.valadon@gmail.com>  Wed, 24 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.81-1) noble; urgency=medium

  * YouTube and browser audio silent when ASM is running — sonar-output-eq
    was generated with media.class = Audio/Sink/Internal even in bypass
    mode, making it invisible to normal apps. WirePlumber had memorised
    Firefox → effect_input.sonar-output-eq in its stream-properties
    database, then refused to connect any new stream to that node (Internal
    nodes cannot be targeted by PulseAudio-compat clients), leaving Firefox
    suspended with no sink. The node is now Audio/Sink with priority.session
    = 1 so apps can connect to it while it is never auto-selected as the
    default output. Same fix applied to the active 8-channel path.
  * Audio routing broken after daemon restart without the system tray — the
    arctis-manager systemd unit now declares Wants=filter-chain.service and
    After=filter-chain.service. Previously, restarting the daemon alone left
    the filter-chain stopped, causing all Sonar EQ loopbacks (sonar-game-eq,
    sonar-chat-eq, sonar-media-eq) to become orphaned and be recreated every
    15 s until WirePlumber degraded.
  * System tray forced Arctis_Game as default sink unconditionally on
    startup — the GUI start() method called pactl set-default-sink
    Arctis_Game regardless of headset state. When the headset was off,
    Firefox and any other app opening after ASM started were routed to a
    dead sink. Default-sink redirection is now owned exclusively by the
    daemon (redirect_audio_on_connect / on_disconnect logic).

 -- loteran <axel.valadon@gmail.com>  Sat, 20 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.80-1) noble; urgency=medium

  * 3 new Sonar EQ presets from SteelSeries GG 113.0.0 — *007 First Light*,
    *Subnautica 2* and *Virtua Fighter 5 R.E.V.O World Stage* are now
    bundled for the Game channel.
  * Output (HDMI) channel silent after profile switch or device change — the
    sonar-output-eq filter-chain config hardcoded audio.channels = 8 and a
    stale node.target pointing to a non-existent hdmi-surround71 device. ASM
    now queries PipeWire at config-write time to detect the active
    HDMI/DisplayPort sink and adapts channel count and position
    automatically (2.0 stereo, 5.1 surround, 7.1 surround). HDMI sinks are
    preferred over S/PDIF in auto-detection.
  * Flat EQ for presets in SteelSeries GG 113+ format — GG 113.0.0 changed
    the preset export format, wrapping all settings under a data key.
    Affected bundled presets (*Forza Horizon 6*, *Deep Rock Galactic: Rogue
    Core*, *Lineage 2*) were silently rendered as flat/bypass. The parser
    now handles both formats.

 -- loteran <axel.valadon@gmail.com>  Sat, 20 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.79-1) noble; urgency=medium

  * pacman mirror 404 auto-retry in deps dialog — when installing a missing
    dependency via the system deps dialog on Arch/CachyOS, a desynchronized
    mirror (HTTP 404 on the package file) caused the install to fail
    silently. The dialog now captures pacman output, detects the mirror-sync
    error pattern, and automatically retries with pacman -Syy to force a
    database refresh before running the original install command. A guard
    flag prevents infinite retry loops.

 -- loteran <axel.valadon@gmail.com>  Fri, 19 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.78-1) noble; urgency=medium

  * 3 new Sonar EQ presets from SteelSeries GG 113.0.0 — *Pure*, *Precision*
    and *Immersion* from the official SteelSeries GG 113.0.0 preset list are
    now bundled for the Game, Chat and Media channels.
  * Per-channel EQ apply no longer interrupts the sibling channel — applying
    a preset or sliders on the Game channel used to restart both the Game
    and Media loopbacks (and vice-versa), causing a ~1.5 s audio cut on the
    channel that was not touched. The apply-worker now calls the new
    RecreateLoopbackSingle D-Bus method to restart only the loopback for the
    channel that was actually edited. Chat remains unaffected as before.
    (issue #85 — thanks @cookiekiller!)
  * **weather_* settings no longer spam [ERROR] Unknown general setting
    configuration** — weather_enabled, weather_location, weather_lat,
    weather_lon, weather_units and weather_city_display are stored in
    GeneralSettings but had no matching ConfigSetting entry, so every
    SetSetting D-Bus call hit the unknown-key branch. They are now handled
    as a dedicated special case before the whitelist lookup. (issue #85)
  * Routing override for Discord now matches application.process.binary as
    fallback — reapply_routing_overrides previously matched only on
    application.name; Discord's Electron renderer sets this to "WEBRTC
    VoiceEngine" rather than "Discord". The matcher now falls back to
    application.process.binary when application.name does not match, so a
    "Discord": "Arctis_Chat" entry in routing_overrides.json is respected on
    first connection and after every filter-chain restart. (issue #85)

 -- loteran <axel.valadon@gmail.com>  Fri, 19 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.77-1) noble; urgency=medium

  * Loopback watchdog recreated loopbacks every 5 s, breaking Discord
    routing — _loopback_watchdog treated a None link target (loopback not
    yet wired by WirePlumber) as a mislink and immediately recreated the
    loopback. This caused Discord's audio streams to lose their target sink
    every 5–10 seconds and repeatedly fall back to the system default,
    ignoring any routing_overrides entries. A grace period of 3 consecutive
    ticks (15 s) is now applied before acting on a None link: transient
    PipeWire graph states are ignored, while genuinely orphaned loopbacks
    (stuck unlinked for > 15 s) are still recovered. (#84)

 -- loteran <axel.valadon@gmail.com>  Thu, 18 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.76-1) noble; urgency=medium

  * Update banner persisted after upgrading via package manager — the
    "update available" banner on the Home page was never hidden when a
    re-check found no newer version: on_update_available returned early on
    an empty result without calling _update_banner.hide(). The banner would
    therefore remain visible for the rest of the session even after the user
    updated externally (apt/pacman/dnf). Now the banner is explicitly hidden
    when the check confirms the installed version is current. Additionally,
    the manual "Check for updates" button in the Settings page now also
    drives the Home page banner (via DevicePage.sig_update_result), so
    clicking "Check for updates" after an external upgrade instantly clears
    the stale notification without requiring a restart.

 -- loteran <axel.valadon@gmail.com>  Wed, 17 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.75-1) noble; urgency=medium

  * Arctis Nova Pro Omni — battery display showed values above 1000% — the
    Omni firmware reports headset and GameDAC battery as a direct 0–100
    percentage value, but nova_pro_omni.yaml had perc_max: 8 (inherited from
    the Nova Pro Wireless which uses a 0–8 discrete scale). The formula raw
    × 100 ÷ 8 turned a 92% charge into 1150% and a 98% charge into 1225%.
    Setting perc_max: 100 for both headset_battery_charge and
    charge_slot_battery_charge corrects the display.

 -- loteran <axel.valadon@gmail.com>  Tue, 16 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.74-1) noble; urgency=medium

  * Headset name on Channels tab — the connected headset model name is now
    displayed above the status pills. If the headset is offline, the last
    known name is shown in gray.
  * Ko-fi support button in sidebar — a compact Ko-fi button and "You like
    it ? Support me !" label appear at the bottom of the sidebar, below the
    ASM logo.
  * ASM logo in sidebar — the logo is displayed above the support section
    and links to the GitHub repository when clicked.
  * Help moved into main navigation — the Help button is now part of the
    primary sidebar nav (below Settings) instead of floating at the bottom.
  * EQ mode switch button inline — the "Switch to …" button on the Equalizer
    tab is now compact and placed on the same line as the current mode
    label.
  * "Check for updates" moved to top of Settings — the button is now in the
    header row alongside the language selector.
  * Sidebar icons slightly reduced — icon size reduced from 50 px to 44 px
    for a more compact sidebar.
  * Chat channel silent after filter-chain restart — the loopback watchdog
    now also recreates a loopback when its playback node is completely
    unlinked (orphaned), not only when it is linked to the wrong target.
    Previously, Arctis_Chat_sink_out could end up with no PipeWire link at
    all after a filter-chain restart, causing permanent silence on the Chat
    channel until a manual service restart.
  * Discord loses Chat routing after filter-chain restart —
    recreate_loopbacks_game_media now skips recreating the Chat loopback
    (keeping Arctis_Chat alive in Discord's device list), and
    reapply_routing_overrides restores saved PA stream routing after any
    Chat recreation.

 -- loteran <axel.valadon@gmail.com>  Sat, 13 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.73-1) noble; urgency=medium

  * USB autosuspend not disabled for already-connected dongles — udevadm
    trigger does not retroactively apply sysfs attributes to USB interfaces
    that are already active when the udev rule is installed or updated.
    Devices plugged in before the update kept autosuspend enabled, causing
    [Errno 19] No such device disconnects every 2–3 minutes and the GUI to
    never show the headset as Connected. After udevadm trigger, ASM now also
    writes on directly to /sys/bus/usb/devices/*/power/control for every
    connected SteelSeries device via sysfs, taking effect immediately
    without requiring a replug. (#80)
  * Switching an app back to Output (HDMI) channel silenced audio — clicking
    G/C/M in the mixer called pw-metadata 0 default.configured.audio.sink to
    change the PipeWire global default sink. This caused the
    effect_input.sonar-output-eq filter-chain node to re-target its output
    to the newly chosen virtual sink instead of HDMI; switching back to O
    routed the stream into the EQ chain whose physical output had been
    silently redirected. The global default must never be changed for
    per-app routing — pulse.sink_input_move() alone is sufficient and is now
    the only call made.
  * NameError: TEXT_SECONDARY crash after successful preset import via link
    — _set_status() in the import dialog used the bare constant
    TEXT_SECONDARY instead of _theme.c("TEXT_SECONDARY"), crashing the
    dialog after every successful link import at the status update step.
  * "Invalid or unsupported link: 'data'" when importing an ASM JSON preset
    file — ASM-exported JSON files have the format {"parametricEQ": {…}}
    with no top-level "data" key, but _finalize_import() unconditionally
    accessed info["data"], raising KeyError: 'data' which was caught and
    displayed as the link error. The file importer now detects the format
    and wraps raw preset data automatically.

 -- loteran <axel.valadon@gmail.com>  Sat, 13 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.72-1) noble; urgency=medium

  * Line Out controls for Nova Pro Wireless and Nova Elite — the physical
    3.5 mm LINE OUT jack on the GameDAC Gen 2 station is now configurable
    directly from the ASM DAC tab. A new Station Output section appears
    above the OLED options and is automatically hidden for headsets without
    a station DAC. The section contains:
  * Line Out Mode button group: *Speaker* (amplified output for passive
    speakers) or *Stream* (digital controlled output).
  * Left / Right / Aux volume sliders (0–100 %) — visible only when mode is
    set to *Stream*, using a single multi-value HID command [0x47, left,
    right, aux] per adjustment.
  * OLED display support for Nova Elite — the GameDAC Gen 2 station screen
    (custom time, battery, EQ preset, weather, etc.) is now activated for
    the Nova Elite. Parameters match the Nova Pro Wireless (interface 4,
    report_id 0x06, wvalue 0x0300, 128×64 px) as both use the same hardware;
    a USB capture from a Nova Elite user will confirm if adjustments are
    needed.
  * Nova Elite settings invisible in GUI — all 10 settings using type:
    discrete_map (ANC mode, EQ preset, screensaver, line out, Bluetooth
    auto-mute, home screen view/options) were silently skipped by the config
    loader because discrete_map is not a valid SettingType. All corrected to
    button_group, which is the standard type used by every other YAML for
    this pattern.
  * Nova Elite YAML contained speculative protocol values — the command
    prefix (0x06), command interface ([3, 0]), status request (0x06b0), and
    response mappings were copied from the Nova Pro Wireless without
    hardware verification. All values have been rewritten from a real USB
    capture (elegos/Linux-Arctis-Manager upstream v2.4.1): prefix 0x01,
    interface [0, 3], 46-command device_init, 23 response mapping entries,
    correct headset_battery_charge range (0–100 instead of 0–8).
  * OledManager activated on Nova Elite with wrong parameters — adding
    gamedac to the Nova Elite status representation triggered OledManager
    using Nova Pro Wireless defaults (wrong interface/wvalue), which could
    send frames to the wrong USB endpoint. OledManager now requires an
    explicit oled: section in the device YAML to activate.
  * $XDG_CONFIG_HOME not respected — all user-data paths in constants.py
    (settings, lang, device configs, systemd/dinit service folders) and the
    theme storage path in theme.py were hardcoded to ~/.config. They now
    check $XDG_CONFIG_HOME first, matching the XDG Base Directory spec and
    fixing config resolution for NixOS users and anyone with a custom home
    layout.
  * Saving a theme could crash the GUI — save_user_theme() called mkdir and
    open with no error handling; a PermissionError (e.g. read-only home on
    NixOS, NFS mount) propagated uncaught into the Qt slot and terminated
    the GUI. I/O errors are now caught, logged, and surfaced to the user as
    a QMessageBox.critical dialog instead.
  * Theme load errors silently swallowed at startup — the module-level
    reload_user_themes() call was wrapped in except Exception: pass, hiding
    any startup failure. It now logs a WARNING with a full traceback so
    problems are visible in journalctl.
  * Nix flake eval error after v1.1.69 — the lib.optionalAttrs { … } // { …
    } expression in module.nix was missing enclosing parentheses, causing
    the attribute-set merge (//) to be parsed as a top-level expression and
    the flake to fail evaluation entirely. (#79, PR #83 — thanks @Svenum!)
  * lib.mkForce required for LADSPA_PATH on filter-chain — nixpkgs' pipewire
    module already sets LADSPA_PATH on the filter-chain service, silently
    overriding the plain assignment added in v1.1.69. The value is now set
    with lib.mkForce to guarantee it takes effect. (#79, PR #83 — thanks
    @Svenum!)
  * GUI crash on Nix with ModuleNotFoundError: theme_editor_page —
    theme_editor_page.py (Theme Editor page) was never committed to git. Any
    Nix build — which fetches only tracked files — therefore produced a
    package missing this module, crashing asm-gui at startup with an
    ImportError. File is now committed. (#79)
  * Multi-value update_sequence support —
    CoreEngine._resolve_update_sequence() now resolves 'settings.<name>'
    tokens in addition to 'value' and raw integers, enabling a single slider
    change to send a complete multi-parameter HID command referencing the
    current values of sibling settings.
  * Conditional widget visibility — QSettingsWidget gains
    _apply_conditional_visibility(), evaluated after each panel refresh and
    each user interaction. Settings with visible_when: {key: value} are
    automatically shown or hidden in real time based on other settings in
    the same section (e.g. stream volume sliders appear only when Line Out
    Mode is *Stream*).

 -- loteran <axel.valadon@gmail.com>  Sat, 13 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.71-1) noble; urgency=medium

  * Arctis Nova Pro Wireless X (PID 0x225d) — third hardware variant of the
    Nova Pro Wireless X, identified in the upstream
    elegos/Linux-Arctis-Manager project. Uses the same protocol as the
    existing 0x12e0/0x12e5 variants; all features (EQ, ANC, mic, surround)
    work identically.

 -- loteran <axel.valadon@gmail.com>  Sat, 13 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.70-1) noble; urgency=medium

  * Device shown as "No device detected" in GUI for always-connected
    headsets — devices without an online_status block (e.g. Arctis Nova 3
    family) produced an empty D-Bus status dict even after the daemon had
    successfully initialised them, causing the GUI to display "No device
    detected" indefinitely. A sentinel headset_power_status: online is now
    injected when _device_ready is True and no status representation is
    defined. (#80)
  * "Failed to find sink Arctis_Game" error at startup — redirect_audio was
    called immediately after spawning the pw-loopback processes, before
    PipeWire had registered the virtual sink. The method now retries up to 5
    times (× 0.4 s) before giving up, eliminating the race condition on
    normal hardware. The final failure is now logged as WARNING instead of
    ERROR since the sink may legitimately be absent if loopback creation
    failed upstream. (#80)

 -- loteran <axel.valadon@gmail.com>  Sat, 13 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.69-1) noble; urgency=medium

  * Game and Media channels silent on NixOS module installs — two root
    causes addressed:
  * HeSuVi surround graph crashes when plate_1423 (swh-plugins) is absent —
    on distros without swh-plugins installed, the Distance reverb LADSPA
    node was generated unconditionally, causing filter-chain to exit
    immediately. The Distance effect is now silently disabled when
    plate_1423.so is not found in the standard LADSPA directories, giving
    working surround without the reverb rather than a crash-loop. (#79)

 -- loteran <axel.valadon@gmail.com>  Sat, 13 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.68-1) noble; urgency=medium

  * asm-setup crashed on NixOS with FileNotFoundError:
    update-desktop-database — NixOS and other immutable distros don't ship
    this tool. The call already used check=False but subprocess.Popen raises
    FileNotFoundError before the return-code check when the binary is
    absent. The call is now wrapped in try/except FileNotFoundError and
    silently skipped. (#79)
  * HRIR file from Nix store (3.6 KB stub) passed validation and was never
    replaced — the Nix store copy has a valid RIFF header in its first 4
    bytes but is far too short to be a usable 7.1 impulse response, causing
    Game and Media channels to be silent. _hrir_valid() now requires the
    file to exceed 10 KB in addition to having a RIFF header. asm-setup also
    tries the bundled hrir_assets/ profiles first (no network required)
    before downloading from GitHub. (#79)

 -- loteran <axel.valadon@gmail.com>  Fri, 12 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.67-1) noble; urgency=medium

  * Microphone monitor source selected instead of real mic — on some setups
    PipeWire exposes a monitor source before the real capture source,
    causing ASM to route apps to the monitor loopback instead of the
    physical microphone. The physical-source lookup now filters out
    device.class = monitor entries. (#80)
  * Mic audio bypassed Sonar EQ — applications could connect directly to the
    ALSA source and skip the sonar-micro-eq filter chain. ASM now sets
    priority.session = 1010 on the Sonar virtual source and explicitly sets
    it as the default PulseAudio source at startup, so apps land on the EQ
    pipeline by default.
  * D-Bus status returned {} when device was connected but status bytes
    unresolved — if the device was ready but device_status was None, the GUI
    showed "No device detected" even though the headset was online. The
    D-Bus GetStatus method now synthesises an online sentinel from
    online_status.online_value in that case.
  * USB autosuspend disconnected dongle every 2–3 minutes — the generated
    udev rules now include ATTR{power/control}="on" for all supported
    devices, preventing the kernel from suspending the USB dongle. (#80)
  * Arctis Pro Wireless not detected — wrong response byte mapping — the
    YAML starts_with values matched the request bytes (0x41aa, 0x40aa)
    instead of the real 32-byte HID response. Hardware capture confirmed
    byte[0] = 0x04 = online, byte[0] = 0x02 = offline, byte[1] = battery
    (0–4). Both mapping entries are corrected. (#81)
  * Arctis Pro Wireless — audio sinks and mic not found — the device uses
    PID 0x1290 for HID but 0x1294 for the ALSA audio card.
    _discover_physical_nodes searched only the HID PID, so sinks and source
    fell back to vendor-only matching. The fix searches all PIDs listed in
    product_ids. (#81)

 -- loteran <axel.valadon@gmail.com>  Fri, 12 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.66-1) noble; urgency=medium

  * HRIR selection silently failed on NixOS (and any read-only source) —
    apply_hrir_choice used shutil.copy2 which preserves source file
    permissions and mtime. Since HRIR WAVs live in the Nix store (read-only,
    epoch timestamp), the copied hrir.wav was also read-only; any subsequent
    profile selection in Settings → Spatial Audio would fail silently and
    the convolver would load an invalid file, leaving the Game and Media
    channels silent while Chat (which bypasses the convolver) still worked.
    Fixed by unlinking the destination before copying and using shutil.copy
    (no metadata). (#79)
  * Uninstaller failed on Bazzite / immutable distros when run via curl |
    bash — the Distrobox delegation path resolved SCRIPT_DIR from
    BASH_SOURCE[0], which is stdin when piped through curl. The local
    scripts/distrobox/uninstall.sh was never found and the script exited
    with an error. Now fetches both _common.sh and distrobox/uninstall.sh to
    a temporary directory and delegates from there when the local path is
    unavailable.
  * Added a dedicated NixOS installation section to the README covering both
    flake and classic (non-flake) paths, with a prominent warning that
    Settings → Spatial Audio must be opened on first launch to select an
    HRIR profile — without this step the Game and Media channels are silent.

 -- loteran <axel.valadon@gmail.com>  Fri, 12 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.65-1) noble; urgency=medium

  * OLED splash screen persisted over custom display on devices without a
    live PipeWire session — the refresh loop slept for the full 5 s
    REFRESH_INTERVAL even when the 3 s splash had already expired, leaving a
    ~2 s gap where the device firmware reclaimed the OLED and showed its
    native UI alongside ASM's splash content. The loop now wakes immediately
    at splash expiry so the first custom-display frame is pushed without
    delay. (#76)
  * No interrupt OUT endpoint warning flooded the journal every 2 s — for
    devices without an interrupt OUT endpoint on their command interface
    (e.g. Arctis 1 Wireless), ASM correctly falls back to HID SET_REPORT but
    was logging a WARNING on every status poll. The warning is now emitted
    once per device attach; subsequent occurrences are downgraded to DEBUG.
    The flag is reset on teardown so the warning reappears on reconnect.
    (#74)
  * recreate_loopbacks storm when filter-chain.service crashed repeatedly —
    if the SteelSeries Sonar filter-chain service crashed and restarted
    every few seconds (common in Distrobox), each pw-loopback exit triggered
    a D-Bus RecreateLoopbacks call, causing a rapid stop/start cycle with no
    net benefit. Calls are now debounced to at most once per 5 s; legitimate
    Sonar ↔ simple mode switches are unaffected. (#74)

 -- loteran <axel.valadon@gmail.com>  Wed, 10 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.64-1) noble; urgency=medium

  * Multi-theme support — ASM now ships 5 built-in colour themes
    (SteelSeries, Dark, Light, Ocean, Forest). The active theme is persisted
    in settings and can be switched live from the device page without
    restarting the application; every page, dialog and tray menu follows the
    change immediately.
  * Enhanced bug report diagnostics — PipeWire / container runtime — the
    automatic bug report now collects the data needed to diagnose
    audio-routing failures in Distrobox and other container environments:
    $PIPEWIRE_RUNTIME_DIR, $PULSE_SERVER, container type (Distrobox /
    Flatpak / Snap / Docker / native), status of pipewire, pipewire-pulse,
    wireplumber and filter-chain user services, Arctis-filtered PipeWire
    nodes from pw-dump (with pactl fallback), PipeWire sources, and the last
    journal entries for pipewire and filter-chain. A missing or empty
    Arctis-nodes section in a report is now a direct indicator that PipeWire
    cannot see the device — eliminating the back-and-forth follow-up that
    issue #74 required.

 -- loteran <axel.valadon@gmail.com>  Wed, 10 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.63-1) noble; urgency=medium

  * Arctis Nova Pro Wired — OLED screen never updated and the daemon spammed
    OLED USB error: [Errno 110] Operation timed out — the GameDAC Gen 2
    firmware validates the HID SET_REPORT wValue strictly, but ASM sent
    report id 0 in its low byte, so the base station rejected every OLED
    transfer. The wValue is now built as (report_type << 8) | report_id
    (0x0306 for image frames, 0x0206 for brightness/return-to-UI), matching
    the protocol proven by working third-party tools. (#76)
  * Arctis Nova Pro Wired — headset not detected after boot/login until
    audio activity (e.g. joining a call) woke the device — a device already
    plugged in at startup fires no udev add event, so a single failed
    initial scan was never retried. The daemon now re-scans periodically
    until the device is fully configured instead of waiting for a hotplug or
    USB wake event. (#76)
  * Arctis Nova Pro Wired — audio near-inaudible unless volume was cranked
    to ~95% — control-transfer device commands carried the same incorrect
    wValue, so the high-gain initialisation never reached the GameDAC.
    Commands now embed the correct report id in the wValue for devices that
    require it, opt-in per device so the Nova 7 family and others are
    unaffected. (#76)

 -- loteran <axel.valadon@gmail.com>  Tue, 09 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.62-1) noble; urgency=medium

  * Font rendering on Bazzite/Linux — all text displayed as blocks — Qt's
    QSS parser does not support the CSS Level 4 system-ui keyword; it
    treated it as a literal font name, found nothing, and fell back to a
    font rendering all glyphs as tofu squares. Replaced with sans-serif,
    which Qt resolves correctly via fontconfig on all Linux distributions.

 -- loteran <axel.valadon@gmail.com>  Tue, 09 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.61-1) noble; urgency=medium

  * Automatic Sonar preset sync — ASM now downloads new SteelSeries Sonar
    presets automatically at startup (once per 24 h). A lists all official
    presets; the new fetches it, detects missing presets, and downloads them
    silently in background to .
  * 3 new Sonar game presets: Forza Horizon 6, Lineage 2, Deep Rock
    Galactic: Rogue Core.
  * GitHub Action — auto-regenerates whenever preset files are pushed to or
    .
  * GPL-3.0 licence headers — added missing headers to all 26 files in and ;
    corrected inline format in .
  * Preset file naming — removed 52 duplicate preset files using the old
    separator convention; the canonical variant is kept in all cases.

 -- loteran <axel.valadon@gmail.com>  Mon, 08 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.60-1) noble; urgency=medium

  * Fedora COPR install failed with a python3-dbus-next file conflict — the
    RPM bundled the dbus_next module, which collides with Fedora's own
    python3-dbus-next package (shipped since F40). ASM now bundles dbus-next
    only on distros whose repos don't provide it, and depends on the system
    package otherwise: Fedora ≥ 40 use python3-dbus-next, older Fedora still
    bundle, and the Debian/Ubuntu build auto-detects availability per
    series. (#73)

 -- loteran <axel.valadon@gmail.com>  Mon, 08 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.59-1) noble; urgency=medium

  * Arctis Nova Pro Omni: gain and mic sidetone now work — re-analysing the
    USB capture by opcode showed the Omni uses opcode 0x18 for sidetone (not
    0x39, which it ignores) and shifted gain values (low=0x00/high=0x01
    instead of 0x01/0x02). The device profile is corrected accordingly.
    (#70)
  * Arctis Nova Pro Omni: OLED screen support — the OLED driver is now
    parameterised per device (HID interface, report id, SET_REPORT wValue,
    dimensions) instead of being hard-coded for the Nova Pro Wireless. The
    Omni's screen is driven on interface 3 with report id 0x01 / wValue
    0x0200, which also stops the OLED Resource busy errors it was logging.
    The Nova Pro Wireless path is unchanged.

 -- loteran <axel.valadon@gmail.com>  Sun, 07 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.58-1) noble; urgency=medium

  * Arctis Nova Pro Omni controls had no effect — a real Windows USB capture
    of SteelSeries GG driving the Omni (firmware 1.32.0) revealed its HID
    control commands lead with report id 0x01, not 0x06 (Nova Pro Wireless)
    nor 0x07 (previously inferred from third-party OLED drivers). The device
    profile now leads every command with 0x01 and polls status with 0x01b0;
    the per-setting opcodes are byte-for-byte identical to the Nova Pro
    Wireless. Gain, mic, sidetone, EQ, ANC and the other controls should now
    take effect on the Omni. (#70)

 -- loteran <axel.valadon@gmail.com>  Sat, 06 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.57-1) noble; urgency=medium

  * OLED weather (and all custom-display content) could vanish after the DAC
    re-enumerated — the Arctis Nova Pro Wireless re-enumerates on the USB
    bus at boot, wake and replug. The daemon overwrote its libusb handle
    without releasing the previous one, so the stale handle kept the
    interface claimed and every later transfer failed with EBUSY (Resource
    busy), blanking the custom OLED display and blocking device commands.
    The handle is now fully released (dispose_resources) before re-claiming
    on same-device re-enumeration.
  * "Show city" weather toggle on the DAC tab could not be turned off —
    oled_show_weather_city had no matching configuration entry, so the D-Bus
    SetSetting call was rejected and the toggle snapped back to on. Added
    the missing entry.
  * Vertical OLED scroll no longer triggers when the content essentially
    fits — the layout height was over-counted (separator double-count plus
    excess weather padding); the natural height now mirrors the real render
    and a small scroll deadzone was added, so a near-full screen stays still
    instead of jittering.
  * OLED EQ-mode badge — the Sonar / Custom-EQ indicator next to the clock
    is now a bold "S" / "C" without the surrounding box.
  * Per-channel output dropdown — the default (follow-system) option is now
    labelled "Headset" instead of "Default".
  * Reverse-engineering tooling — a Windows USB capture script and a
    SteelSeries capture parser under scripts/reverse-engineering/ to help
    decode opcodes for new DACs (Nova Pro Omni).

 -- loteran <axel.valadon@gmail.com>  Sat, 06 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.56-1) noble; urgency=medium

  * Arctis Nova Pro Omni controls — the Omni (0x2290) now has its own device
    profile targeting the correct USB layout: control interface 3 (the
    64-byte HID endpoint) with HID SET_REPORT transport. In 1.1.55 it reused
    the Nova Pro Wireless profile (interface 4 with an interrupt-OUT
    endpoint the Omni does not expose), so the UI appeared but the controls
    had no effect. DAC command opcodes are still assumed identical to the
    Nova Pro Wireless, pending confirmation.

 -- loteran <axel.valadon@gmail.com>  Sat, 06 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.55-1) noble; urgency=medium

  * Arctis Nova Pro Omni support — added product ID 0x2290 to the Arctis
    Nova Pro Wireless device profile. Audio routing (Game/Chat/Media mixer,
    HeSuVi spatial surround, Sonar EQ) and HID controls are enabled by
    reusing the Nova Pro Wireless DAC protocol. The status protocol is
    assumed identical and not yet confirmed by a USB capture, so some
    reported status values may be inaccurate until verified.

 -- loteran <axel.valadon@gmail.com>  Sat, 06 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.54-1) noble; urgency=medium

  * Arctis GameBuds / GameBuds X support — initial device support for the
    Arctis GameBuds (PS5/PC, 0x230a) and GameBuds X for Xbox (0x2317) via
    their 2.4 GHz USB dongle. Supported controls: mic volume, sidetone
    (Off/Low/Medium/High), noise cancelling mode (Off/Transparency/ANC),
    ANC/transparency level, volume limiter, wear sense, and auto power-off
    (up to 90 min). Protocol reverse-engineered from a USB capture; battery
    level and connection status are not yet available (status protocol
    unknown).

 -- loteran <axel.valadon@gmail.com>  Wed, 03 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.53-1) noble; urgency=medium

  * Left-click the tray icon to open the window — a single left-click on the
    Arctis Sound Manager system-tray icon now opens the main window
    (launching it the first time, raising and focusing it afterwards).
    Previously the window could only be reached through the tray's
    right-click context menu. Right-click still shows the context menu.

 -- loteran <axel.valadon@gmail.com>  Tue, 02 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.52-1) noble; urgency=medium

  * Microphone filter-chain crashed PipeWire when ClearCast AI noise
    cancellation was enabled (#69) — the rnnoise LADSPA plugin
    (librnnoise_ladspa) aborts when it is fed buffers at a sample rate it
    was not built for, taking down the whole filter-chain service (pipewire
    -c filter-chain.conf) and leaving the system with no audio until reboot.
    The mic filter-chain is now pinned to 48 kHz — the rate rnnoise expects
    — so the plugin always receives valid buffers.
  * Periodic ~1 s microphone dropouts in apps using echo cancellation (#68)
    — Discord/Teams/Steam WebRTC echo cancellation drifted against the
    virtual mic source's clock and reset roughly once per second, silencing
    the mic for a split second at a steady cadence. Pinning the mic
    filter-chain to 48 kHz and locking its quantum (node.lock-quantum)
    removes the resampling and clock drift, so app-side echo cancellation
    can stay enabled without stuttering.

 -- loteran <axel.valadon@gmail.com>  Tue, 02 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.51-1) noble; urgency=medium

  * Arctis 7+ reported as offline while actually connected — the
    power-status parser only recognised a single "online" byte (0x02), but
    the Arctis 7+ firmware reports several online sub-states (0x00, 0x02,
    0x03). When the headset was in any of the unmatched states it was
    treated as powered off, so online detection and audio redirection
    failed. The parser now enumerates all online states explicitly via
    int_str_mapping (thanks @Michsior14 — #67).
  * Bumped pygments to 2.20.0 (fixes a low-severity ReDoS advisory in the
    GUID regex) and pytest to 9.0.3 (dev dependency).

 -- loteran <axel.valadon@gmail.com>  Tue, 02 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.50-1) noble; urgency=medium

  * Arctis Nova 5X (PID 0x2255) support — the 0x2255 variant is now declared
    in the device YAML, so it is detected and managed like the other Nova
    5/5X models. Its udev rule is generated automatically at build time.
  * Unmapped PIDs are surfaced in red in the README device table — any
    Product ID reported by telemetry but not yet declared in a device YAML
    is now listed automatically in red, so it can be triaged and promoted
    into a YAML. The list self-cleans: a PID drops out once it lands in a
    YAML. The device table also gained an lsusb -d 1038: snippet so users
    can find their own Product ID.

 -- loteran <axel.valadon@gmail.com>  Tue, 02 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.49-1) noble; urgency=medium

  * RNNoise mic noise-suppression dependency failed to install on Ubuntu
    (#65) — the plugin is not packaged for Ubuntu or its derivatives (Linux
    Mint, Pop!_OS, elementary, KDE neon), yet ASM suggested an apt package
    that has no candidate there. Those distros now build the LADSPA plugin
    from source in one click (Install / Copy cmd), and the dependency is no
    longer treated as blocking — the rest of ASM works without it. Debian
    keeps the apt package; Fedora and Arch are unchanged. The "Copy cmd"
    button also now preserves command quoting correctly.
  * On the DAC OLED, the EQ-mode badge (S = Sonar, C = Custom EQ) is now
    shown to the right of the clock instead of on its own line.

 -- loteran <axel.valadon@gmail.com>  Mon, 01 Jun 2026 00:00:00 +0000

arctis-sound-manager (1.1.48-1) noble; urgency=medium

  * Microphone Background / Impact noise reduction could not be turned off —
    same Qt.CheckState truthiness bug as the Spatial Audio toggle in 1.1.47;
    the OFF state is now registered correctly.
  * GUI could crash (SIGABRT) on a quick EQ-mode toggle or when applying a
    preset from the tray — the background apply thread could be destroyed
    while still running. Thread cleanup now waits for the thread to fully
    stop (same class as the Smart Volume slider crash fixed in 1.1.47).
  * The daemon froze for up to several seconds while reloading its
    configuration (e.g. on ReloadConfigs / loopback recreation) because
    blocking device discovery ran on the asyncio event loop. That work is
    now offloaded to a worker thread, keeping the daemon responsive.
  * The daemon no longer imports any GUI/Qt code: EqBand and the filter
    labels moved to a Qt-free eq_types module, so the background service is
    lighter and headless-safe.
  * Added timeouts to systemctl/dinitctl/udevadm calls so a degraded init
    system can no longer hang the autostart/setup paths, and a corrupt
    profile is now logged instead of silently skipped.
  * Hardened a race when a device is (re)configured while it disconnects,
    and a couple of dialog timers that could fire on already-closed windows.

 -- loteran <axel.valadon@gmail.com>  Sun, 31 May 2026 00:00:00 +0000

arctis-sound-manager (1.1.47-1) noble; urgency=medium

  * App audio channel assignments were "randomly forgotten" (#64) — moving
    an app to a channel (e.g. LibreWolf → Media) was only persisted for apps
    the router was already tracking; an app sitting on the default channel
    was never recorded, so the manual move was never saved and the app kept
    reverting. Every observed stream's placement is now recorded, so a later
    manual move is detected and persisted. Also added LibreWolf, Tor
    Browser, Waterfox, Floorp, Mullvad Browser, Thorium and
    ungoogled-chromium to the browsers auto-routed to the Media channel.
  * GUI crash when dragging the Smart Volume → Level slider quickly (#63) —
    the apply worker (a QThread) could be destroyed while still running
    during rapid re-applies, aborting the application. Worker cleanup now
    happens only after the thread has fully stopped.
  * Spatial Audio (and the microphone noise-canceling / noise-gate /
    compressor) toggles did not save their OFF state (#62) — a PySide6 quirk
    (bool(Qt.CheckState.Unchecked) is True) meant turning these off was
    never recorded, so e.g. Spatial Audio OFF was lost when saving a custom
    preset. The OFF state is now persisted correctly.
  * The virtual-sink loopback watchdog now also recovers loopbacks that are
    alive but linked to the wrong output (e.g. bound to another audio device
    instead of their Sonar EQ node), not just crashed ones — restoring sound
    on the affected channel automatically.

 -- loteran <axel.valadon@gmail.com>  Sun, 31 May 2026 00:00:00 +0000

arctis-sound-manager (1.1.46-1) noble; urgency=medium

  * Discord (and other apps) lost their audio sink when changing a Sonar
    profile — applying a Sonar profile or EQ used to restart the whole
    PipeWire stack, tearing down every node. Apps that do not re-enumerate
    their output devices when the PulseAudio server connection drops
    (Discord/Electron in particular) ended up silent until restarted.
    Profile and EQ changes now restart only the filter-chain service and
    recreate the virtual-sink loopbacks dynamically, leaving
    pipewire/pipewire-pulse untouched, so connected apps keep their sink and
    audio.
  * Virtual sinks showed a generic "pw-loopback-NNN" name in application
    output pickers and mixers — the Arctis Game/Chat/Media sinks now expose
    their proper "Arctis … Game/Chat/Media" name and can be selected as an
    output device (e.g. as Discord's Chat output).
  * Discord appeared as "WEBRTC VoiceEngine" in a channel's application list
    — applications that report a generic audio-engine name now fall back to
    their process binary, so Discord shows as "Discord".
  * The Arctis Game/Chat/Media virtual-sink loopbacks are now created and
    owned dynamically by the daemon (instead of a static pipewire.conf.d
    file), so they can be recreated after an EQ change without a full
    PipeWire restart. The 7.1 surround (HeSuVi) chain for Game and Media is
    unchanged. The daemon cleans up its loopbacks on shutdown, and a
    watchdog respawns any loopback whose process crashes.

 -- loteran <axel.valadon@gmail.com>  Sat, 30 May 2026 00:00:00 +0000

arctis-sound-manager (1.1.45-1) noble; urgency=medium

  * Arctis 7X: daemon crashed with "Failed to find command interface
    endpoint" — some Arctis 7X (and other Arctis 1 family) firmwares expose
    the vendor HID command interface with an interrupt IN endpoint only, no
    OUT endpoint. get_command_endpoint_address() raised an exception instead
    of falling back, crashing the whole daemon before the GUI could appear.
    ASM now detects the missing OUT endpoint and routes commands over HID
    SET_REPORT (control transfer) automatically, which is the correct path
    for such devices (issue #59).

 -- loteran <axel.valadon@gmail.com>  Fri, 29 May 2026 00:00:00 +0000

arctis-sound-manager (1.1.44-1) noble; urgency=medium

  * dinit (Artix): Sonar mode toggle crashed — switching Game/Chat ↔ Sonar
    called systemctl --user restart … with no dinit branch, raising
    FileNotFoundError: systemctl on systems without systemd. The toggle now
    works on dinit (issue #25).
  * dinit (Artix): EQ / Sonar changes had no effect — applying a new
    equalizer mode ran dinitctl start pipewire-filter-chain, but start is a
    no-op when the service is already running, so the freshly generated
    config was never reloaded (systemd correctly used restart). All
    config-reload paths now use restart on both init systems — this is the
    root cause of the "EQ does nothing" reports on dinit (issue #25).
  * Centralised init-system handling — introduced service_control.py, a
    single abstraction over systemctl --user and dinitctl. The logical→real
    service-name mapping (notably filter-chain → pipewire-filter-chain on
    dinit) and the start/restart distinction now live in one place instead
    of being copy-pasted across ~25 call sites in 11 files. Service calls no
    longer crash when the init manager binary is absent; they log and skip.
    This removes ~230 lines of duplicated branching and makes the issue #25
    class of bugs impossible to reintroduce per-site. Added a regression
    test suite (tests/test_service_control.py).

 -- loteran <axel.valadon@gmail.com>  Fri, 29 May 2026 00:00:00 +0000

arctis-sound-manager (1.1.43-1) noble; urgency=medium

  * Distrobox container fails to start after reboot on Bazzite / SteamOS /
    Silverblue — /run/asm-hidraw lives on a tmpfs and is wiped at every
    boot; the sudo mkdir -p in the install script only ran at container
    creation time, so on the next boot crun could not stat the bind-mount
    source and refused to start the container (crun: cannot stat
    /run/asm-hidraw: No such file or directory). A systemd-tmpfiles drop-in
    (/etc/tmpfiles.d/asm-hidraw.conf) is now installed on the host,
    recreating the directory at sysinit.target well before Distrobox starts.
    Added ConditionPathIsDirectory=/run/asm-hidraw to arctis-manager.service
    to prevent crash-loops if the directory is somehow absent. Affects all
    three Distrobox installers (bazzite.sh, steamos.sh, silverblue.sh —
    issue #59).

 -- loteran <axel.valadon@gmail.com>  Thu, 28 May 2026 00:00:00 +0000

arctis-sound-manager (1.1.34-1) noble; urgency=medium

  * Wireless headset disconnect/reconnect loop — when the USB dongle stays
    plugged in but the RF link drops (headset powered off or out of range),
    ASM retried USB commands thousands of times per second with no back-off,
    preventing the dongle firmware from completing RF re-association. Errors
    with errno 19 (ENODEV) now trigger a 1-second back-off; after ~10 s of
    consecutive failures ASM voluntarily releases the handle to let the
    dongle reconnect cleanly. Removed a redundant request_device_status()
    call that was firing on every loop iteration instead of the intended
    2-second cadence (issue #49).

 -- loteran <axel.valadon@gmail.com>  Mon, 18 May 2026 00:00:00 +0000

arctis-sound-manager (1.1.33-1) noble; urgency=medium

  * ClearCast crash on startup when noise cancellation was enabled —
    _NoiseCancelingCard connected the toggle signal before creating
    self._slider; PySide6 fires checkStateChanged synchronously during
    setChecked(), so restoring an enabled state from the previous session
    triggered _set_enabled before the slider existed, raising AttributeError
    (issue #51).
  * README: First launch section — clarified that the daemon starts
    automatically but the GUI must be opened separately (asm-gui or via the
    app launcher), documented --systray mode and per-DE autostart methods.

 -- loteran <axel.valadon@gmail.com>  Mon, 18 May 2026 00:00:00 +0000

arctis-sound-manager (1.1.32-1) noble; urgency=medium

  * Audio redirect broken for 8 wireless models — is_device_online()
    compared on_off parser values ('on'/'off') against YAML online_value:
    online literally; added aliasing so 'on' ↔ 'online' and 'off' ↔
    'offline' are treated as equivalent (discussion #48).
  * Streams stay on dead loopbacks after disconnect — redirect_audio()
    changed the default sink but did not migrate active streams; now
    iterates sink_input_list() and moves every stream sitting on an
    ASM-owned sink, and persists the choice via pw-metadata for PipeWire
    restart survival (issue #50).
  * babel missing from packaging metadata — added to PKGBUILD depends, RPM
    Requires, debian/control Depends, system deps checker, and packaging
    drift check.

 -- loteran <axel.valadon@gmail.com>  Mon, 18 May 2026 00:00:00 +0000

arctis-sound-manager (1.1.31-1) noble; urgency=medium

  * Microphone routed to wrong device on startup — when the Arctis headset
    is not yet detected when the filter-chain config is written,
    target.object was left empty and PipeWire would bind the virtual
    microphone to the first available source (e.g. a DualSense controller
    mic). check_and_fix_stale_configs() now detects this condition at daemon
    startup and patches the target in-place, triggering a filter-chain
    restart.

 -- loteran <axel.valadon@gmail.com>  Sat, 16 May 2026 00:00:00 +0000

arctis-sound-manager (1.1.30-1) noble; urgency=medium

  * Per-channel output device selection — each audio channel card (Game /
    Chat / Media) now has a dropdown to route that channel to a specific
    output sink; systray → Output Routing mirrors the same selection (issue
    #46).
  * Output device routing saved in profiles — optional checkbox in Save
    Profile dialog captures the current per-channel routing.
  * Language filter — only languages with ≥ 80 % translation coverage appear
    in the language selector; names are now displayed in their native script
    via babel (Français, Deutsch, Polski…) instead of 2-letter codes.
  * Sonar EQ channel names displayed in English instead of the active
    language.
  * Applications section misaligned on channels without output device
    selection.
  * Duplicate HDMI entries in output device lists.
  * Crowdin sync: excluded English from translation download target to
    prevent source file overwrite on each sync.

 -- loteran <axel.valadon@gmail.com>  Fri, 15 May 2026 00:00:00 +0000

arctis-sound-manager (1.1.4-1) noble; urgency=medium

  * dinit: filter-chain and video-router stuck stopped after asm-setup —
    when asm-setup rewrites service files on disk, dinit keeps the old
    in-memory definition (without restart = true) until explicitly reloaded.
    Added dinitctl reload for stopped services before starting them so dinit
    always picks up the current file (issue #25).
  * dinit: D-Bus collision on re-login — the guard preventing a second
    asm-daemon from starting used dinitctl status, which could miss the race
    window between dinit's boot-sequence auto-start and asm-setup's explicit
    start. Replaced with pgrep -f asm-daemon against the actual running
    process.
  * dinit: filter-chain start race after pipewire restart — asm-setup now
    waits 0.5 s after a successful dinitctl restart pipewire before starting
    dependants, giving the PipeWire socket time to come up.

 -- loteran <axel.valadon@gmail.com>  Fri, 08 May 2026 00:00:00 +0000

arctis-sound-manager (1.0.99-1) noble; urgency=medium

  * Adaptive multi-DE autostart — Hyprland, Sway, XDG, systemd, dinit — the
    "Launch at startup" toggle now automatically selects the right method
    for the detected desktop environment / init system. On Hyprland it
    writes exec-once = asm-gui --systray into ~/.config/hypr/hyprland.conf
    (using a comment marker for clean enable/disable). On Sway it writes
    exec asm-gui --systray into ~/.config/sway/config. On dinit systems the
    existing dinitctl enable calls are used. On systemd-based DEs (GNOME,
    KDE, XFCE, …) the arctis-gui.service approach is kept. Any other setup
    (i3, unknown, non-systemd distros) falls back to an XDG .desktop file in
    ~/.config/autostart/. Switching DEs cleans up stale entries from the
    previous method. Fixes the issue reported by users running
    Hyprland/CachyOS where the toggle had no effect (closes #30).

 -- loteran <axel.valadon@gmail.com>  Wed, 06 May 2026 00:00:00 +0000

arctis-sound-manager (1.0.98-1) noble; urgency=medium

  * Distrobox hot-plug (issue #26) — the headset can now be plugged in
    *after* the container is created without requiring --reinstall. A new
    udev rule (90-asm-hidraw-symlink.rules) maintains /run/asm-hidraw/ as a
    stable directory of symlinks to SteelSeries hidraw nodes; the container
    mounts this directory with rslave propagation so additions and removals
    on the host are immediately visible inside.
  * libusb / PyUSB access from container — /dev/bus/usb is now bind-mounted
    into the container (rslave), giving PyUSB full access to the USB device
    tree. Previously only /dev/hidraw* was passed, which blocked the libusb
    backend entirely.
  * Fedora Silverblue/Kinoite variants auto-detected — distrobox-install.sh
    now correctly routes Bluefin, Aurora, Sericea, Onyx, and Cosmic Atomic
    to silverblue.sh (Fedora COPR container) instead of incorrectly using
    the Arch/AUR container.
  * Container health check — a 30-second readiness probe runs after
    container creation; if the container fails to respond, the script aborts
    with a clear error and recovery instructions before attempting the
    install.
  * PipeWire management socket mounted — pipewire-0-manager is now forwarded
    into the container alongside pipewire-0 and pulse/, enabling pw-cli
    management operations from inside the container.
  * PipeWire host restart after install — the installer now restarts
    pipewire, pipewire-pulse, and wireplumber on the host so that
    filter-chain configs written by asm-setup are picked up immediately. Can
    be suppressed with ASM_RESTART_PIPEWIRE=0.
  * pacman-key --init idempotent — the keyring initialisation now checks for
    an existing pubring.gpg before running; re-running the installer no
    longer risks corrupting a healthy keyring on SteamOS or Arch containers.
  * gamescope-session.target conditional — systemd units no longer
    unconditionally declare WantedBy=gamescope-session.target on desktop
    distros where that target does not exist. Bazzite and Silverblue get
    graphical-session.target only; SteamOS/Steam Deck gets both.
  * udevadm trigger scope narrowed — the post-install trigger now targets
    only devices with idVendor=1038 (SteelSeries) instead of re-triggering
    every USB device on the system.
  * steamos-readonly always re-enabled — a trap RETURN guarantees
    steamos-readonly enable is called on exit from asm_install_udev_rules,
    even if an intermediate command fails, preventing the filesystem from
    being left in read-write mode.
  * paru build directory cleaned on failure — the temporary directory used
    to clone and build paru-bin is now removed via trap EXIT even when
    makepkg fails.
  * Uninstall removes hot-plug udev rule — uninstall.sh --remove-udev now
    also deletes 90-asm-hidraw-symlink.rules in addition to the
    device-specific rules file.

 -- loteran <axel.valadon@gmail.com>  Tue, 05 May 2026 00:00:00 +0000

arctis-sound-manager (1.0.97-1) noble; urgency=medium

  * Sonar Media tab (issue #29) — new Media EQ tab placed between Game and
    Chat in the Sonar page. The channel runs through the HeSuVi 7.1 surround
    pipeline (same routing as Game), giving music and video apps the full
    spatial-audio treatment. The complete 300+ preset library ([Game] tag —
    games, music genres, movies, podcasts) is available from day one. Boost
    Volume and Smart Volume cards are wired up identically to Game and Chat.
  * Arctis_Media → sonar-media-eq — the Media virtual sink now routes
    through its own dedicated EQ filter-chain node instead of bypassing
    Sonar entirely. Stream restore after filter-chain restart remaps
    effect_input.sonar-media-eq ↔ Arctis_Media correctly.

 -- loteran <axel.valadon@gmail.com>  Tue, 05 May 2026 00:00:00 +0000

arctis-sound-manager (1.0.96-1) noble; urgency=medium

  * dinit support (Artix Linux / issue #25) — ASM now works end-to-end on
    init systems other than systemd. asm-setup detects dinit via
    /proc/1/comm and writes service files to ~/.config/dinit.d/ instead of
    calling systemctl. All service management calls in the GUI (Sonar EQ
    restarts, autostart toggle, systray shutdown) are branched: systemd
    systems are completely unaffected, dinit systems get the correct
    dinitctl start/stop/enable calls.
  * _ensure_dinit_boot_target() — on Artix dinit-userservd there is no
    default user boot service, so dinitctl enable silently failed ("service
    'boot' has no waits-for.d directory"). asm-setup now creates a minimal
    ~/.config/dinit.d/boot + boot.d/ when absent (never overwrites an
    existing one), matching the upstream dinit getting-started guide.
  * asm-diag-dinit diagnostic script — reports init system, service file
    presence, running/enabled state (via waits-for.d symlink inspection),
    filter-chain, virtual sinks, udev rules and D-Bus in a single read-only
    pass. Useful for triage on any non-systemd distro.
  * init_system.py — is_dinit_service_enabled(svc) — replaces the
    non-existent dinitctl is-enabled subcommand (dinit only has
    is-started/is-failed). Enabled state is determined by walking
    *.waits-for.d/ and boot.d/ symlinks across all known service
    directories.
  * asm-setup crashed on non-systemd init — every service management call
    was hardwired to systemctl without checking for its presence. On
    Artix/dinit the setup crashed immediately with FileNotFoundError: [Errno
    2] No such file or directory: 'systemctl'. A _has_systemctl() guard now
    skips all systemd-specific steps cleanly on non-systemd systems.
  * Autostart toggle broken on dinit — the GUI checked autostart state using
    dinitctl is-enabled which doesn't exist as a subcommand. The toggle
    always showed "disabled". Now uses is_dinit_service_enabled() (symlink
    inspection) for correct detection, and dinitctl enable/disable for
    mutation.

 -- loteran <axel.valadon@gmail.com>  Tue, 05 May 2026 00:00:00 +0000

arctis-sound-manager (1.0.95-1) noble; urgency=medium

  * OLED horizontal marquee for EQ preset name — when the EQ preset name
    overflows the 128 px display width, the text now scrolls left
    pixel-by-pixel. It pauses 2 s at the start (readability), scrolls to the
    end, pauses 2 s, then snaps back. Speed is controlled by the new Scroll
    Speed (Horizontal) slider (0 = disabled, 1–5 = slow to fast).
  * OLED horizontal marquee for Profile name — same marquee behaviour
    applied to the active profile name line.
  * DAC tab — Scroll Speed (Horizontal) slider — new oled_eq_scroll_speed
    setting controls the horizontal marquee speed for both EQ preset and
    profile name lines. The existing scroll slider is renamed to Scroll
    Speed (Vertical).
  * OLED brightness reset by headset firmware — when oled_brightness was set
    to a value other than the headset default and screen_timeout = 0, the
    headset firmware silently overrode the brightness back to its own value
    every few seconds. ASM now re-asserts the configured brightness level
    every 5 s in the refresh loop (only when the screen is active), keeping
    the setting stable without interfering with the screen-timeout
    dim-to-black behaviour.
  * DAC tab slider spacing — the default QHBoxLayout content margins caused
    excessive vertical padding between slider rows. Margins are now
    explicitly set to 4 px top/bottom, halving the visual gap.

 -- loteran <axel.valadon@gmail.com>  Mon, 04 May 2026 00:00:00 +0000

arctis-sound-manager (1.0.94-1) noble; urgency=medium

  * Arctis 7 2019 (0x12ad) failed to initialize — no battery, no chatmix
    (issue #28) — arctis_7.yaml was missing command_transport: ctrl_output,
    the field that tells the HID layer to use SET_REPORT on the control
    endpoint. All four product IDs sharing that YAML (0x1260, 0x12ad,
    0x1252, 0x1280) were affected. Adding ctrl_output aligns the Arctis 7
    family with every other device YAML in the codebase (Arctis 7+, Arctis
    9, Nova 3/5/7).
  * Virtual sinks (Arctis_Game / Arctis_Chat / Arctis_Media) routed to
    system default instead of Sonar EQ nodes (issue #28) — the bundled
    10-arctis-virtual-sinks.conf installed by install.sh / asm-setup had no
    node.target in its playback.props blocks. PipeWire therefore routed all
    three loopback outputs to the default sink, bypassing the Sonar EQ
    filter-chain entirely and breaking chatmix separation. Each sink now
    points to its Sonar EQ input node (effect_input.sonar-game-eq /
    effect_input.sonar-chat-eq).
  * Virtual Surround sink silent on fresh install — can't start graph: No
    such file or directory (issue #28) —
    sink-virtual-surround-7.1-hesuvi.conf referenced the HRIR WAV as the
    relative path hrir_hesuvi/hrir.wav. PipeWire instantiates filter-chains
    without a stable working directory, so the file was never found. The
    template now uses the placeholder ${HRIR_DIR}, which install.sh,
    setup-surround.sh, and asm-setup substitute with the absolute path
    ~/.local/share/pipewire/hrir_hesuvi at deploy time — the same directory
    the installer downloads the WAV to.

 -- loteran <axel.valadon@gmail.com>  Mon, 04 May 2026 00:00:00 +0000

arctis-sound-manager (1.0.86-1) noble; urgency=medium

  * System Deps dialog at GUI startup — a runtime self-healing dialog that
    detects every missing system component ASM relies on (LADSPA plate_1423
    + librnnoise, HRIR file, filter-chain.service, PipeWire ≥ 1.0, wpctl,
    pkexec, pyudev/pulsectl/PySide6/pyusb/PIL/ruamel.yaml/dbus-next,
    dbus-send, pw-metadata, curl, D-Bus session, udev rules, gh CLI). Each
    missing dep shows a severity badge (BLOCKING / DEGRADED / OPTIONAL),
    what feature breaks if it stays missing, and an Install/Run button that
    runs the right pkexec dnf|apt-get|pacman install … for the detected
    distro. Install all missing groups by package manager so a single polkit
    prompt fixes the whole list. Don't show again until ASM is upgraded
    writes a version-aware skip marker that auto-resets on the next ASM
    upgrade. Copy cmd falls back to clipboard mode for unsupported distros.
    Triggered after the existing udev / telemetry dialogs at T+2.5 s on
    first launch — no nag.
  * asm-daemon --verify-setup runs the same dep registry — headless
    preflight now logs each missing component with its severity tier and
    per-distro install command, plus the detected distro on the summary
    line. Exit 1 on BLOCKING/DEGRADED, 0 if only OPTIONAL — safe to wire
    into systemd ExecStartPre.
  * scripts/check-deps-drift.py CI guard — AST-walks src/, fails the
    wheel-install-test matrix on every supported distro if a new third-party
    import or subprocess.run([…]) is added without a matching DepCheck
    entry. Closes the silent-failure trap class issue #23 was about: any new
    external dep is forced through the runtime checker too, so the GUI
    dialog never goes blind.
  * Spatial Audio silently inaudible on Fedora (issue #23) — Recommends:
    swh-plugins in the spec was a no-op on Fedora because the package is
    named ladspa-swh-plugins there; DNF silently pulled in nothing and the
    HeSuVi filter-chain failed to load plate_1423 (reverb) on every Fedora
    install. The spec now hard-Requires: ladspa-swh-plugins, and the dep is
    also a Depends: (not Recommends:) on Debian + a depends= (not
    optdepends=) on Arch — DNF/APT auto-pull it on upgrade, no manual dnf
    install needed.
  * Audio bypassed Sonar EQ + HeSuVi chain on first run (issue #23) —
    asm-setup deployed a static 10-arctis-virtual-sinks.conf with no
    node.target, so WirePlumber connected the Game/Chat virtual sinks
    straight to the physical headset, skipping the Sonar EQ and HeSuVi nodes
    entirely. The drift-checker (check_and_fix_stale_configs) was only
    invoked from SonarPage.__init__ in the GUI, so users who never opened
    the Equalizer page kept the broken layout forever. The daemon now runs
    the drift-check from configure_virtual_sinks() at startup, and the check
    now flags needs_pw_restart=True when it rewrites the virtual-sinks file
    (which lives in pipewire.conf.d/, not filter-chain.conf.d/, so a
    filter-chain restart alone wouldn't reload it).
  * Ghost Arctis virtual sinks survived paru -R arctis-sound-manager (issue
    #24) — the AUR post_remove hook only echoed cleanup instructions that
    buried paru/yay output drowned, so users on CachyOS reported phantom
    Game/Chat/Media devices remaining after uninstall. The AUR/RPM/DEB hooks
    now actually run a cleanup as $SUDO_USER (via su -l) that removes
    ~/.config/pipewire/pipewire.conf.d/10-arctis-virtual-sinks.conf + the
    chat/media/HeSuVi siblings + stale
    ~/.config/systemd/user/arctis-*.service copies, then restarts pipewire
    so the ghost sinks vanish immediately. Audio profiles in
    ~/.config/arctis_manager/profiles/ are preserved (matches the
    scripts/uninstall.sh --purge contract).
  * No soft deps remain — noise-suppression-for-voice (rnnoise LADSPA,
    drives the ClearCast toggle), swh-plugins (Arch), and curl (asm-setup
    HRIR download) were promoted from Recommends: / optdepends= to hard
    requirements across all three packagers. Any feature ASM exposes in the
    GUI now has a hard package dep behind it — the runtime checker is the
    safety net for users who later remove a package by hand or ride an
    immutable distro that didn't replay the upgrade transaction.

 -- loteran <axel.valadon@gmail.com>  Thu, 30 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.85-1) noble; urgency=medium

  * Sonar Output preset switch dropped Firefox / Arctis_Media routing (issue
    #22) — restarting the PipeWire filter-chain to apply a new Output EQ
    preset (e.g. *Music – Punchy*) tears down the Arctis_Game/Chat/Media
    virtual sinks momentarily. The stream-restore loop only waited for the
    EQ filter node to reappear before re-issuing pactl move-sink-input, so
    when the Arctis virtual sinks were not yet back the moves silently
    failed and streams stayed orphaned on the system default. The apply
    worker now waits up to 4 s per saved Arctis_* target sink before issuing
    the move-back commands.
  * asm-cli arctis-usb-info traceback on EACCES (issue #22) — when udev
    rules were missing or not yet applied to the currently-attached dongle,
    reading device.manufacturer raised usb.core.USBError: [Errno 13] Access
    denied and aborted the diagnostic. Now wrapped with try/except; prints
    (no permission) with a hint to run asm-setup instead of crashing the
    whole CLI report.

 -- loteran <axel.valadon@gmail.com>  Mon, 27 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.84-1) noble; urgency=medium

  * TypeError crash in on_settings_received when the daemon flagged a USB
    EACCES (issue #22) — UdevRulesDialog(parent=self, ...) was called from
    QMainApp, which inherits from QObject, not QWidget, so QDialog.__init__
    rejected the parent and the GUI tracebacked instead of opening the
    "Apply now" dialog. Pass self.main_window (the actual QMainWindow) so
    the runtime fix-permissions flow shipped in v1.0.81 finally fires on
    Nobara/Fedora setups where the dongle was plugged in before the udev
    rules took effect.

 -- loteran <axel.valadon@gmail.com>  Mon, 27 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.83-1) noble; urgency=medium

  * Bug report — full system diagnostic — the report payload now includes
    Python library versions (pulsectl / pyudev / pyusb / dbus-next /
    ruamel-yaml / PySide6 / pillow via importlib.metadata), multi-install
    detection (rpm + pacman + apt + pipx + every asm-daemon binary in
    $PATH), the actual content of the active udev rules file with
    is_udev_rules_valid()'s verdict, the full PipeWire sink list, wpctl
    status, the USB monitor backend (pyudev event-driven vs polling
    fallback) and the D-Bus session bus path. Goes from a 6 kB report to a
    ~13 kB one — every block is actionable for triage.
  * Bug report — short URL body + full file attachment — GitHub's ?body=
    query param is capped around 8 kB; the expanded report no longer fits.
    ASM now writes the full diagnostic to
    ~/.cache/arctis-sound-manager/reports/bug-report-YYYYMMDD-HHMMSS.md,
    opens the GitHub issue editor with a short summary (~600 chars) and an
    "Open folder" button so the user can drag-and-drop the diagnostic file
    into the issue editor.
  * Bug report — one-click auto-submit via gh CLI — when the user has gh
    auth status configured, a "Submit automatically (gh CLI)" button uploads
    the diagnostic as a secret gist, creates the issue with a link to the
    gist, and opens the new issue URL in the browser. Zero clicks past the
    dialog. Falls back to the manual drag-and-drop flow on any failure.
  * Bug report — free-form description — the dialog has a dedicated
    "Describe what happened" field at the top with a placeholder example.
    The text is prepended as a ## What happened markdown block to BOTH the
    URL body and the full diagnostic file so the maintainer sees it first.
  * Channel button label H → O — the 4th audio channel was renamed from
    "HDMI" to "Output" because it can target any external sink (HDMI, USB
    speakers, sound card…), not just HDMI. The drop button on application
    pills was already O, but the help-page text in the three locales
    (en/fr/es) still referenced the old G / C / M / H shortcut and "H sends
    it to HDMI" — updated to G / C / M / O and "O sends it to your external
    Output (HDMI, USB speakers, sound card…)".

 -- loteran <axel.valadon@gmail.com>  Sun, 26 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.82-1) noble; urgency=medium

  * Multi-device routing (issue #20) — on systems with several audio outputs
    (Logitech G560, Razer Kiyo, internal speakers, etc.) plus an Arctis
    headset, apps that were already running when ASM started used to stay
    glued to their previous sink because _auto_route() only matched a
    hardcoded list of browser/game/chat app names. Now video_router.py
    adopts any orphan stream onto Arctis_Media when Arctis is the default
    sink — Spotify, VLC, Steam and friends finally end up in the headset on
    first launch. Streams already on an Arctis sink (virtual or
    filter-chain) are left untouched, and the adoption is saved as a routing
    override so manual KDE-mixer placements take over from there. Same logic
    applied to native PipeWire streams (mpv, haruna).

 -- loteran <axel.valadon@gmail.com>  Sun, 26 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.81-1) noble; urgency=medium

  * Runtime "Apply now" popup on USB EACCES — restores the v1.0.71 behaviour
    lost during the v1.0.79 merge. The existing startup dialog only fires
    when the udev rules file is missing/incomplete on disk, but if the rules
    are correct AND the headset was plugged in before they took effect
    (typical after a paru -Syu or dnf upgrade), the daemon used to hit
    EACCES on kernel_detach and the GUI was silent. Users had to figure out
    replug or sudo asm-cli udev reload-rules on their own. Now
    CoreEngine.kernel_detach flags permission_error=True per-interface on
    errno 13, the daemon exposes that flag through GetSettings, and the GUI
    opens UdevRulesDialog(mode="reload") automatically — one click runs
    asm-cli udev reload-rules with a single pkexec prompt and the device
    becomes accessible without unplugging.
  * UdevRulesDialog two modes: write (existing — install missing rules) and
    reload (new — re-trigger udev on the currently-attached device). Both
    share the same one-prompt elevation flow.
  * debian/build-deb.sh referenced stale unit paths (debian/*.service) that
    had moved to systemd/*.service in v1.0.79. The .deb job in release.yaml
    failed at build, which cascade-skipped aur-update and copr-build,
    leaving AUR / COPR users on v1.0.78 even though the v1.0.79 / v1.0.80
    tags were pushed. Updated to use the canonical systemd/ paths.
  * CI drift detector now also validates that every relative source path in
    debian/build-deb.sh, debian/rules, aur/PKGBUILD and the RPM spec
    actually exists in the repo. Catches the exact regression described
    above before merge — verified by sim-test.

 -- loteran <axel.valadon@gmail.com>  Sun, 26 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.80-1) noble; urgency=medium

  * scripts/uninstall.sh — dedicated uninstaller. Detects every install
    method on the system (rpm / pacman / apt / pipx) and lets the user pick
    which one(s) to remove. When both pipx and a distro package coexist,
    offers a 1/2/3 menu (pipx only / distro only / both). --purge wipes
    settings, PipeWire configs, HRIR data, user systemd units and the
    manually-written udev rules in /etc, but preserves audio profiles
    (~/.config/arctis_manager/profiles/ and the active-profile pointer) so a
    future reinstall picks them right back up. A separate explicit confirm
    offers to delete the profiles too.
  * Profiles capture DAC tab settings — audio profiles now snapshot and
    restore the full DAC state in addition to EQ/macros/spatial/volumes:
    OLED brightness, screen timeout, scroll speed, custom-display toggle,
    show-element toggles, display order, per-element font sizes, weather
    configuration. Older profile files (pre-v1.0.80) load with an empty DAC
    block — restoring them is a no-op for the DAC side, exactly as before.
  * scripts/check-packaging-drift.py — CI-enforced drift detector. Runs on
    every PR/push across the 8-distro matrix and fails the build if
    pyproject.toml / PKGBUILD / .SRCINFO / RPM spec are out of sync, if any
    generator (udev rules, AppStream metainfo, debian/changelog) produces
    output that differs from the committed file, or if a pyproject dep is
    missing from PKGBUILD depends, the spec's Requires: lines, or
    debian/control Depends:. Closes the class of bug that left AppStream
    stuck at v1.0.4 and debian/changelog at v1.0.27 for months.
  * Packaging drifts surfaced by the new check — added pillow to the three
    packagers (was in pyproject but missing everywhere), added
    python3-pulsectl to debian/control, regenerated debian/changelog (14
    versions behind) and AppStream metainfo (no v1.0.79 entry).
  * udevadm trigger scope alignment — AUR install hook and debian postinst
    now narrow the trigger to --subsystem-match=usb like the RPM spec and
    asm-cli already do. Cosmetic; functional behaviour unchanged.

 -- loteran <axel.valadon@gmail.com>  Sun, 26 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.79-1) noble; urgency=medium

  * udev (RPM): udevadm trigger now uses --action=add so device permissions
    are actually re-evaluated after upgrade on Fedora/Nobara/RHEL (was the
    same fix as cli.py / aur / debian).
  * udev: is_udev_rules_valid() is now content-based (parses real rule
    lines) instead of substring-matching 'uaccess'/'1038' — no more false
    positives from comments, no more false negatives from a stale file at
    one path masking a valid file at another.
  * udev paths: UDEV_RULES_PATHS now includes /run/udev/rules.d/ (NixOS,
    runtime overlays) and /lib/udev/rules.d/ (pre-usrmerge Debian).
  * monitor: pyudev is now optional. When the import or netlink setup fails
    (containers, restricted sandboxes, NixOS modules), the monitor falls
    back to a 2s polling loop scoped to vendor 0x1038 instead of crashing
    the daemon at startup.
  * core: kernel_detach/kernel_attach no longer crash on a single failing
    interface (device unplugged mid-detach, permission denied) — the loop
    continues so init still runs on the interfaces that did claim.
  * core: init_device() retries each command once on usb.core.USBError and
    logs N/total progress. A persistent failure logs at ERROR but doesn't
    abort the rest of the init list.
  * core: log a WARNING when a vendor 0x1038 device appears but no YAML
    matches — easy to spot new/firmware-bumped PIDs in journalctl/bug
    reports.
  * dbus: daemon retries MessageBus().connect() (5×, 5s timeout each) and
    explicitly checks request_name() reply — a queued/conflicting daemon now
    fails with a clear "another asm-daemon is running" error instead of
    silently ignoring all GUI calls.
  * dbus (gui): dbus_request_async now wraps connect+call in
    asyncio.wait_for (5s) and emits a new sig_daemon_alive signal after 3
    consecutive failures so views can show a banner instead of silently
    freezing.
  * daemon: SIGTERM/SIGINT registered via loop.add_signal_handler and now
    actually cancels long-lived asyncio tasks (core_loop, dbus_awake) —
    daemon exits promptly even if a worker is mid-blocking-call.
  * settings: general_settings.yaml reads catch corruption (move to .broken,
    fall back to defaults) and writes are now atomic (tmp+rename+fsync). A
    killed process can no longer leave a half-written file.
  * config: a single malformed device YAML used to crash the entire daemon.
    We now log+skip the offending file and load the rest. Real cross-family
    duplicate PIDs are warned (same-family overrides between HOME and SRC
    are ignored — by design).
  * gui: clear errors instead of XCB tracebacks when DISPLAY/WAYLAND_DISPLAY
    is missing or the Qt platform plugin failed to load (suggests
    qt6-wayland per distro).
  * pactl: PulseAudioManager retries the initial connection 12× with 0.5→4s
    exponential backoff so the daemon survives the boot race against
    pipewire-pulse instead of crashing.
  * setup: asm-setup refuses to run as root (silent failure mode where
    systemctl --user and ~/.config go to the wrong user), and validates
    every device YAML in ~/.config/arctis_manager/devices/ at the end so a
    previous interrupted run doesn't leave broken files behind.
  * asm-cli diagnose [-o file]: one-shot bug-report dump (versions, USB
    tree, udev state, sinks, journalctl, redacted settings, last 100 service
    log lines). Local-only.
  * asm-daemon --verify-setup: preflight checks (YAMLs, udev, PulseAudio,
    D-Bus, USB monitor backend) with a clear OK/FAIL summary and exit code,
    safe to run before launching the daemon or in CI.
  * ARCTIS_LOG_LEVEL env var (debug/info/warn/error/numeric): bump verbosity
    for bug reports without rebuilding or passing flags. Honored by daemon,
    GUI and video-router.
  * i18n EN fallback: missing translation keys in non-en locales now fall
    back to the en string instead of showing the raw key, with a log-once
    warning per missing key for translators.
  * AppStream metainfo: <releases> block is now generated from CHANGELOG.md
    at build (scripts/generate_metainfo_releases.py) — was frozen at v1.0.4
    (61 versions behind), GNOME Software / KDE Discover finally show recent
    updates. Wired into AUR/PKGBUILD, RPM .spec and debian/rules.
  * debian/changelog: now generated from CHANGELOG.md at build
    (scripts/generate_debian_changelog.py) — was frozen at v1.0.27 (39
    versions behind).
  * systemd units: single source of truth in systemd/*.service. PKGBUILD and
    the .spec used to embed three heredocs each; debian shipped 2/3
    (arctis-gui.service was missing from the .deb). Now all three packagers
    install from the same files.
  * udev rules: single shared generator (arctis_sound_manager.udev_rules)
    used by both asm-cli udev write/dump-rules and
    scripts/generate_udev_rules.py — output is byte-identical regardless of
    which entry point produced it.
  * pyproject.toml: version is now bumped automatically by the release
    workflow (was stuck at 1.0.66 while PKGBUILD/spec advanced to 1.0.78).
  * Cross-distro pytest + udev generator smoke runs on every PR/push across
    Fedora 42/43, Ubuntu 24.04/25.10, Debian trixie/bookworm, Arch and
    CachyOS.

 -- loteran <axel.valadon@gmail.com>  Sun, 26 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.78-1) noble; urgency=medium

  * Weather city search: typing in the city field was interrupted every few
    hundred milliseconds because update_settings unconditionally overwrote
    _city_input with the saved value on every daemon poll. The field is now
    only updated when it does not have focus.

 -- loteran <axel.valadon@gmail.com>  Sat, 25 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.77-1) noble; urgency=medium

  * Headset page: device name in the "Devices" card flickered between the
    i18n status category label ("Headset" / "Casque") and the actual device
    name ("Arctis Nova Pro Wireless"). update_status was overwriting
    _device_name_label on every status poll; the label is now only set by
    update_settings.

 -- loteran <axel.valadon@gmail.com>  Sat, 25 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.76-1) noble; urgency=medium

  * GUI fails to open (regression in 1.0.69): generate_hesuvi_conf() raised
    UnboundLocalError: cannot access local variable '_log' when no Arctis
    device was attached. The early-return guard called the module-level
    _log, but a later import logging as _log inside the same function
    rebinds _log, which Python treats as a function-local for the entire
    scope. Replaced the local rebinding with a direct _log.warning(...) so
    the module-level logger stays accessible.

 -- loteran <axel.valadon@gmail.com>  Sat, 25 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.75-1) noble; urgency=medium

  * First version published on PyPI — install / upgrade is now a one-liner
    that always pulls the latest:

 -- loteran <axel.valadon@gmail.com>  Sat, 25 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.74-1) noble; urgency=medium

  * Automatic PyPI publish on every tagged release via PyPA's
    gh-action-pypi-publish action using OIDC Trusted Publishers (no token in
    repo secrets). Once the project is published once, end-users can
    install/upgrade with the canonical one-liner pipx install
    arctis-sound-manager --force instead of having to track release URLs.
  * Release workflow writes the deterministic AUR source tarball to
    build/aur/ instead of dist/, so the hyphen-named archive doesn't get
    scooped up by twine when publishing to PyPI. The GitHub release upload
    list now reflects the new path.

 -- loteran <axel.valadon@gmail.com>  Sat, 25 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.73-1) noble; urgency=medium

  * scripts/clean-reinstall.sh — a self-contained, curl | bash-friendly
    script that audits every existing ASM install (rpm + dpkg + pacman +
    pipx + orphan binaries in $PATH), uninstalls all of them, then installs
    the latest release via the user's chosen method, runs asm-setup and
    verifies that the daemon is active. Solves the dup-binary mess that
    built up across mixed install methods (RPM + pipx --force etc.).
  * Multi-install detection in the in-app updater: clicking "Install update"
    now checks whether ASM is currently installed by more than one method
    (rpm + pipx, etc.) and refuses to upgrade until the conflict is
    resolved, opening a clear dialog that points to clean-reinstall.sh with
    a copy-to-clipboard command.
  * In-app updater now runs asm-setup after a pipx upgrade (via the new
    FirstRunDialog), so udev rules are reloaded and PipeWire restarted on
    the new binary. Previously only asm-cli desktop write was called, which
    left udev permissions stale on already-attached devices.
  * update_checker.detect_install_method() now wraps a new
    detect_all_install_methods() -> list[InstallMethod] so callers can
    detect duplicate installations rather than silently picking the first
    match.

 -- loteran <axel.valadon@gmail.com>  Sat, 25 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.72-1) noble; urgency=medium

  * Auto-run asm-setup on first GUI launch for installs that didn't go
    through a distro-package post-install hook (typically pipx). When the
    GUI starts and ~/.config/arctis_manager/.setup_done is missing, a new
    FirstRunDialog opens, runs asm-setup as a subprocess and streams its
    output live in the dialog so the user can follow what's happening (HRIR
    download, services, udev install). Distro packages already shipped
    /etc/xdg/autostart/asm-first-run.desktop for this — pipx users were left
    out, which was the root cause behind issue #22.

 -- loteran <axel.valadon@gmail.com>  Sat, 25 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.71-1) noble; urgency=medium

  * asm-setup now always reloads + triggers udev rules, even when the rules
    file on disk is already valid. Previously it printed [ok] udev rules
    already valid — skipping and exited, leaving the currently-attached
    dongle without the new permissions — which was the root cause behind
    issue #22 ("no device detected after upgrade").
  * GUI dialog "Apply now" when the daemon detects an EACCES on the USB
    device. The daemon now exposes a permission_error flag over D-Bus; when
    the GUI sees it, it surfaces a dialog explaining that the rules exist
    but were not applied to the connected device, with a one-click button
    that runs asm-cli udev reload-rules (with pkexec/sudo) and then asks the
    daemon to re-scan via the existing ReloadConfigs D-Bus method.
  * CoreEngine exposes a new permission_error: bool attribute set by
    _log_usb_access_error and cleared on the next successful kernel_detach.
    ArctisManagerDbusSettingsService.GetSettings now returns it under the
    permission_error key.

 -- loteran <axel.valadon@gmail.com>  Sat, 25 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.70-1) noble; urgency=medium

  * Daemon crash on USB permission errors (#22): when
    is_kernel_driver_active() or detach_kernel_driver() raised a USBError
    (typically [Errno 13] Access denied because udev rules were not yet
    applied to a device that was already plugged in), the entire daemon
    crashed at startup. The GUI then failed to appear because the systemd
    service was in a failed state.
  * kernel_detach() and kernel_attach() now catch USBError and return a
    status flag instead of propagating the exception.
  * On EACCES, a clear error message is logged with three concrete
    remediation steps (replug, udevadm reload-rules + trigger, or reinstall
    via the distro package).
  * configure_virtual_sinks() checks the detach result and bails out cleanly
    so the daemon stays alive even if a device is currently inaccessible.

 -- loteran <axel.valadon@gmail.com>  Sat, 25 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.69-1) noble; urgency=medium

  * Remove all remaining hardcoded Nova Pro Wireless defaults (follow-up to
    #21): device_state.py used Nova Pro Wireless ALSA node names and the
    string "Arctis Nova Pro Wireless" as initial values AND as
    post-disconnect values. sonar_to_pipewire.py had the same strings as
    fallback constants in dead-code except branches. On a system without a
    Nova Pro Wireless, any code path that generated a filter-chain config
    before a device was attached (or after a disconnect) would write configs
    pointing to a sink that does not exist — same class of bug as #21, just
    at a different moment.
  * device_state now defaults to empty strings and exposes is_device_set()
    so callers can distinguish "no device" from "device ready".
  * All PipeWire config generators in sonar_to_pipewire.py
    (generate_sonar_eq_conf for device-dependent channels,
    generate_sonar_micro_conf, generate_virtual_sinks_conf,
    generate_hesuvi_conf) now skip generation with a clear warning when no
    device is attached, instead of writing configs with a hardcoded wrong
    target.
  * Removed the dead-code _PHYSICAL_OUT / _PHYSICAL_IN constants and the
    "Arctis Nova Pro Wireless" string fallbacks from sonar_to_pipewire.py.

 -- loteran <axel.valadon@gmail.com>  Fri, 24 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.68-1) noble; urgency=medium

  * Audio routing on non-Nova-Pro-Wireless devices (#21): when the ALSA sink
    lookup failed for the attached device, the daemon fell back to a
    hardcoded
    alsa_output.usb-SteelSeries_Arctis_Nova_Pro_Wireless-00.analog-stereo
    sink name. On any other headset (e.g. Arctis Nova 7, Nova 3, Nova 5…),
    this sink does not exist, so the generated virtual sinks routed audio
    into the void and the headset disappeared from KDE / GNOME audio trays.
  * The PID comparison in pactl.py now parses both sides as integers, so it
    matches regardless of hex casing or 0x prefix differences across
    PipeWire versions.
  * configure_virtual_sinks now retries the sink lookup for up to ~4 s,
    giving PipeWire time to enumerate a freshly-attached USB audio card at
    boot.
  * If the exact PID is never exposed by PipeWire (some distros/kernels),
    ASM now falls back to any SteelSeries sink instead of the wrong
    hardcoded Pro Wireless default.
  * If no sink is found at all, ASM now logs a clear error with remediation
    steps and skips virtual sink setup instead of silently breaking audio.

 -- loteran <axel.valadon@gmail.com>  Fri, 24 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.67-1) noble; urgency=medium

  * Anonymous telemetry: each submission now includes an installation_id — a
    salted SHA-256 hash of /etc/machine-id (irreversible, no personal data).
    The server uses this ID to deduplicate unique users exactly, instead of
    grouping by (distro, headset). Falls back to a random UUID stored in
    ~/.config/arctis_manager/telemetry.yaml on systems where /etc/machine-id
    is unreadable.
  * Stats dashboard & README: all usage stats (distributions, headsets,
    versions, totals) are now computed per unique installation instead of
    per raw event. The KPI previously labelled "Data points" is now "Unique
    users".

 -- loteran <axel.valadon@gmail.com>  Fri, 24 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.65-1) noble; urgency=medium

  * DEB build: fixed CI release workflow failure —
    debian/91-steelseries-arctis.rules was removed from the repo but
    build-deb.sh still referenced it as a static file. The script now
    generates udev rules at build time via uv run python3
    scripts/generate_udev_rules.py.

 -- loteran <axel.valadon@gmail.com>  Wed, 22 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.60-1) noble; urgency=medium

  * udev rules (RPM/DEB): rules are now generated at build time from device
    YAMLs via scripts/generate_udev_rules.py — no more hardcoded rules that
    drift out of sync with the device definitions.
    debian/91-steelseries-arctis.rules removed.
  * asm-cli udev dump-rules: new subcommand that prints the generated udev
    rules to stdout (used by packaging scripts).
  * generate_udev_rules_content(): extracted as a public function in cli.py
    for reuse by both write-rules and dump-rules.

 -- loteran <axel.valadon@gmail.com>  Tue, 21 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.59-1) noble; urgency=medium

  * udev rules (RPM/DEB): add missing PID 0x1294 for Arctis Pro Wireless —
    the audio PID was never included in the installed rules file, causing
    [Errno 13] Access denied on Fedora/Nobara.
  * udev rules (RPM/DEB): remove ENV{DEVTYPE}=="usb_device" condition from
    all rules — this condition can fail silently on some kernels, preventing
    rules from matching.
  * udev rules (RPM/DEB): sync all PIDs with device yamls — add missing PIDs
    for Arctis 1/7X/7P Wireless, Arctis Pro 2019, Nova 3P/3X, Nova 7 Gen
    1/Gen 2.

 -- loteran <axel.valadon@gmail.com>  Tue, 21 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.53-1) noble; urgency=medium

  * Telemetry: added User-Agent header to outgoing requests — Cloudflare was
    silently returning 403 to Python-urllib, so no data was ever reaching
    the stats endpoint.

 -- loteran <axel.valadon@gmail.com>  Sat, 18 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.52-1) noble; urgency=medium

  * udev rules: clicking "Install rules" in the GUI now triggers a single
    password prompt instead of three — the file write, udevadm control
    --reload-rules and udevadm trigger are now bundled into one elevated
    shell script.

 -- loteran <axel.valadon@gmail.com>  Sat, 18 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.50-1) noble; urgency=medium

  * 73 new Sonar presets imported from SteelSeries Sonar v1.91 — game
    titles, Music and Movie categories (all names sanitized, no special
    characters).

 -- loteran <axel.valadon@gmail.com>  Fri, 17 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.49-1) noble; urgency=medium

  * 2 new Sonar presets: Podcast [Game], Podcast [Chat] — imported from
    SteelSeries Sonar v1.91.

 -- loteran <axel.valadon@gmail.com>  Fri, 17 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.48-1) noble; urgency=medium

  * Anonymous telemetry (opt-in): on first launch, ASM asks whether you want
    to share your Linux distribution, headset model and ASM version once per
    day. No personal data or IP address is stored. Can be toggled at any
    time in Settings.
  * Community stats dashboard: aggregated usage data is publicly visible at
    loteran.github.io/Arctis-Sound-Manager/stats.
  * Auto-updated README: the Supported Devices and Tested Distributions
    tables in the README are now updated automatically every week from
    telemetry data. Devices with 5+ user reports are promoted from ⚠️ to ✅
    automatically.

 -- loteran <axel.valadon@gmail.com>  Fri, 17 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.42-1) noble; urgency=medium

  * Dial interface auto-detection: the daemon now probes USB interfaces at
    startup to find the dial interface automatically, with a per-device
    cache to avoid re-probing on reconnect.
  * Arctis Nova 7: moved PID 0x227a to the correct nova_7_discrete_battery
    device definition.
  * CI: fixed aur-update and copr-build sync jobs rejecting push to develop
    when the branch advanced since checkout — now checkout develop directly
    before applying changes.

 -- loteran <axel.valadon@gmail.com>  Thu, 16 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.41-1) noble; urgency=medium

  * Arctis Pro Wireless: added alternate USB PID 0x1294 to device definition
    and introduced HID-aware device detection — the daemon now automatically
    selects the USB interface that exposes an HID class (bInterfaceClass ==
    3), fixing [Errno 13] Access denied on systems where the control
    interface is exposed under a different PID.

 -- loteran <axel.valadon@gmail.com>  Thu, 16 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.40-1) noble; urgency=medium

  * udev rules: removed GROUP="plugdev" from generated rules — the group
    does not exist on Fedora/RHEL and caused the entire rule line to be
    silently ignored, leaving the device inaccessible. MODE="0666" +
    TAG+="uaccess" are sufficient on all distros.
  * Bug report dialog: fixed clipboard copy (added activateWindow() +
    explicit QClipboard.Mode.Clipboard to fix silent failure on Wayland/VM);
    "Copy to clipboard" button now shows "Copied!" feedback for 2 s.
  * Bug report dialog: "Open GitHub issue" button now copies the report to
    the clipboard and opens a blank issue (title only) instead of encoding
    the full report in the URL, which exceeded GitHub's URL length limit.
  * RPM (Fedora): filter auto-generated versioned python dist requirements
    for ruamel-yaml and pyudev — Fedora 43 ships slightly older versions,
    causing dnf install to fail without --nodeps.
  * In-app update: the update button now detects the install method
    (rpm/pacman/apt/pipx) and shows the correct package-manager upgrade
    command (dnf upgrade / paru -Syu / apt upgrade) with a "Copy command"
    button instead of silently installing via pipx on managed installs.

 -- loteran <axel.valadon@gmail.com>  Wed, 15 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.38-1) noble; urgency=medium

  * Presets: God of War Ragnarök : renommé en God of War Ragnarok — le
    caractère ö causait également une erreur bsdtar lors du packaging.

 -- loteran <axel.valadon@gmail.com>  Tue, 14 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.37-1) noble; urgency=medium

  * AUR: packaging : uv pip install --prefix remplace uv pip download
    (sous-commande inexistante). Plus besoin de python-pip en makedep.
  * Presets: noms de fichiers : suppression des caractères ™ et ® dans les
    noms de fichiers de presets — causaient des erreurs bsdtar lors du
    packaging (impossible de traduire en UTF-8 dans l'environnement
    fakeroot).

 -- loteran <axel.valadon@gmail.com>  Tue, 14 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.36-1) noble; urgency=medium

  * Toutes les distros: permissions USB : règles udev générées avec plugdev
    group et sans ENV{DEVTYPE} check — fonctionne désormais sur Fedora,
    Ubuntu et toutes distros sans TAG+="uaccess" (cross-distro fix).

 -- loteran <axel.valadon@gmail.com>  Sun, 12 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.35-1) noble; urgency=medium

  * Toutes les distros: règles udev malformées : une règle par PID au lieu
    de plusieurs PIDs séparés par | dans ATTRS{idProduct} — syntaxe
    multi-valeur non supportée par toutes les versions de udev.

 -- loteran <axel.valadon@gmail.com>  Sun, 12 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.34-1) noble; urgency=medium

  * Ubuntu/Debian: python3-pulsectl and dbus-next absent des dépôts : les
    deux bibliothèques sont maintenant bundlées directement dans le .deb
    (comme dbus-next l'était déjà). Plus aucune dépendance apt non
    résolvable.
  * Ubuntu 22.04: python3-pyside6 absent des dépôts : le postinst détecte
    l'absence de PySide6 et installe automatiquement pyside6 via pip3 --user
    pour l'utilisateur réel ($SUDO_USER).
  * Toutes les distros: wireplumber absent des dépendances : ajouté dans
    Depends (.deb), Requires (RPM) et depends (AUR).
  * Fedora: python3-dbus-next absent des dépôts Fedora : bundlé dans le RPM
    via pip install --no-deps dans %install.
  * AUR: python-dbus-next et python-pulsectl AUR-only : bundlés dans le
    paquet AUR via pip install, retirés des depends — makepkg -si fonctionne
    sans AUR helper.
  * asm-setup jamais lancé automatiquement : le postinst/%post/.install
    détecte la session D-Bus active (/run/user/$UID/bus) et lance asm-setup
    immédiatement pour l'utilisateur réel. Fallback via
    /etc/xdg/autostart/asm-first-run.desktop si aucune session active.
  * asm-setup relancé à chaque login via autostart : asm-setup écrit un flag
    ~/.config/arctis_manager/.setup_done à la fin de l'installation ;
    l'autostart vérifie ce flag et ne tourne qu'une seule fois.
  * AUR: pas d'AUR helper sur install fraîche : le .install vérifie si yay
    ou paru est présent et installe yay-bin automatiquement si aucun n'est
    trouvé.

 -- loteran <axel.valadon@gmail.com>  Sun, 12 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.32-1) noble; urgency=medium

  * HeSuVi config deployed to wrong directory in asm-setup (AUR/COPR/DEB):
    sink-virtual-surround-7.1-hesuvi.conf was copied to pipewire.conf.d/
    instead of filter-chain.conf.d/, recreating the duplicate-node bug (#14)
    on every package install.
  * filter-chain.service missing on Fedora and Ubuntu: the service is not
    shipped by default on these distros. A bundled filter-chain.service is
    now included in all packages and auto-installed by asm-setup and
    install.sh when the system service is absent.
  * Hardcoded Nova Pro Wireless node.target in PipeWire static configs:
    10-arctis-virtual-sinks.conf and sink-virtual-surround-7.1-hesuvi.conf
    contained a hardcoded ALSA sink name — all three virtual sinks
    (Game/Chat/Media) were silent on startup for any headset other than Nova
    Pro Wireless. Removed; sinks now connect to the default sink until the
    daemon reconfigures them.
  * plate_1423 LADSPA plugin always injected in HeSuVi config: the Distance
    reverb node (requires swh-plugins) was generated unconditionally,
    causing virtual surround to fail silently when swh-plugins is not
    installed. Now only generated when Distance > 0.
  * APPLICATIONS_PATH not created before desktop entry write: asm-cli
    desktop write crashed with FileNotFoundError on a fresh install where
    ~/.local/share/applications/ did not exist.
  * ensure_systemd_unit() crash on non-systemd distros: FileNotFoundError
    uncaught when systemctl is absent, crashing the GUI at startup. Added
    shutil.which('systemctl') guard and try/except.
  * PipeWire restarted after filter-chain in asm-setup: PipeWire must
    restart before filter-chain is enabled so it picks up new configs. Order
    corrected.
  * Duplicate desktop launcher on package installs: asm-setup now skips
    asm-cli desktop write when a system-level desktop entry already exists
    (AUR/COPR/DEB).
  * install.sh: set -euo pipefail, wheel presence check, HRIR file size
    validation after download, filter-chain service auto-detection across
    distros.
  * setup-surround.sh: aligned with install.sh (correct filter-chain.conf.d/
    target, HRIR validation, filter-chain service detection, set -euo
    pipefail).
  * arctis-manager.service: added After=pipewire.service
    pipewire-pulse.service and Wants=pipewire.service in all templates.
  * debian/postinst: complete instructions pointing to asm-setup to enable
    all services.

 -- loteran <axel.valadon@gmail.com>  Sat, 11 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.27-1) noble; urgency=medium

  * Silent Game channel persists after Sonar mode switch (issue #14, root
    cause): install.sh deploys the HeSuVi config to pipewire.conf.d/ (loaded
    by the main PipeWire process). When Sonar EQ is enabled, ASM also
    generates a dynamic config into filter-chain.conf.d/. Both files
    register the same node name (effect_input.virtual-surround-7.1-hesuvi),
    causing a conflict that leaves the game EQ routing to a non-existent
    node — audio disappears silently. Fixed by:
  * generate_hesuvi_conf() now removes the static copy from pipewire.conf.d/
    when writing the dynamic version.
  * check_and_fix_stale_configs() now detects and removes the conflict on
    daemon startup.
  * ensure_sonar_eq_configs() now validates existing config content (channel
    count, target sink) and regenerates stale files, not just missing ones.

 -- loteran <axel.valadon@gmail.com>  Fri, 10 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.26-1) noble; urgency=medium

  * Silent Game channel on first Sonar mode switch (issue #14): when
    switching to Sonar EQ for the first time, Arctis_Game was rerouted to
    effect_input.sonar-game-eq before sonar-game-eq.conf existed. The node
    was never created, leaving the Game sink connected to nothing. Fixed by
    calling ensure_sonar_eq_configs() before generate_virtual_sinks_conf()
    in the mode-switch worker, and from check_and_fix_stale_configs() at
    startup.

 -- loteran <axel.valadon@gmail.com>  Fri, 10 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.25-1) noble; urgency=medium

  * install.sh PATH regression (issue #3): export
    PATH="$HOME/.local/bin:$PATH" was only executed inside the uv install
    block. On a reinstall (uv already present), all asm-cli and asm-daemon
    calls silently failed with *command not found*, preventing udev rule
    installation, service file creation, and systemctl enable. PATH is now
    exported unconditionally at the top of the script.

 -- loteran <axel.valadon@gmail.com>  Fri, 10 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.21-1) noble; urgency=medium

  * PPA source build: replaced debuild -- --no-pre-clean with
    dpkg-buildpackage -S --no-pre-clean — debuild was injecting
    --rules-target before the extra argument, calling debian/rules
    --no-pre-clean as a make target (exit 2). dpkg-buildpackage accepts
    --no-pre-clean directly and skips the clean step so debian/wheels/
    survives into the source package.

 -- loteran <axel.valadon@gmail.com>  Thu, 09 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.20-1) noble; urgency=medium

  * PPA build failure (Failed to build on Launchpad): debuild -S runs
    debian/rules clean before packaging the source, deleting debian/wheels/
    — Launchpad received a source package without wheels and couldn't
    download them (no internet in sandbox). Fixed by:
  * Adding --no-pre-clean to debuild -S so wheels survive source packaging
  * Removing debian/wheels from override_dh_auto_clean so Launchpad's
    pre-build clean doesn't destroy them either

 -- loteran <axel.valadon@gmail.com>  Thu, 09 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.19-1) noble; urgency=medium

  * PPA upload workflow: removed oracular (Ubuntu 24.10, EOL since July
    2025) from the target matrix — Launchpad no longer accepts uploads for
    this series. Only noble (24.04 LTS) is targeted.

 -- loteran <axel.valadon@gmail.com>  Thu, 09 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.18-1) noble; urgency=medium

  * PPA upload workflow: sed pattern (.*) in basic regex matched only
    literal parentheses, leaving the previous distroseries name in place —
    Launchpad rejected uploads with Unable to find distroseries: oracular
    noble. Fixed by replacing the entire first changelog line.

 -- loteran <axel.valadon@gmail.com>  Thu, 09 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.17-1) noble; urgency=medium

  * Arctis Nova Pro Wired config (0x12cb / 0x12cd): corrected two issues
    found via hardware testing (asm-cli tools arctis-devices):
  * command_transport: ctrl_output — device has no interrupt OUT endpoint,
    commands must be sent via HID SET_REPORT
  * command_padding.length: 16 — IN endpoint MaxPacketSize is 16 bytes (was
    incorrectly set to 64)

 -- loteran <axel.valadon@gmail.com>  Thu, 09 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.16-1) noble; urgency=medium

  * Arctis Nova Pro Wired support (0x12cb) and its Xbox variant (0x12cd):
    sidetone, mic volume, mic LED brightness, audio gain (low/high),
    ChatMix, EQ. Protocol confirmed from reverse-engineering of the Nova Pro
    family (shared HID interface 4, same 0x06-prefixed command set as Nova
    Pro Wireless).

 -- loteran <axel.valadon@gmail.com>  Wed, 08 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.15-1) noble; urgency=medium

  * Context-aware privilege elevation (sudo_it): the elevation tool is now
    chosen based on the execution context rather than tried blindly in a
    fixed order:
  * Terminal (TTY) → sudo first (native prompt), then graphical tools as
    fallback
  * GUI / no TTY → DE-specific graphical tools (kdesu on KDE, lxqt-sudo on
    LXQt) then pkexec — sudo is never attempted without a TTY
  * Headless / no display → sudo only (service context, NOPASSWD sudoers)
  * Prints an actionable hint when no tool is found in headless context

 -- loteran <axel.valadon@gmail.com>  Wed, 08 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.14-1) noble; urgency=medium

  * udev rules check at startup: GUI shows a dialog at startup when udev
    rules are missing or invalid, with an "Install rules" button that runs
    the fix automatically (requires administrator password). The daemon also
    logs a warning on the same condition.
  * sudo_it() fallback: now tries sudo if pkexec is unavailable or fails,
    and catches CalledProcessError instead of crashing.
  * write_udev_rules() blocking input(): removed interactive prompt that
    caused hangs in non-interactive installs (scripts, TTY-less
    environments).
  * write_udev_rules() fragile echo escaping: replaced shell echo "..."
    (broken on special chars like !, $) with a temp file + cp approach when
    writing with elevated privileges.
  * reload_udev_rules() unhandled exception: CalledProcessError from udevadm
    is now caught and reported cleanly.

 -- loteran <axel.valadon@gmail.com>  Wed, 08 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.13-1) noble; urgency=medium

  * DeviceConfiguration uninitialized attributes: device_init and status
    could raise AttributeError on devices missing these optional YAML fields
    — now always initialized to None.
  * Settings SELECT widget crash: IndexError/KeyError when options list is
    empty or not yet loaded — callback now guards bounds before calling.
  * device_state thread safety: module-level globals now protected by
    threading.Lock, preventing torn reads between USB monitor thread and
    main loop.
  * PipeWire node.target = "": output channel EQ configs omitted the
    property entirely when target is empty (invalid SPA JSON value).
  * command_interface_index type annotation: was annotated as tuple[int,
    int], actual type is list[int].

 -- loteran <axel.valadon@gmail.com>  Sat, 04 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.12-1) noble; urgency=medium

  * LADSPA control parameters: noise gate, RNNoise noise cancellation, and
    SC4M compressor were silently broken — missing = signs in PipeWire
    filter-chain control syntax caused all mic processing nodes to have no
    effect.
  * check_and_fix_stale_configs: output channel stale configs were
    incorrectly routed to the physical device instead of passthrough.
  * get_physical_source() retry: microphone source detection now retries 15×
    on PulseAudio error, matching sink detection resilience.
  * D-Bus wrapper: all async D-Bus methods now guard against connection
    failure; the status/settings polling loop no longer crashes permanently
    on a transient D-Bus error.

 -- loteran <axel.valadon@gmail.com>  Sat, 04 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.11-1) noble; urgency=medium

  * HeSuVi universal surround: Spatial Audio (7.1 HeSuVi) now works on all
    supported headsets, not just the Nova Pro Wireless.
  * Device-aware PipeWire configs: ALSA node names are discovered
    dynamically at device connect, fixing audio routing for Nova 5, Nova 7,
    Arctis 7, Arctis 9, Arctis Pro Wireless, and more.
  * Microphone source discovery: physical microphone node auto-detected by
    USB vendor/product ID.
  * Audio routing configs were hardcoded for the Nova Pro Wireless ALSA
    names, causing broken Sonar EQ and surround for all other headsets.

 -- loteran <axel.valadon@gmail.com>  Sat, 04 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.7-1) noble; urgency=medium

  * One-click update: "Update now" button in the update banner downloads and
    installs the latest version automatically via pipx/pip, then restarts
    the daemon and GUI.

 -- loteran <axel.valadon@gmail.com>  Wed, 01 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.6-1) noble; urgency=medium

  * Debian/Ubuntu packaging: .deb package built automatically and attached
    to GitHub releases.
  * Launchpad PPA: ppa:loteran/arctis-sound-manager for easy apt install on
    Ubuntu 24.04+.
  * PPA upload workflow: GitHub Actions automatically uploads source
    packages to PPA on each release.

 -- loteran <axel.valadon@gmail.com>  Wed, 01 Apr 2026 00:00:00 +0000

arctis-sound-manager (1.0.4-1) noble; urgency=medium

  * External output volume: HDMI/sound card volume card on home page with
    auto-detection of non-SteelSeries sinks.
  * Stream routing to output: "O" button on app tags routes streams through
    the output EQ node.
  * Sonar Output EQ: new Equalizer tab with 8ch 7.1 parametric EQ for
    external output (no HeSuVi surround).
  * Configurable output device: Settings dropdown to select external output
    sink.
  * Update notification: banner on home page when a newer release is
    available (checks GitHub once/day).
  * Clean exit: Exit from systray stops all ASM services and restarts
    pipewire.
  * Output EQ not applying: filter-chain capture node used
    Audio/Sink/Internal; changed to Audio/Sink for the output channel.
  * Audio loss on preset apply: output channel now only restarts
    filter-chain instead of full pipewire stack.
  * Apps invisible after routing to output: streams routed through EQ now
    appear on the Output card.
  * Settings layout: fixed label widths, toggle alignment, dropdown sizing.

 -- loteran <axel.valadon@gmail.com>  Sun, 29 Mar 2026 00:00:00 +0000

arctis-sound-manager (1.0.1-1) noble; urgency=medium

  * ANC/Transparent mode stuck: device init sequence hardcoded ANC off,
    preventing GUI toggle when settings had a different saved value. Init
    now uses settings.noise_cancelling / settings.transparent_level
    references.

 -- loteran <axel.valadon@gmail.com>  Sun, 29 Mar 2026 00:00:00 +0000

arctis-sound-manager (1.0.0-1) noble; urgency=medium

  * Sonar EQ system: full parametric EQ via PipeWire filter-chain biquad
    filters
  * Interactive EQ curve widget with draggable bands
  * Game (8ch 7.1) / Chat (2ch stereo) / Microphone tabs
  * Preset system with 297+ presets, save/load, favorites
  * Macro sliders: Bass, Voice, Treble
  * Spatial Audio toggle with HeSuVi 7.1 virtual surround
  * Volume Boost and Smart Volume (dynamic compressor SC4M)
  * Micro processing: AI Noise Cancellation (rnnoise), Noise Gate,
    Compressor
  * ANC / Transparent mode control from GUI
  * 4-channel audio mixer (Game / Chat / Media)
  * Automatic media routing via asm-router
  * Device status: battery, mic mute, sidetone
  * 10-band Custom EQ with save/load presets
  * Full i18n: English, French, Spanish
  * AUR package
  * 56 unit tests

 -- loteran <axel.valadon@gmail.com>  Sat, 28 Mar 2026 00:00:00 +0000
