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-4785GitHub issuePublicReceived

Selecting a Bluetooth headset input can leave it in A2DP with a silent microphone

Reported by filipechagas · filed Aug 31, 2026Closed upstream on 2026-09-02 by its own reporter filipechagas. GitHub close reason: completed. Closed by its own reporter — not by itself evidence of a fix.

Received and recorded verbatim. Nothing has been checked yet.

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?
Not yet mapped to any requirement or component.
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?
Our staff decide whether the report is valid. Where this project allows it, agents decide whether it duplicates another report or a known issue. No decision has been recorded yet.

Original report

Selecting a Bluetooth headset input can leave it in A2DP with a silent microphonerevision 1 · captured 2026-10-04 12:03 UTC via poll

System details

  • Omarchy: 4.0.0-1
  • Machine: Lenovo ThinkPad P14s Gen 6 AMD (Ryzen AI 7 PRO 350 / Radeon 860M)
  • Kernel: 7.1.8-arch1-3
  • PipeWire: 1.6.8-1
  • WirePlumber: 0.5.15-1
  • BlueZ: 5.87-2
  • Quickshell: 0.3.0.r20.g28771c7-1
  • Headset used for reproduction: HUAWEI FreeBuds Pro 5
  • Reproduced on two separate Omarchy machines with the same headset

What is wrong?

The Omarchy audio panel lists the Bluetooth headset under Input and allows it to be selected. The row becomes highlighted and PipeWire records the Bluetooth loopback source as the default, but the headset can remain in playback-only A2DP. Applications then receive no microphone signal even though the panel visibly says the Bluetooth input is selected.

The headset advertises HFP correctly, and manually changing the card to headset-head-unit immediately makes the microphone work. This does not appear to be specific to Huawei; any classic Bluetooth headset that uses A2DP for playback and HFP/HSP for duplex audio may be affected.

Steps to reproduce

  1. Connect a Bluetooth headset that supports A2DP and HFP/HSP.
  2. Leave it in its normal high-fidelity A2DP profile.
  3. Start an application with an active capture stream, such as OBS, a browser call, or a microphone test.
  4. Open the Omarchy audio panel.
  5. Select the Bluetooth headset under Input.
  6. Observe that the Bluetooth input is highlighted but the microphone remains silent.
  7. Check the card profile with pactl list cards: it can still report Active Profile: a2dp-sink.
  8. Run pactl set-card-profile bluez_card.<MAC> headset-head-unit. The microphone starts working immediately.

Expected behavior

Selecting a Bluetooth headset input while a capture stream is active should result in a working input. WirePlumber should transition the card to the preferred duplex HFP profile, and return it to A2DP after capture ends.

Actual behavior

The UI and default-source metadata change, but the profile transition does not reliably complete. The user is left with a selected but silent Bluetooth microphone until HFP is activated manually.

Diagnostics

WirePlumber autoswitch is enabled:

$ wpctl settings bluetooth.autoswitch-to-headset-profile
Value: true

The device exposes valid profiles:

a2dp-sink: High Fidelity Playback (A2DP Sink, codec AAC) (sinks: 1, sources: 0, available: yes)
headset-head-unit-cvsd: Headset Head Unit (HSP/HFP, codec CVSD) (sinks: 1, sources: 1, available: yes)
headset-head-unit: Headset Head Unit (HSP/HFP, codec MSBC) (sinks: 1, sources: 1, available: yes)

After selecting the headset input, the stable WirePlumber loopback source is correctly saved as the default:

Audio/Source  bluez_input.<MAC-with-colons>

At the time of the failed transition, WirePlumber logged this twice:

wp-event-dispatcher: <WpAsyncEventHook:...> failed: <WpSiStandardLink:...> link failed: item deactivated before format was set

The relevant helper is bin/omarchy-audio-input-set-default. It sets both defaults and then immediately moves every active source output:

wpctl set-default "$node_id" 2>/dev/null || true
pactl set-default-source "$source_name" 2>/dev/null || true

pactl list short source-outputs 2>/dev/null | awk '{ print $1 }' | while read -r output; do
  [[ -n $output ]] && pactl move-source-output "$output" "$source_name" 2>/dev/null || true
done

A possible failure mode is a race between moving the active capture stream and WirePlumber replacing the A2DP graph with the HFP graph. The helper suppresses move/link errors and has no wait or retry, so the panel can report success even when the stream did not become usable.

Workaround

pactl set-default-source bluez_input.<MAC-with-colons>
pactl set-card-profile bluez_card.<MAC-with-underscores> headset-head-unit

Return to high-quality playback afterward with:

pactl set-card-profile bluez_card.<MAC-with-underscores> a2dp-sink

Related reports

  • #1734 reported AirPods Pro 2 playback/microphone profile problems, but it predates the current Omarchy audio panel and is closed.
  • #1818 covered Bluetooth devices missing from the audio device list rather than a listed and selected source failing to activate.
  • wwmm/easyeffects#4878 describes a similar open WirePlumber limitation where access through a virtual/filter source does not trigger the hands-free profile.
View raw text
### System details

- Omarchy: 4.0.0-1
- Machine: Lenovo ThinkPad P14s Gen 6 AMD (Ryzen AI 7 PRO 350 / Radeon 860M)
- Kernel: 7.1.8-arch1-3
- PipeWire: 1.6.8-1
- WirePlumber: 0.5.15-1
- BlueZ: 5.87-2
- Quickshell: 0.3.0.r20.g28771c7-1
- Headset used for reproduction: HUAWEI FreeBuds Pro 5
- Reproduced on two separate Omarchy machines with the same headset

### What is wrong?

The Omarchy audio panel lists the Bluetooth headset under **Input** and allows it to be selected. The row becomes highlighted and PipeWire records the Bluetooth loopback source as the default, but the headset can remain in playback-only A2DP. Applications then receive no microphone signal even though the panel visibly says the Bluetooth input is selected.

The headset advertises HFP correctly, and manually changing the card to `headset-head-unit` immediately makes the microphone work. This does not appear to be specific to Huawei; any classic Bluetooth headset that uses A2DP for playback and HFP/HSP for duplex audio may be affected.

### Steps to reproduce

1. Connect a Bluetooth headset that supports A2DP and HFP/HSP.
2. Leave it in its normal high-fidelity A2DP profile.
3. Start an application with an active capture stream, such as OBS, a browser call, or a microphone test.
4. Open the Omarchy audio panel.
5. Select the Bluetooth headset under **Input**.
6. Observe that the Bluetooth input is highlighted but the microphone remains silent.
7. Check the card profile with `pactl list cards`: it can still report `Active Profile: a2dp-sink`.
8. Run `pactl set-card-profile bluez_card.<MAC> headset-head-unit`. The microphone starts working immediately.

### Expected behavior

Selecting a Bluetooth headset input while a capture stream is active should result in a working input. WirePlumber should transition the card to the preferred duplex HFP profile, and return it to A2DP after capture ends.

### Actual behavior

The UI and default-source metadata change, but the profile transition does not reliably complete. The user is left with a selected but silent Bluetooth microphone until HFP is activated manually.

### Diagnostics

WirePlumber autoswitch is enabled:

```text
$ wpctl settings bluetooth.autoswitch-to-headset-profile
Value: true
```

The device exposes valid profiles:

```text
a2dp-sink: High Fidelity Playback (A2DP Sink, codec AAC) (sinks: 1, sources: 0, available: yes)
headset-head-unit-cvsd: Headset Head Unit (HSP/HFP, codec CVSD) (sinks: 1, sources: 1, available: yes)
headset-head-unit: Headset Head Unit (HSP/HFP, codec MSBC) (sinks: 1, sources: 1, available: yes)
```

After selecting the headset input, the stable WirePlumber loopback source is correctly saved as the default:

```text
Audio/Source  bluez_input.<MAC-with-colons>
```

At the time of the failed transition, WirePlumber logged this twice:

```text
wp-event-dispatcher: <WpAsyncEventHook:...> failed: <WpSiStandardLink:...> link failed: item deactivated before format was set
```

The relevant helper is `bin/omarchy-audio-input-set-default`. It sets both defaults and then immediately moves every active source output:

```bash
wpctl set-default "$node_id" 2>/dev/null || true
pactl set-default-source "$source_name" 2>/dev/null || true

pactl list short source-outputs 2>/dev/null | awk '{ print $1 }' | while read -r output; do
  [[ -n $output ]] && pactl move-source-output "$output" "$source_name" 2>/dev/null || true
done
```

A possible failure mode is a race between moving the active capture stream and WirePlumber replacing the A2DP graph with the HFP graph. The helper suppresses move/link errors and has no wait or retry, so the panel can report success even when the stream did not become usable.

### Workaround

```bash
pactl set-default-source bluez_input.<MAC-with-colons>
pactl set-card-profile bluez_card.<MAC-with-underscores> headset-head-unit
```

Return to high-quality playback afterward with:

```bash
pactl set-card-profile bluez_card.<MAC-with-underscores> a2dp-sink
```

### Related reports

- #1734 reported AirPods Pro 2 playback/microphone profile problems, but it predates the current Omarchy audio panel and is closed.
- #1818 covered Bluetooth devices missing from the audio device list rather than a listed and selected source failing to activate.
- wwmm/easyeffects#4878 describes a similar open WirePlumber limitation where access through a virtual/filter source does not trigger the hands-free profile.

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.

No decision has been recorded yet.