ValveSoftware / SteamOS

SteamOS community tracker
1.55k stars 69 forks source link

[SteamDeck] Bluetooth headset: microphone not available / BT profile missing #866

Open juk0de opened 1 year ago

juk0de commented 1 year ago

Your system information

Please describe your issue in as much detail as possible:

When connecting my Bose QuietComfort II headset, the microphone is not available in the devices list. Output via A2DP is working, but input / mic is not available, e. g. I can only select mono from the pipewire list of input devices in Mumble (which is actually the built-in microphone).

I'd like to use my headset with Mumble / Discord for gaming, including the mic. I know that HSP usually sounds terrible, but pipewire also supports mSBC and SBC-XQ (see ArchWiki), which should greatly improve the quality in that mode. But on SteamDeck, the microphone isn't even detected, or at least not listed. And it's not only my headset. Other people have the same problem with their BT headsets on the SteamDeck.

Imho, it would be a huge improvement if we could use our BT headsets like real headsets and with the best audio codecs currently available on Linux.

Steps for reproducing this issue:

  1. Pair your BT headset with SteamDeck
  2. Try to select the BT microphone as input (e.g. in Mumble) or try to switch profile to mSBC / SBQ-XQ
  3. Be disappointed

Some debug output

Before connecting the headset:

(deck@steamdeck ~)$ pw-record --list-targets
Available targets ("*" denotes default): alsa_input.pci-0000_04_00.5-platform-acp5x_mach.0.HiFi__hw_acp5x_0__source
    39: source description="Filter Chain Source" prio=-1
*   54: source description="Raven/Raven2/FireFlight/Renoir Audio Processor Headset Microphone + Internal Microphone" prio=2000
    79: source description="Echo-Cancel Source" prio=-1
    52: monitor description="Raven/Raven2/FireFlight/Renoir Audio Processor Speaker" prio=728
    61: monitor description="Raven/Raven2/FireFlight/Renoir Audio Processor Headphones" prio=1000
    72: monitor description="Echo-Cancel Sink" prio=-1
    68: stream description="echo-cancel-playback" prio=-1

After connecting the headset:

(deck@steamdeck ~)$ pw-record --list-targets
Available targets ("*" denotes default): alsa_input.pci-0000_04_00.5-platform-acp5x_mach.0.HiFi__hw_acp5x_0__source
    39: source description="Filter Chain Source" prio=-1
*   54: source description="Raven/Raven2/FireFlight/Renoir Audio Processor Headset Microphone + Internal Microphone" prio=2000
    79: source description="Echo-Cancel Source" prio=-1
    52: monitor description="Raven/Raven2/FireFlight/Renoir Audio Processor Speaker" prio=728
    61: monitor description="Raven/Raven2/FireFlight/Renoir Audio Processor Headphones" prio=1000
    72: monitor description="Echo-Cancel Sink" prio=-1
    105: monitor description="Kopfhörer (Bose QC35 II)" prio=1010
    68: stream description="echo-cancel-playback" prio=-1
(deck@steamdeck ~)$ pw-link --input
filter-chain-capture:input_1
filter-chain-capture:input_2
Midi-Bridge:Midi Through:(playback_0) Midi Through Port-0
alsa_output.pci-0000_04_00.5-platform-acp5x_mach.0.HiFi__hw_acp5x_1__sink:playback_FL
alsa_output.pci-0000_04_00.5-platform-acp5x_mach.0.HiFi__hw_acp5x_1__sink:playback_FR
alsa_output.pci-0000_04_00.5-platform-acp5x_mach.0.HiFi__hw_acp5x_0__sink:playback_FL
alsa_output.pci-0000_04_00.5-platform-acp5x_mach.0.HiFi__hw_acp5x_0__sink:playback_FR
echo-cancel-capture:input_FL
echo-cancel-capture:input_FR
echo-cancel-sink:playback_1
echo-cancel-sink:playback_2
bluez_output.60_AB_D2_B0_FA_66.a2dp-sink:playback_FL
bluez_output.60_AB_D2_B0_FA_66.a2dp-sink:playback_FR
(deck@steamdeck ~)$ pactl list short sources
39  filter-chain-source PipeWire    float32le 2ch 48000Hz   SUSPENDED
393 alsa_output.pci-0000_04_00.5-platform-acp5x_mach.0.HiFi__hw_acp5x_1__sink.monitor   PipeWire    s16le 2ch 48000Hz   SUSPENDED
394 alsa_output.pci-0000_04_00.5-platform-acp5x_mach.0.HiFi__hw_acp5x_0__sink.monitor   PipeWire    s32le 2ch 48000Hz   SUSPENDED
395 alsa_input.pci-0000_04_00.5-platform-acp5x_mach.0.HiFi__hw_acp5x_0__source  PipeWire    s32le 2ch 48000Hz   SUSPENDED
417 echo-cancel-source  PipeWire    float32le 2ch 48000Hz   SUSPENDED
418 echo-cancel-sink.monitor    PipeWire    float32le 2ch 48000Hz   SUSPENDED
504 bluez_output.60_AB_D2_B0_FA_66.a2dp-sink.monitor    PipeWire    s16le 2ch 48000Hz   SUSPENDED
bertogg commented 1 year ago

I think this is what you're looking for:

https://steamdecki.org/Steam_Deck/Wireless/Bluetooth

juk0de commented 1 year ago

Thanks @bertogg! I will try to get my headset working using the configuration from that wiki. Of course it would be nice if it worked out of the box, but I guess we'll have to wait a bit longer for that...

juk0de commented 1 year ago

I finally found some time to try the how-to from the link above, but couldn't get the deck to recognize my headset microphone. At first I thought that it's because headsets are explicitly disabled on the deck:

(deck@steamdeck ~)$ cat /usr/share/wireplumber/bluetooth.lua.d/60-bluez-disable-headsets.lua 
bluez_monitor.properties = {
  -- HFP/HSP backend (default: native).
  -- Available values: any, none, hsphfpd, ofono, native
  ["bluez5.hfphsp-backend"] = "none",
}

and the wiki example does not re-enable them (it enables all codes, but not the HFP/HSP backend). So I modified it a bit and explicitly reset the HFP/HSP backend to the default value, like this:

(deck@steamdeck ~)$ cat ~/.config/wireplumber/bluetooth.lua.d/61-bluez-monitor.lua
bluez_monitor.properties = {
  ["bluez5.hfphsp-backend"] = "native",
  ["bluez5.enable-sbc-xq"] = true,
  ["bluez5.enable-msbc"] = true,
  ["bluez5.codecs"] = "[sbc sbc_xq aac ldac aptx aptx_hd aptx_ll aptx_ll_duplex faststream faststream_duplex]",
}

and rebooted.

But the headset mic is still not available:

(deck@steamdeck ~)$ pw-record --list-targets
Available targets ("*" denotes default): alsa_input.pci-0000_04_00.5-platform-acp5x_mach.0.HiFi__hw_acp5x_0__source
    39: source description="Filter Chain Source" prio=-1
*   51: source description="Raven/Raven2/FireFlight/Renoir Audio Processor Headset Microphone + Internal Microphone" prio=2000
    68: source description="Echo-Cancel Source" prio=-1
    49: monitor description="Raven/Raven2/FireFlight/Renoir Audio Processor Speaker" prio=728
    50: monitor description="Raven/Raven2/FireFlight/Renoir Audio Processor Headphones" prio=1000
    69: monitor description="Echo-Cancel Sink" prio=-1
    79: monitor description="Kopfhörer (Bose QC35 II)" prio=1010
    70: stream description="echo-cancel-playback" prio=-1
    94: stream description="Playback" prio=-1

I also copied my config file to /etc/wireplumber/bluetooth.lua.d/, just in case the one in $HOME is ignored, but it didn't help.

Maybe I did sth. wrong or maybe this just isn't enough (anymore). Any help is appreciated.

natecox commented 1 year ago

bumping this, I followed the direction above as well, and while my AirPod Max headset showed up in the microphone list afterwards, selecting it and then exiting the menu will simply revert the change back to the default option of internal microphone.

despian commented 1 year ago

I think this is what you're looking for:

https://steamdecki.org/Steam_Deck/Wireless/Bluetooth

This did work for me, thanks. However, the audio quality is terrible when using any profile which supports the mic (HSF/HSP with CVSD or mSBC) audio is mono and low bit-rate, essentially unusable.

I hope better support is coming soon.

vikileak commented 1 year ago

I think this is what you're looking for: https://steamdecki.org/Steam_Deck/Wireless/Bluetooth

This did work for me, thanks. However, the audio quality is terrible when using any profile which supports the mic (HSF/HSP with CVSD or mSBC) audio is mono and low bit-rate, essentially unusable.

I hope better support is coming soon.

Did you had the same issue with the "Bose QuietComfort II"? For me it didn't worked ether.

juk0de commented 1 year ago

@despian, @vikileak: The audio quality heavily depends on the codec. And the supported codecs depend on your headset and audio stack (pipewire, pulseaudio, etc.). They both have to support the same high quality audio codec in duplex mode. See also this reddit thread.

Did you had the same issue with the "Bose QuietComfort II"? For me it didn't worked ether.

I don't know which codecs the Bose QC II supports. Since I didn't even managed to get the mic recognized by SteamOS, I basically gave up. Maybe I should try again with the current OS version, but I'm afraid that I would just be wasting my time again. Bluetooth headset support is pretty much broken currently...

BradleyJA commented 1 year ago

I have tried to do this, but my steam deck on version 3.4.4 does not have a wireplumber folder in .config any suggestions?

araujorm commented 1 year ago

Unless your headset supports a full duplex profile like faststream, what you're asking is impossible. With avantree aria pro headphones it works here after I switch to the desired profile in KDE or pavucontrol. But that is not a protocol or codec you find often, very few headsets support such feature (specially expensive ones, those may be very good about sound quality, but lack this functionality). The only way for "standard" bluetooth headsets to support microphone input is to switch to HSP or HFP profile, which in turn make output audio mono and low quality.

You might get lucky with some of those expensive headsets if they support connecting to a proprietary USB dongle that presents itself to the OS as a USB sound card. Or try finding a non-standard one that is supported by pipewire like the one mentioned above.

Things may change with the newer Bluetooth standards, but I wouldn't hold my breath. Even if they do, current hardware (adapters and headset) won't most likely support it.

TL;DR This is not a steam OS issue, it's a bluetooth standard design flaw that has existed for years and there is nothing that can be done by Valve.

juk0de commented 1 year ago

TL;DR This is not a steam OS issue, it's a bluetooth standard design flaw that has existed for years and there is nothing that can be done by Valve.

That's oversimplified, so I can't agree. While it's true that BT has serious design flaws (already mentioned above), the problem reported here is that it's currently not possible to get BT headset mics working at all (at least the last time I tried). There's also no easy way to configure the audio codec. So even if you had an Aria Pro, you wouldn't be able to make full use of it because BT headsets are disabled in Steam OS. So Valve can very well do sth. to improve the situation.

araujorm commented 1 year ago

TL;DR This is not a steam OS issue, it's a bluetooth standard design flaw that has existed for years and there is nothing that can be done by Valve.

That's oversimplified, so I can't agree. While it's true that BT has serious design flaws (already mentioned above), the problem reported here is that it's currently not possible to get BT headset mics working at all (at least the last time I tried). There's also no easy way to configure the audio codec. So even if you had an Aria Pro, you wouldn't be able to make full use of it because BT headsets are disabled in Steam OS. So Valve can very well do sth. to improve the situation.

The thing is that with the Aria Pro (and Aria Podio, which I also have, one at the office and one at home) I do have the option to change the profile to "High Fidelity Duplex (A2DP Source/Sink, codec FastStream)" in Desktop mode, and even in game mode if I add Pulseaudio Volume Control as a non steam game (Web Browser or similar control scheme recommended for that). The setting gets saved (by Wireplumber, I presume) and survives a reboot, and I can use steam chat, discord, etc. while also playing a game at the same time (with high fidelity sound), chatting with people in game mode. It does use the headset mic, I tested it by leaving the deck on a room and move to another and people still hear me clearly. No extra adapters, just the built-in Bluetooth, and it's in fact great.

Now I've tested with another "regular" headset and I noticed that I don't have the HSP/HFP profile available (as I do in a Fedora machine). So I presume Valve compiled Pipewire in Steam OS without HSP/HFP support, perhaps to avoid people complaining that when they use their headset and force it's microphone usage the sound gets mono and 80's telephone quality... I may agree with you that Valve could recompile Pipwire with HSP/HFP support and release that in an update, but would anyone really want that? Wouldn't just people start complaining because it doesn't work as they wished (because of the aforementioned Bluetooth design flaw) and that just cause more trouble and confusion? That's the question, I think. Too bad they aren't replying here and clarifying that.

Anyway, if we had the option to select the headset profile in game mode settings, it would be nice, but I'm happy I can control it with Pulseaudio Volume Control even in game mode. As long as they don't have the "fantastic" idea of removing faststream support... I can't really complain.

Note: should you consider trying a faststream headset, I know for a fact that not all Avantree Aria headsets support this feature, mainly the new Aria Pro 2 or the Aria Me. Headsets that I've seen working with success (connected by bluetooth) on Linux machines in general and Pipewire:

These headsets regularly get at promotion on Amazon, and there's the option that if it doesn't work or one doesn't like them for other reasons, they can always be returned... (no, I don't work for them, and I don't earn anything by saying this, before you ask... in fact, if you find other brands and models that work with Faststream Duplex, I would really like to know since some people I known don't like the Arias, the noise cancelling on those is forgettable and the fact that the Pro 2 doesn't support FS anymore is worrysome, so I would like to have other alternatives for office usage or for gaming in general).

Other than this, I don't think I have more thoughts or info that could be helpful on this issue, at least until a new Bluetooth standard/revision helps fixing this issue.

araujorm commented 1 year ago

I have tried to do this, but my steam deck on version 3.4.4 does not have a wireplumber folder in .config any suggestions?

Newer versions of Wireplumber store settings in:

$HOME/.local/state/wireplumber

But using Pulseaudio Volume Control (open KDE start menu, multimedia folder, and you should find it) you can select the profile and codec you want (SBC, aptx, aptx HD...) as long as your headset supports codecs other than SBC. The settings should then be stored in this folder, survive a reboot and get applied even in game mode. One can also add Pulse Audio Volume Control (aka pavucontrol) as a non-steam game and use that, see in my comment above.

As for Steam OS, as I mentioned in my previous comment, I think they disabled HSP/HFP profles, so no microphone indeed with bluetooth headsets unless your headset supports other profiles that allow microphone usage such as Faststream (it's debatable if HSP/HFP profiles would be useful, as I said, but that's my opinion). Anyway, using that you should be able to select your output codec of choice (at least some of the aptx family, I don't have headsets that support LDAC or AAC so I can't tell if those are available on Steam OS). Hope this helps.

juk0de commented 1 year ago

Thanks a lot for the device list @araujorm. That's really helpful!

I may agree with you that Valve could recompile Pipwire with HSP/HFP support and release that in an update, but would anyone really want that? Wouldn't just people start complaining because it doesn't work as they wished...

I think people should be able to use what they want / have and it should be easy to do so for less tech-savvy people, e. g. by making it possible to select mic and codec using the overlay settings menu. I also highly doubt that more people will complain about poor audio quality than currently complain about the lack of microphone support. And if they do, there's an easy answer, sth. like:

"Audio quality depends on the codec supported by your headphone. You can find a list of available codecs at in the SteamDeck settings."

This would also raise awareness for the current BT design flaws and (:crossed_fingers:) may even lead to long-term improvements if people start buying more headsets with better codec support. The current situation in Steam OS is confusing and not helpful imo...

araujorm commented 1 year ago

I've just noticed something: in my steamdeck I don't get any Bluetooth headset battery indicator in desktop mode, even when enabling bluez experimental features. I think that's because of the aforementioned lack of support of the HFP profile in steam OS's build of pipewire. It would really be useful to have that, so that is enough reason for me to justify adding support for those profiles (it's just a matter of building pipewire with it, as far as I can tell...)

paxperscientiam commented 6 months ago

Just wanna add that bluetooth mic still does not work.

Notmare commented 5 months ago

I'm running into the same issue, and the linked wiki article is now leading to an empty page. Does anyone know if these resources have been moved?

zarqeon commented 2 months ago

I tried to follow the instructions mentioned here (https://steamdecki.org/Steam_Deck/Wireless/Bluetooth) and with a bit of a poking around i managed to make it work. I'll leave it here for future reference, maybe somebody would find it useful.

so, as of 2024.06.25 this is what worked for me:

I poked around in /usr/share/wireplumber/bluetooth.lua.d and saw that i don't have a "/usr/share/wireplumber/bluetooth.lua.d/60-bluez-disable-headsets.lua" file. I opened every file in this folder and figured out that in "/usr/share/wireplumber/bluetooth.lua.d/60-bluez-jupiter.lua" there is a line like this: ["bluez5.hfphsp-backend"] = "none", and thanks to the comments above the said line, i understood that this is what turns off all headset functionality.

so as a stab in the dark, I created a new file: ~/.local/wireplumber/bluetooth.lua.d/61-bluez-monitor.lua (I believe the number dictates in which order these files are loaded, so the goal is to have the number larger than the file that disables the hfphsp-backend) the whole content of the file should be something like this:

bluez_monitor-properties = { ["bluez5.hfphsp-backend"] = "native", }

saved it and restarted my deck. after that i went to desktop mode, opened pluseaudio and on the config tab i could choose the HSP/HFP profile for my bluetooth headset. after that the headset should show up on the input devices tab as well, and in game mode too.

araujorm commented 2 months ago

@zarqeon Nice finding!

I didn't test it, however be advised that sound quality while using the microphone will be very bad and mono due to HSP/HFP standard limitations (a new bluetooth standard 5.2 with LC3 codec should fix in the near future this but AFAIK neither pipewire/wireplumber support that yet, and I doubt that the bluetooth adapter on the deck would be hardware compatible with that anyway).

nlundquist commented 2 months ago

Pipewire does support LC3 and the OLED has BT 5.2 capable hardware.

paxperscientiam commented 1 month ago

Does anyone know why Valve hasn't fixed this?

wallentx commented 1 month ago

It had been a while since I had last tried BT audio... So I figured that I'd check it out again, because surely it HAD to have gotten better. I got an Audeze Maxwell headset, and you can't configure the codecs on Windows, or MacOS at all. On the Deck, I was stuck with SBC until I opened up ~/.config/wireplumber/bluetooth.lua.d/61-force-bluez.codec.lua, only to find out that the only listed codec was sbc 😡. I added LDAC, rebooted, and it's been good since.

Valve really needs to change this default, as I'm not sure why listing SBC only would be helpful to anyone.

5310 commented 1 month ago

Now that we've mostly figured out how to get our more stubborn BT headsets to work on the Deck, is there any way to get them to automatically switch profiles based on whether a microphone is needed by the system or not?

My new earphones—the stubborn ones—sound fine on A2DP+SBC-XQ. And while HFP+mSBC works, mic and all, it sounds awful.

Now, my older BT headset used to auto-switch to the profile with the mic when needed and back again. This does not happen with the new ones. I have to switch profiles manually.

As far as I can tell, the file /usr/share/wireplumber/policy.lua.d/10-default-policy.lua has the property ["media-role.use-headset-profile"] = true that should do the same. But it has no effect on my new earphones. My old headset continues to switch profiles automatically though!

wallentx commented 1 month ago

@5310 what if you put these settings in ~/.config/wireplumber/...?

lostgoat commented 1 month ago

A couple of these features have been part of SteamOS 3.7 for a while, some of them are even in SteamOS 3.6.

I would recommend waiting, or opting into the relevant betas instead of modifying the wireplumber config files. Those files in your home directory would not be removed in an update and they could cause configuration conflicts in the future.

Also, please note that the audio playback quality significantly drops when you use a codec that supports both Mic+Headphones.

5310 commented 1 month ago

@5310 what if you put these settings in ~/.config/wireplumber/...?

I did! Unfortunately, that just breaks Pipewire: No audio plays, the Plasma audio widgets are blank, and I have to remove the offending file and reboot to restore them all—even if the file's identical to the ones in /usr/share/wireplumber/..., or empty!

Admittedly, I've not looked at the logs from when this happens since I was worried I broke it too badly.

I'm glad that at least the ~/.config/wireplumber/bluetooth.lua.d/... file lets me use my earphone mic at all. I'll keep it and switch profiles manually until just before the 3.6 update :crossed_fingers: