TL;DR: because of SBC-XQ Bluetooth codec.
I'm not going to say anything really new, but recent discussions showed many people aren't aware of this difference compared to other systems, so I figured mentioning wouldn't hurt at least. Feel free to skip if you read the TL;DR and figured "Ah yeah, I know".
So, Bluetooth headphones support so called A2DP profile, which stops sending microphone audio and uses full bandwidth to try to improve audio quality.
Now, audio being sent in A2DP needs to be encoded with such a codec that is supported by headphones. The only codec your headphones are guaranteed to support is SBC (it is required by A2DP specification). The problem is, audio quality in SBC sucks.
So manufacturers sometimes add their own codecs on top, like AptX, AAC, LDAC, etc — all of varying quality. But nothing is perfect, so that solution has its own problems as well! More specifically: depending on a codec manufacturers have to pay a fee for using it in their headphones. So BT headphones/speakers ecosystem ends up with a whole zoo of different codecs and of varying quality.
Now, enter SBC-XQ. Back in 2019 a user ValdikSS found a neat hack that allowed to improve sound quality of headphones, given only support for SBC. There's a separate article that compares SBC-XQ to popular codecs for anyone interested. But I'll note that SBC-XQ sounds at least as good and maybe even better than AptX HD!
I can't emphasize enough how monumental this finding was: just imagine — every bluetooth headphone or speaker you have gets automagic audio quality boost! That is because SBC-XQ is based on SBC, which as mentioned is mandatory. So you could have very cheap headphones that only ever supported SBC and sounded terribly, and then you just switch them to SBC-XQ and — voilà — you get sound quality of more expensive ones!
SBC-XQ was added since to various Android forks, to PipeWire and to older PulseAudio.
If I am reading PipeWire 0.3.34 release notes correctly, SBC-XQ should be used by default, unless it's disabled by quirks (because some headphone models may have problems with this "neat hack", but most should work just fine).
So, if you have Bluetooth headphones or speakers that always sounded terribly on Mac OS or Windows (neither of which to this day have implemented support for SBC-XQ), give them a second chance! Try choosing SBC-XQ profile in audio settings, maybe that will give them a new life!
Microsoft Bluetooth drivers kinda suck ass bsd and Linux are better
There is a guy who made a custom Bluetooth stack with LDAC support on windows.
Yeah it's really nice. Actually works with all the PS5 controller features that way. Like how Linux does natively
Yeah, I never get a good sound or connection out of it have tried several dongles and headsets it's the same story every time.
Ok. That explains why I keep seeing bluetooth dongles that handle everything and pass through audio.
Yep the vendors had to use hardware to fix it.
Same with my Sony XM5, though I was recommended LDAC codec or whatever it's called
If I'm reading this right, this only applies to bluetooth audio in "headphones" mode (no mic) and not "headset" mode (with mic).
Correct. Though to be clear — there might be some interesting developments in "headset" mode as well, it's just I personally didn't dig into it, because I rarely use microphone of my bluetooth headphones; and when I do I don't really care about quality as long as I can understand the voice.
Consider this an idea if it's something you're interested in: digging what interesting is there in "headset mode" field and perhaps making a post about it 😊
Headset mode sadly is very limited... As far as I understand it this is down to a limitation of bluetooth protocols. The way it currently works to my understanding is basically alternating between sending a microphone "package" and receiving a audio "package". So the total bandwidth/rate is split and audio sounds bad.
I had a deeper dive into this once with a friend as we both where a bit confused why no one had made a solution yet.
I think the best way to go about this would be two seperate Bluetooth connections at the same time. Which would just be combined into a "sink" so applications would still see it as a headset. But this still does not seem to exist. Although "auracast" is now a thing which allows streaming audio to multiple devices. But seems to be limited to just that.
As much as I dislike apple. I really thought they would be the first to make something like this. Because they have there own ecosystem. And could implement this into there own airpods for example.
A different idea that I found interesting would be to use a charging case of earbuds as a reviver (connected via USB-Cable). As that would mean a manufacturer could use what ever they want for the transmition. And lav-mics that come with a USB-C dongle for video recording have been a thing for a while now.
There is a new standard (Bluetooth low energy) that lets the manufacturers do exactly that. Good mic + audio quality at the same time.
Also the bandwidth limit for classic Bluetooth is like 500+ kb/s so the only reason for bad call quality was a bad standard not hardware limitations
Oh yeah the actual throughput is not! But it came down to some weird "you cant just make up a new standard/protocol and call it bluetooth" if I remember correctly. My read up about this was a while ago though, so could be wrong...
But yes! Didnt think about LE. As non of my devices support it so far, and I dont really use a mic via bluetooth (because it sucked so much).
So Logitech has their "lightspeed" tech, and they did release a pair of earbuds that use that and do that, but doesn't seem like it was very popular. It required a full sized dongle and was very expensive.
Thats actually kind of cool!
Reminds me a bit of those IR headphones you could get for TV's so people with bad hearing didnt have to blast there TV so loud :)
(Not so) funny thing is, that on windows my mic + audio quality is decent, but on Linux the sound is only good if I use SBC(XQ). If I use msbc audio sounds like dogshit, while the mic is also not that great, but there is no other way (I know of) where I can have good audio quality, while still being able to use the built in mic on my Bluetooth headphones.
Why is it, that windows worked that one out, but the Linux Audio stack hasn't?
I'm open for ideas if anyone got something for me. I'm on KDE Neon (Ubuntu).
Oh! Now that's a interesting case! :O Because as far as I know, this has nothing to do with what operating system your on (could ofc be a different Bluetooth chip, but I am assuming same hardware with different OS?).
Could you tell me what headphones these are? I would like to have a look at what codecs it supports! :D Maybe that could explain what is going on, as I know that LDAC for example requires some extra things on my system (don't know if LDAC supports headset mode though).
What could also be interesting is if this also happens on your phone. Or if there is a way to check, what it is using on your windows PC?
Your assumption is correct here: Same hardware, different OS.
Device is a Lenovo E15 Gen4 upgraded with an Intel BE200.
The headphones I use are Soundcore Liberty 4 Pro. The issue arises with the Liberty Air 2 Pro also.
According to the manufacturer, the Liberty 4 Pro support the following Codecs: AAC, LDAC and per A2DP standard they must support SBC.
As far as I know, LDAC doesn't support headset mode, only audio. I could be wrong here.
On my phone there is no such problem. I use an Oneplus 6T with lineageOS 22.2. The sound for calls is good and even if music is playing in the background it sounds no different than if I am not in a call, as far as I can tell.
For reference: I use pipewire on KDE Neon, as it is the default there afaik.
If needed I can compile my own kernel, if that helps debugging.
What else do you need in terms of information? I could boot up windows for codec support and post the output of avinfo on Linux.
Intresting!
You are right, LDAC only supports playback.
What could be going on is a combination of things.
- windows might be using some propriatry drivers for the BE200 (I am not quite sure how this works on other distros. But to my knowledge setting hardware.enableAllFirmware = true in my nix config enables the installation of these non free drivers.
- could be that windows also uses some EQ and noise suppression by default. If this is the case you should check out "easyeffects" (its a great tool in general to use with pipewire)
- check in pavucontrol (under the config tab) that it isnt using CVSD when using the mic. And that its using mSBC.
- I dont know how to do this, but maybe check what it is using on windows. Dont think it supports bluetooth LE (could not find it on the website) but if it does, that might also explain it.
Intels drivers are mostly open source iirc. The firmware blobs aren't but that shouldn't be that much of an issue.
I now reinstalled bluez and reconfigured my main.conf in /etc/bluetooth. Maybe that helps.
As for the codec: I use msbc. If I manually change to cvsd, the quality is like a fisher price mic in a microwave.
If me and my adhd remember, then I will report back as soon as I have my next call.
Cheers and thanks for the notch to tackle this again. Appreciate it!
Hey no worries man! :D
I am also by no means a expert when it comes to linux and all of this. Was just a topic that had peaked my interest in the past. Because it was so weird to me that all the solutions seemed to suck. And I wanted to know if there is a reason behind it.
I dont know how much you can polish up audio quality with easyeffects. But for sure give that a shot! Has helped me in calls and games that have no or very poor sound suppression for example.
I'm aware of at least 3 earbuds that do exactly that: Jabra Elite 8 Active Gen 2, Jabra Elite 10 Gen 2, and Redmi Buds 6 Pro Gaming Edition. Unfortunately the mic doesn't work on the Jabras when you use the case as a receiver. The mic on the Redmi does work in receiver mode, but I don't know if it sounds better than Bluetooth.
Oh! No no, I mean to split the connection up :D.
Have a bluetooth signal for the mic go to the case and speakers/playback to the actual phone.
But someone else mentioned that this issue should mostly be fixed with Bluetooth LE. Which will probably become the new norm eventually.
A different approach I found interesting was the "Nothing Ear 3" using the charging case as a dedicated mic you clip on your shirt.
Tried it out with a friend who owns them in a call. And it did actually help!
But it still sounded bad compared to anything wired :,).
I am not expecting to get the quality of a XLR mic in such a small form factor.
But it would be so cool if they can at least match the phones built in mic.
The solution is already made, bad news is that requires new hardware and software is still in beta, just search for Auracast, Tmap and Gmap bt. Profiles
afaik windows only has sbc codecs, I had to buy a (cheap) driver to get ldac on it
Check this out
https://www.bluetoothgoodies.com/a2dp/
Yeah, that's exactly the one I bought, works well
this is completely irrelevant to the post tbh. As OP said most cheap headphones don't support LDAC, only SBC and/or AAC. I too noticed that my headphones work better on linux despite not being LDAC compatible. SBC-XQ helps those headphones, not the expensive LDAC ones
Try this on your Windows install
https://www.bluetoothgoodies.com/a2dp/
Lets you manually select which codec to use and increase the bitrate.
I was surprised few days ago when noticed I have a whole list of codecs to choose from in volume center. Wonder which of these might work best for using headphones with microphone both? Is it possible?
The ones that are titled A2DP can't be used with a microphone. The HSP/HFP ones can.
I really wish someone could find a similar hack to make hfp not suck
Thank you for this post. You prompted me to change the setting on my Aurora linux machine and hugely better
I swear my 5.1 speakers sound better in Linux than Windows. Clementine is the best.
The downside of SBC-XQ is that it uses way more bandwidth than other good-quality codecs. So you may have less wireless range before the audio starts breaking up, and worse battery life.
The real question is why do my bt headphones sound bad on windows.
It’s just a garbage quality product that people were brainwashed into using.
I've been using LDAC on Linux for years now, I thought Windows natively supported it as well lol Although to be fair I only use Windows to play games and do so with wired audio.
What about latency compared to AptX HD?
It's still SBC; nothing about the transmission format changes.