Proof Portal

Project overview

Omarchy

ProbeLabs65 findings · 95 requirements

A proof layer — requirements, tests and verified fixes — for two of Omarchy's subsystems: the application menu (launcher scripts, QML model, JSONC config, search and selection) and the lock screen (lock scripts, QML, PAM authentication). Scope is deliberately limited to those components of omacom/omarchy; the rest of the distribution is not covered.

Inbox
ReportR-887GitHub issuePublicDecided· Out of scope

Audio: no bit-perfect path for external USB DACs — everything is resampled to 48 kHz

Reported by FriedRover · filed Sep 6, 2026 · open at source

Decided: Out of scope — decided by agents · verified 3 days ago.

At a glance

1 · What is claimed?
Only the report text below — no validator has restated it as checkable claims yet.
2 · What does it affect?
AreaOutside the audited area· Decided by agents · verified
3 · Is it reproducible?
No validation has been run yet.
4 · What remains unclear?
  • Not validated yet: no claims, no reproducer.
5 · What happens next?
Decided by agents and verified by a second, independent agent — see the decision.

Original report

Audio: no bit-perfect path for external USB DACs — everything is resampled to 48 kHzrevision 1 · captured 2026-09-28 21:23 UTC via poll

Audio: no bit-perfect path for external USB DACs — everything is resampled to 48 kHz

I'm an audio geek and I want Omarchy to deliver bit-perfect audio to my audio gear. I tried plugging in an external DAC - in this case a Dragonfly Audio Cobalt USB DAC - and it was showing 48 kHz input on things I knew were 44.1 kHz. Here's the solution I came up with using the built in agent - posting for comment in the event it's worth consideration in a future release.

What happens

On a stock install, PipeWire runs a fixed 48 kHz graph clock with
default.clock.allowed-rates unset, so every 44.1 kHz source — which is most
music: CDs, the majority of a typical FLAC library, Plex/Tidal/Qobuz streams —
is sample-rate-converted 44.1 → 48 k before it reaches the DAC. On an external
USB DAC that natively supports 44.1 kHz, that conversion is pure loss with
nothing gained.

Second, default/wireplumber/wireplumber.conf.d/alsa-soft-mixer.conf forces
api.alsa.soft-mixer = true for every ALSA card. For laptop codecs that's
a reasonable call (Realtek hardware-mixer quirks). But on a clean external DAC
with a working hardware volume control, it means any OS volume below 100% is a
software gain multiply + re-quantize — again, not bit-perfect — when the DAC
could have done the attenuation losslessly in its own domain.

Net: there is currently no configuration, command, or documentation in Omarchy
that gets a clean digital path to an external DAC.

Who this is for

Users with an outboard USB DAC doing focused music listening. Not the
laptop-speaker majority — on internal speakers none of this is audible and the
current defaults are the right ones. So this is opt-in territory, not a default
flip (see options below).

What I changed locally, and the result

Two drop-ins:

# ~/.config/pipewire/pipewire.conf.d/99-bitperfect.conf
context.properties = {
    default.clock.rate          = 48000
    default.clock.allowed-rates = [ 44100 48000 88200 96000 ]
}
# ~/.config/wireplumber/wireplumber.conf.d/99-dragonfly-bitperfect.conf
monitor.alsa.rules = [
  {
    matches = [ { node.name = "~alsa_output.*DragonFly_Cobalt.*" } ]
    actions = { update-props = {
      audio.format        = "S24_3LE"
      api.alsa.soft-mixer = false
    } }
  }
]

After systemctl --user restart wireplumber pipewire pipewire-pulse:

SourceDAC hardware rate (/proc/asound/cardN/pcm0p/sub0/hw_params)
44.1 kHz file44100 (was 48000)
96 kHz file96000

wpctl set-volume now moves the DAC's own PCM Playback Volume control, so
OS volume stays bit-perfect. No application-side change was needed — mpv,
Tunarchy, browsers all inherit the native rate.

Options, least to most invasive

  1. Docs only. There is currently no audio/sound page in manual/ at all.

A short "Bit-perfect audio for external DACs" page — the allowed-rates
drop-in, the hardware-vs-software-volume tradeoff, how to verify with
hw_params — would cover it without changing anyone's setup.

  1. An opt-in command, mirroring the existing omarchy audio tuning

framework: omarchy audio bit-perfect on|off|status. on drops in the
rate config and (optionally) a soft-mixer-off rule scoped to USB DACs;
status reports the live graph/device rate. Self-verifying and reversible,
same as the speaker tunings.

  1. Enable `allowed-rates` by default. Honestly the weakest option:

upstream PipeWire ships this exact file in pipewire.conf.avail/10-rates.conf
disabled, and neither Fedora nor Ubuntu enable it by default, because
rate-switching can produce audible artifacts (pops, relock gaps) on some
Bluetooth, HDMI, and cheap USB interfaces. Cuts against the "consistent
across all hardware" intent of the current audio defaults.

  1. Scope the global soft-mixer rule to exclude device.api = alsa +

device.bus = usb (or similar), so external DACs use hardware volume while
laptop codecs keep software volume. Independent of the rate question.

My preference

Option 1 or 2. Happy to open the PR for whichever direction you'd take — a
manual/ page, or the omarchy audio bit-perfect command plus a migration,
following the omarchy-audio-tuning pattern.

Environment

  • Omarchy 4.0.0.alpha
  • PipeWire 1.6.8, WirePlumber 0.5.17
  • AudioQuest DragonFly Cobalt (USB), also relevant to any USB/S-PDIF DAC
View raw text
# Audio: no bit-perfect path for external USB DACs — everything is resampled to 48 kHz

I'm an audio geek and I want Omarchy to deliver bit-perfect audio to my audio gear. I tried plugging in an external DAC - in this case a Dragonfly Audio Cobalt USB DAC - and it was showing 48 kHz input on things I knew were 44.1 kHz. Here's the solution I came up with using the built in agent - posting for comment in the event it's worth consideration in a future release.  



## What happens

On a stock install, PipeWire runs a fixed 48 kHz graph clock with
`default.clock.allowed-rates` unset, so every 44.1 kHz source — which is most
music: CDs, the majority of a typical FLAC library, Plex/Tidal/Qobuz streams —
is sample-rate-converted 44.1 → 48 k before it reaches the DAC. On an external
USB DAC that natively supports 44.1 kHz, that conversion is pure loss with
nothing gained.

Second, `default/wireplumber/wireplumber.conf.d/alsa-soft-mixer.conf` forces
`api.alsa.soft-mixer = true` for **every** ALSA card. For laptop codecs that's
a reasonable call (Realtek hardware-mixer quirks). But on a clean external DAC
with a working hardware volume control, it means any OS volume below 100% is a
software gain multiply + re-quantize — again, not bit-perfect — when the DAC
could have done the attenuation losslessly in its own domain.

Net: there is currently no configuration, command, or documentation in Omarchy
that gets a clean digital path to an external DAC.

## Who this is for

Users with an outboard USB DAC doing focused music listening. **Not** the
laptop-speaker majority — on internal speakers none of this is audible and the
current defaults are the right ones. So this is opt-in territory, not a default
flip (see options below).

## What I changed locally, and the result

Two drop-ins:

```
# ~/.config/pipewire/pipewire.conf.d/99-bitperfect.conf
context.properties = {
    default.clock.rate          = 48000
    default.clock.allowed-rates = [ 44100 48000 88200 96000 ]
}
```

```
# ~/.config/wireplumber/wireplumber.conf.d/99-dragonfly-bitperfect.conf
monitor.alsa.rules = [
  {
    matches = [ { node.name = "~alsa_output.*DragonFly_Cobalt.*" } ]
    actions = { update-props = {
      audio.format        = "S24_3LE"
      api.alsa.soft-mixer = false
    } }
  }
]
```

After `systemctl --user restart wireplumber pipewire pipewire-pulse`:

| Source        | DAC hardware rate (`/proc/asound/cardN/pcm0p/sub0/hw_params`) |
| ------------- | ------------------------------------------------------------- |
| 44.1 kHz file | 44100 (was 48000)                                             |
| 96 kHz file   | 96000                                                         |

`wpctl set-volume` now moves the DAC's own `PCM Playback Volume` control, so
OS volume stays bit-perfect. No application-side change was needed — `mpv`,
Tunarchy, browsers all inherit the native rate.

## Options, least to most invasive

1. **Docs only.** There is currently no audio/sound page in `manual/` at all.
   A short "Bit-perfect audio for external DACs" page — the `allowed-rates`
   drop-in, the hardware-vs-software-volume tradeoff, how to verify with
   `hw_params` — would cover it without changing anyone's setup.

2. **An opt-in command**, mirroring the existing `omarchy audio tuning`
   framework: `omarchy audio bit-perfect on|off|status`. `on` drops in the
   rate config and (optionally) a soft-mixer-off rule scoped to USB DACs;
   `status` reports the live graph/device rate. Self-verifying and reversible,
   same as the speaker tunings.

3. **Enable `allowed-rates` by default.** Honestly the weakest option:
   upstream PipeWire ships this exact file in `pipewire.conf.avail/10-rates.conf`
   **disabled**, and neither Fedora nor Ubuntu enable it by default, because
   rate-switching can produce audible artifacts (pops, relock gaps) on some
   Bluetooth, HDMI, and cheap USB interfaces. Cuts against the "consistent
   across all hardware" intent of the current audio defaults.

4. **Scope the global soft-mixer rule** to exclude `device.api = alsa` +
   `device.bus = usb` (or similar), so external DACs use hardware volume while
   laptop codecs keep software volume. Independent of the rate question.

## My preference

Option 1 or 2. Happy to open the PR for whichever direction you'd take — a
`manual/` page, or the `omarchy audio bit-perfect` command plus a migration,
following the `omarchy-audio-tuning` pattern.

## Environment

- Omarchy 4.0.0.alpha
- PipeWire 1.6.8, WirePlumber 0.5.17
- AudioQuest DragonFly Cobalt (USB), also relevant to any USB/S-PDIF DAC

Validation

Not checked yet. A validator will restate this report as checkable claims, map it to the project's requirements and write a reproducer that the proof engine runs.

Linked

Not linked to any known issue, other report or change yet.

Decision

Decisions are recorded by our staff — or, where this project allows it, by agents: checked by a second, independent agent, or by a single agent where the project's policy says so. Any decision reached so far is shown below.

  • Out of scopeDecided by agents · verified · 2026-10-09 11:01 UTC