Skip to content

Instantly share code, notes, and snippets.

@tmrkp
Last active September 8, 2025 10:02
Show Gist options
  • Select an option

  • Save tmrkp/d47cd8bcafbfaffb07ea7154482b8e9c to your computer and use it in GitHub Desktop.

Select an option

Save tmrkp/d47cd8bcafbfaffb07ea7154482b8e9c to your computer and use it in GitHub Desktop.
Arch: Disable PipeWire HSP/HFP profile

Arch: Disable PipeWire HSP/HFP profile

https://wiki.archlinux.org/title/Bluetooth_headset#Disable_PipeWire_HSP/HFP_profile

Unlike PulseAudio, PipeWire does not automatically switch between A2DP and HSP/HFP in response to input events. However, rather than to enable automatically switching to the (lower audio quality) HSP/HFP profile if A2DP fails, you may prefer to disable the former altogether. To do so, create or edit a bluez configuration as shown below.

Possible Paths:

/etc/wireplumber/wireplumber.conf.d/51-mitigate-annoying-profile-switch.conf
~/.config/wireplumber/wireplumber.conf.d/51-mitigate-annoying-profile-switch.conf
/usr/share/wireplumber/wireplumber.conf.d/51-mitigate-annoying-profile-switch.conf
## In WirePlumber there's a bug where some applications trigger switching to Headset Profile
## --
## See issue #634, #645, #630, #629, #613
## --
## This config mitigates the issue by completely disabling the switching and support for Headset Profile (HFP)
## Using this would only make sense if you never plan on using the microphone that comes with your headset.

wireplumber.settings = {
  ## Whether to use headset profile in the presence of an input stream.
  ## --
  ## Disable for now, as it causes issues. See note at the top as to why.
  bluetooth.autoswitch-to-headset-profile = false
}

monitor.bluez.properties = {
  ## Enabled roles (default: [ a2dp_sink a2dp_source bap_sink bap_source hfp_hf hfp_ag ])
  ##
  ## Currently some headsets (Sony WH-1000XM3) are not working with
  ## both hsp_ag and hfp_ag enabled, so by default we enable only HFP.
  ##
  ## Supported roles: hsp_hs (HSP Headset),
  ##                  hsp_ag (HSP Audio Gateway),
  ##                  hfp_hf (HFP Hands-Free),
  ##                  hfp_ag (HFP Audio Gateway)
  ##                  a2dp_sink (A2DP Audio Sink)
  ##                  a2dp_source (A2DP Audio Source)
  ##                  bap_sink (LE Audio Basic Audio Profile Sink)
  ##                  bap_source (LE Audio Basic Audio Profile Source)
  ## --
  ## Only enable A2DP here and disable HFP. See note at the top as to why.
  bluez5.roles = [ a2dp_sink a2dp_source ]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment