Zorin OS Bluetooth call-mode issue with OnePlus Buds 3: A2DP playback works, HFP/HSP mic+audio unreliable for Google Meet

Zorin OS Bluetooth Call-Mode Issue (OnePlus Buds 3)

Summary

I am reporting a reproducible Bluetooth audio/call-mode issue on Zorin OS (Ubuntu Jammy base) with OnePlus Buds 3.

  • A2DP playback works
  • During calls (Google Meet), mic + audio via HFP/HSP is unreliable (device/profile availability and connection failures)

This blocks daily call workflow and appears related to profile switching / HFP negotiation rather than simple pairing.

Environment

  • Distro: Zorin OS (Jammy-based)
  • Ubuntu codename: jammy
  • Kernel: 6.8.0-90-generic
  • Headset: OnePlus Buds 3
  • Audio stack: PipeWire + WirePlumber (wireplumber 0.4.8, pipewire 1.0.7)
  • BlueZ: 5.64
  • bluetooth.service: active/running

Expected behavior

  • Stable headset call mode in Google Meet
  • mic + output available together
  • predictable profile switching
  • no repeated connect/switch failures

Actual behavior

Observed errors during troubleshooting/pair attempts:

  • org.bluez.Error.NotReady
  • Device ... not available
  • org.bluez.Error.AuthenticationRejected
  • org.bluez.Error.Failed br-connection-refused

Also observed stale PipeWire default node references to an old Buds MAC at one point, suggesting residual routing/profile state.

Reproduction (high-level)

  1. Pair/connect OnePlus Buds 3
  2. Verify normal playback profile works
  3. Start Google Meet and use BT headset for mic + output
  4. Observe unreliable call profile behavior (errors above)

Why this looks like stack/policy issue

  • A2DP path is more stable than duplex call path
  • Failures cluster around profile negotiation/switching
  • Similar reports exist from other Zorin users with different headsets

Community references (Zorin Forum)

SONY auto-switching to headset/handsfree on Zorin 18

PulseAudio/PipeWire services and Bluetooth audio quality

Audio help - handsfree

Unable to switch Bluetooth profile to HFP in Zorin OS 17

Community references (Reddit r/zorinos)

BT connects but does not appear in wpctl / no audio
https://www.reddit.com/r/zorinos/comments/1qd8y7n/solved_bluetooth_headphone_connects_but_does_not/

Difficult connect + stutter + disconnect
https://www.reddit.com/r/zorinos/comments/1qxc2zh/bluetooth_headphones_difficult_to_connect_insane/

Audio quality degraded on Bluetooth headset
https://www.reddit.com/r/zorinos/comments/1pa8uet/audio_quality_in_my_bluetooth_headset/

Upstream references

WirePlumber Bluetooth configuration

WirePlumber well-known settings

PipeWire Bluetooth devices overview

Requested help

  1. Confirm whether this is a known issue/regression on Jammy-era Zorin + PipeWire/WirePlumber + some BT headsets
  2. Recommend the supported policy/backend path for stable HFP/HSP call mode
  3. I can provide full logs if needed:
    • journalctl -b -u bluetooth
    • journalctl --user -b -u wireplumber -u pipewire -u pipewire-pulse
    • bluetoothctl transcript during pair/switch/call start

Impact

High impact: frequent Google Meet calls require reliable Bluetooth mic + output.

Using Brave A.I. search via Mojeek for Ubuntu 22.04 gives:

" PipeWire HFP Profile Configuration for Google Meet on Ubuntu 22.04

To resolve HFP (Hands-Free Profile) issues with Bluetooth headsets in Google Meet on Ubuntu 22.04 using PipeWire, follow these steps:

  • Ensure PipeWire and WirePlumber are installed and active :
sudo apt install pipewire-media-session wireplumber
systemctl --user enable --now wireplumber

WirePlumber (version 0.4.8+) enables automatic profile switching between A2DP and HFP when microphone access is needed.

  • Verify PipeWire is running : Run pactl info and confirm the server string shows "PulseAudio (on PipeWire)" .
  • Enable WebRTC PipeWire Capturer in Chrome/Chromium : Navigate to chrome://flags/#enable-webrtc-pipewire-capturer and set "WebRTC PipeWire support" to "Enabled" . This is essential for screen sharing and microphone access in web apps like Google Meet.
  • Manually switch to HFP profile if needed : Use pavucontrol (install via sudo apt install pavucontrol ) to:
    1. Connect your Bluetooth headset.
    2. In the Configuration tab, manually select "Headset Head Unit (HFP)" .
    3. Switch the input source to the headset mic in Google Meet.
  • Troubleshooting :
    • If HFP is not visible, remove ofono if installed: sudo apt remove ofono , stop the service, and restart PipeWire.
    • Some users report needing to restart the browser after enabling the flag, but a full reboot is not required.
    • If the profile reverts to A2DP after reconnecting, consider using a udev rule or script to enforce HFP on connection.

:white_check_mark: Note : Ubuntu 22.04 includes PipeWire by default, but proper configuration is required for HFP to work reliably with web applications.

AI-generated answer. Please verify critical facts."

Having looked at the reference for creating a udev rule there is only mention of what one user did in manjaro and not a detailed step-by-step method on how to create such a rule.

Does Your System run in Wayland or X11? You can check that with echo $XDG_SESSION_TYPE

What Browser do You use? Is it installed as Flatpak or .deb?

X11, default browser is brave installed as a .deb

but this problem is not just a browser problem.

I did a fix. I had shifted to mSBC earlier as well, but it was configurable, which would lead to problems and was not stable/reliable. Now I have done the following, which seems to make the mic stable, since that is my primary objective with calls, but the audio quality still takes a hit.

(written by AI)

OnePlus Buds 3 Mic Fix on Zorin (Brief)

What was done

  • Removed the custom WirePlumber Bluetooth override that was causing unstable behavior:
    • backed up ~/.config/wireplumber/bluetooth.lua.d to ~/.config/wireplumber/bluetooth.lua.d.bak-20260215-1652
  • Cleared stale WirePlumber runtime state under ~/.local/state/wireplumber/ so old profile/default routing choices would not override fresh policy.
  • Restarted user audio services and portals:
    • pipewire, pipewire-pulse, wireplumber
    • xdg-desktop-portal, xdg-desktop-portal-gnome, xdg-desktop-portal-gtk
  • Reconnected OnePlus Buds 3 and set the Bluetooth card to call mode (headset-head-unit-msbc).
  • Verified final state:
    • active profile = headset-head-unit-msbc
    • default sink/source = Buds headset nodes
    • mic capture test succeeded from system default source.

Why it worked

The custom Bluetooth policy was conflicting with this Jammy-era WirePlumber/BlueZ behavior and intermittently caused:

  • missing HFP profiles,
  • fallback to A2DP-only,
  • and sometimes no bluez audio device exported at all.

Returning to stock WirePlumber policy restored consistent profile discovery, then locking the active profile to mSBC stabilized mic + output.

Trade-offs made

  • Prioritized reliability of calls over high-fidelity music:
    • headset-head-unit-msbc gives stable mic + output, but audio quality is still call-grade compared with A2DP.
  • Reduced customization to increase stability:
    • removed advanced custom policy logic that attempted to force behavior automatically.
  • Kept profile flexibility available:
    • A2DP profiles are still available if manually selected later, but default stable mode is call profile.

Practical impact

  • Better consistency for Meet/Zoom/Teams mic detection and usage.
  • Fewer profile surprises during active sessions.
  • If a browser briefly reports no mic, a full browser restart usually rebinds to the now-stable PipeWire source.