Bluetooth LE Audio is a Notable Upgrade

Bluetooth has been a steady feature of the tech ecosystem for several decades now. Many people encountered the technology via audio devices, particularly headsets for mobile phones that allow hands-free calling, and later on music streaming, and it probably hastened the demise of the humble CD player from cars.

This is not a technical treatise. It is just one personal anecdote which can be summarised as follows: seek and use Bluetooth LE Audio. It is a significant upgrade to the Bluetooth audio experience, and well worth making a priority the next time you’re in the market.


Audio playback via the “Advanced Audio Distribution Profile, A2DP” enabled music streaming, and nearly 2 decades later, several mobile phones caused a furore by dropping the venerable 3.5mm audio jack from their devices.

Bluetooth audio works of course, but not without drawbacks. One of the top complaints is usually around audio quality. This is a subjective metric, and it is fair to surmise that most people find Bluetooth audio to be good enough, and there have been lots of developments to improve the options and capabilities.

A less subjective limitation of Bluetooth audio via A2DP is related to latency. For various reasons including protocol limitations, Bluetooth audio has high latency, in terms of amount of time before an audio signal generated by the source is reproduced in the speaker. This is often measured in hundreds of milliseconds, and while it is inconsequential for music playback, or even watching of videos, it can have an impact on real-time or interactive applications, such as gaming — any situation where sounds need to be synchronised with user input.

My frustrations with Bluetooth audio grew because I like learning languages in Duolingo, and it is more considerate to use a headset when you’re in a shared space. Despite my appreciation for the higher audio quality of wired earphones, I find my interest in the convenience of wireless options wins, so I have had and used wireless earphones since 2008, always keeping a pair of wired compatible ones for situations where I wanted the higher fidelity or just to avoid Bluetooth limitations on rare occasions.

On a recent session with Duolingo, I got really frustrated with the beginnings of audio samples cut off, and long delays between action and sound. Lacking any motivation to fish out my wired earbuds every time I wanted to fill a gap of 5 minutes with language practice, I decided for the umpteenth time to investigate if this was finally a solved problem, for surely, there must be people out there who experience this problem and who have the means to actually fix the problem!

I have an android phone (Pixel 10) and Google Pixel Buds 2 Pro currently. My beloved partner has an iPhone and Airpods Pro. I resolved that I would see what options were available for Android, up to and including getting a new pair of earbuds if necessary, for a reasonable price to be determined, and then also evaluate the iPhone, and if Apple had solved the problem, this would be the final straw that sent me packing into the ecosystem of iOS.

Needless to say, this led me to Bluetooth LE audio. I keep up with technology news, so I am aware of Bluetooth LE audio and had been curious to try it, but my only two devices which claimed to support it never worked — my Pixel 8 at the time and my Pixel Buds Pro 2. Toggling the LE audio switch would silently toggle back off, and since I have a life, I looked into Sony Link Buds, but was not willing to invest more money into “unproven” tech, so I silently continued to endure the issues with Bluetooth audio.

This time, I did some more digging, and finding that LE audio is supposed to work with the Pixel and Pixel Buds 2 Pro, decided to give it another try. I went to the Pixel Buds app, and enabled the switch for LE Audio. This time, it stayed on. What sorcery! Either the combination of the newer phone, or firmware updates to the Pixel Buds Pro 2 since I last tested had finally got Bluetooth LE audio working.

Bluetooth LE Audio immediately improves the audio latency, significantly reducing the instances of start of stream audio loss. I am now able to use Duolingo with much less frustration. About 95% of the time, when cold starting the app, the first sounds make it to my ears with a minor delay. Once the app is running, the reliability of the interactive audio goes up by my unscientific estimation into the high 99s. This means that I can actually use Duolingo with my earbuds.

What’s more, I have not observed any degradation in audio quality. The LC3 codec that Bluetooth LE audio requires is considered to be superior to AAC in that it can provide equivalent quality at lower bitrates. I streamed a lot of music using the Tidal app at the maximum bitrate, and it’s transparent to me compared to the AAC codec that my earbuds use otherwise.

I’m leaving Bluetooth LE enabled, and from now on, support for Bluetooth LE will be an important feature to look for in any new devices I purchase.

I have not gone on to test the state of Bluetooth audio on iOS because I am now satisfied with the performance of my Pixel 10 paired with the Pixel Buds 2 Pro when Bluetooth LE Audio is working. I’ve got other issues with the Pixel 10, but that’s a story for another day 🙂

Run Mikrotik Winbox v4 on Ubuntu

I’ve been back to spending more and more time in Ubuntu on my dual-boot PC, and I also happen to use Mikrotik router at the moment, and Winbox is a nice UI for managing that router.

There’s a snap package on Ubuntu, but that’s for v3.x, which looks too outdated for me. I prefer to run v4, which requires you to download a zip file from https://mikrotik.com/download/winbox and extract it, and then double-click the “WinBox” executable to launch it.

You cannot successfully run it, at least on Ubuntu 26.04 which I’m using without first installing some dependencies:

sudo apt install libxcb-keysyms1 libxcb-image0 libxcb-icccm4 libxcb-render-util0

Once you’ve installed that, you should be able to run the app without trouble.

Download Ubuntu via BitTorrent

I wanted to download install Ubuntu 26.04 today and found out that Ubuntu was undergoing a DDoS attack, making their main website inaccessible. I was a bit surprised that they didn’t have a DDoS protection service on their main infrastructure (or perhaps it was overrun too), and I assume they’re going to sort that out going forward, however, I couldn’t find any reasonable ways to get the ISO files I needed until I came across the BitTorrent links:

https://torrent.ubuntu.com/tracker_index

You need to know exactly what image you need, which for most people is usually the one that ends with “-desktop-amd64.iso“. The prefix is usually the build, such as “ubuntu“, “kubuntu” etc, followed by the version, which for me was “26.04“.

I ended up downloading ubuntu-26.04-desktop-amd64.iso and loading it up in my torrent client, which completed in no time, only a few seconds slower than a standard https download might have.

You also need a BitTorrent client such as: https://transmissionbt.com/download

Desktop Mode in Google Pixels 8: Android 16 + Sept 2025 Patch

8 Months after my initial test and review, things have improved significantly.

There is a simplified toggle to enable desktop experiences in the developer settings. The screen comes up in the right orientation upon boot, and for the most part, things work as expected.

You get a taskbar, the windows float and multitasking feels familiar and comfortable. I able to compose this post entirely using desktop mode, including taking a photo and marking it up. During the markup of the photo, the mouse location of mouse click was offset from the location of the actual line drawn on the photo. This seems like a bug.

I could not easily resize the photo to make it suitable for inserting into this post using Google Photos. I could not even crop the photo using the mouse because my clicks seemed to do nothing.

The battery drain was quite fast, which is perhaps unsurprising since the phone was responsible for supplying power to my USB C dock, an attached USB hub, and a keyboard and mouse. If you want to use this for a reasonable amount of time, you should get a dock that supplies power to the phone.

Despite some minor issues and difficulties, this is a good amount of progress and I plan to get a dock that allows charging so that I can continue to explore using this further.

Installing mariadb Python Connector on Ubuntu (Pop OS 22.04)

As I wanted to dabble with FastAPI, and a little weary of Windows for reasons which I shall not explore further, I decided to setup a virtual linux machine and run it full-screen. My computer is fast enough that I don’t notice any performance penalty by running windows first, and then virtualizing linux.

However, after spending a little more time than I would have liked googling or talking with AI chatbots about how to get all the software I wanted like python 3.13 and my preferred IDE installed from various sources, it was time to setup my python virtualenv and run a basic dev server. However the pip install command was failing with the following output:

$ pip install -r requirements.txt

Collecting fastapi<1.0.0,>=0.115.13 (from fastapi[standard]<1.0.0,>=0.115.13->-r requirements.txt (line 1))
  Using cached fastapi-0.116.1-py3-none-any.whl.metadata (28 kB)
Collecting mariadb<2.0.0,>=1.1.12 (from -r requirements.txt (line 2))
  Using cached mariadb-1.1.13.tar.gz (111 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... error
  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─> [38 lines of output]
      /bin/sh: 1: mariadb_config: not found
      Traceback (most recent call last):

My requirements.txt contained only two lines:

fastapi[standard] >= 0.115.13, < 1.0.0
mariadb >=1.1.12, <2.0.0

MariaDB connector cannot be installed for some reason. One of the many paper cuts that make using linux a bit more demanding than other OSes. Anyway, I vaguely recall the need to install development versions of certain packages when doing even python development on Linux.

The short of this is that you need to install the following packages which I found through trial and error after reading a few articles that weren’t very precise in what was needed:

python-dev
libmariadb-dev

For my use case, the database server is running on a different host, so no need to install mariadb-server.

If you’re using a python from the deadsnakes ppa, then you should install the corresponding python-dev package from there. For me, that was ‘python3.13-dev’. After this, the pip install for my two packages succeeded.

Sky Broadband with Mikrotik Router with IPv6

Like Mikrotik but don’t speak Mikrotik CLI eh? I’m with ya.

I took advantage of a deal and joined Sky for broadband. I’ll spare you the details, but even though they don’t offer fixed price contracts, the fact that they don’t use PPPoE and the generous new customer offer swayed me, and I think over the length of the contract, it works out cheaper than my previous provider.

This post was helpful in convincing me that it was possible to use my own router since I really don’t want the disruption of having to reconfigure my entire home network, which is filled with smart devices that don’t have great interfaces for updating connection settings. I extracted my username and password using wireshark, even though it’s argued that it’s not necessary — better to have the real credentials, since it’s straightforward to capture them.

You should go read that blog post if you don’t yet have IPv4 internet access from Sky over your Mikrotik. Think of this post as as a supplement that covers only IPv6 connectivity.

Only the clientid – option 61 appears to be required, and you set that to the same value as described in the linked blog post above. Request ‘prefix’ only, and choose a name for the pool and set prefix length to 56 — see screenshot.

On the advanced tab, I simply selected that it should send the clientid option:

That was enough to get a prefix bound within a few seconds. The prefixes seem to renew every hour, but as far as I can tell, the prefix has not changed since it was first acquired.

The final piece of the puzzle is to assign an IPv6 address on your “bridge” (LAN). This means you go to the IPv6 > Addresses and create a new address. On my router whose model is irrelevant, ether1 is designated as my WAN port, and the remaining ether2 to ether5 are all part of a “bridge” which serves as the LAN part of my network. The interface name for the bridge is conveniently called “bridge”, so you need to assign an IPv6 address from your prefix to the bridge. Really, all you need to specify is “::1/64” as the Address, set the Pool you created in your DHCPv6 client as the “from pool” value, and select “bridge” as the interface and Mikrotik will automatically generate a /64 subnet, and assign the first address to the interface once you hit apply.

The other values were left as their defaults.

Once this address was assigned, the hosts on the LAN automatically acquired an IPv6 address and were able to reach IPv6 only sites.

This doesn’t cover any additional configuration you might need for IPv6 — the Mikrotik wizard creates a reasonable default set of firewall rules and you can explore the web for any further customisation tasks.

Disney Plus vs Zen Internet vs MTU vs IPv6

This is a long and hopefully interesting story about how I resolved the inability to stream Disney Plus on my IPv6 enabled internet connection that had a non-standard MTU of 1492 bytes.

The short summary is:

  • Zen Internet, GB appears to support Layer 2 MTU of 1508. Just set your WAN interface MTU accordingly, and your PPPoE session when established will allow you to continue to advertise an MTU of 1500 bytes for IP (TCP/IP), which most apps and services on the internet prefer.
  • You may not have to disable IPv6 if you’re having issues with streaming Disney Plus, it’s probably just getting tripped up if you have a lower MTU than 1500.

And now for the rest of the fun story.

I recently re-subscribed to Disney Plus so I could catch up on new seasons of my favourite series. I settled in on a saturday evening, followed their email, subscribed for one month of the highest quality picture they offer. Login on my TV to watch, the cursor spins for a very long time, then tells me there was an error, and that I should contact their subscription support.

I chatted with two different people because I was using my mobile phone, and whenever my screen was locked because I needed to reboot something or other at the suggestion of their support personnel, the app would get suspended, and on resume, the chat session would be lost.

On the following day, I used my PC to start a chat session with the support team, and this time I chose Technical Support. Got a knowledgeable person who went through several tests, turn off wifi, reboot router etc all to no avail. I had a sneaky feeling that something about my internet connection’s MTU was causing trouble for Disney Plus, or some of it’s content delivery networks. I wasn’t supper confident about this however, since I couldn’t believe that a network as large as Disney Plus would fall prey to something so basic, especially since I had been an on and off customer of Disney plus for nearly 3 years without trouble. It couldn’t be IPv6 either, since I’ve also had IPv6 for 3 years as well.

My PS5 was the only thing that worked consistently, and I knew that the PS5 even though it accepted IPv6 addressing, generally had an OS level preference for IPv4, which the Disney Plus app was happy about. My PC would sometimes work, my phone didn’t work. All these devices were happy the last time I had a subscription, and nothing about my network had changed, so it was likely something that Disney Plus had introduced or changed.

Since I had a few hours to spare after a busy week and weekend, I decided to delve into the matter some more. Wireshark on my PC and packet captures on my router suggested that ICMP was working as expected, sending “packet too big” messages as required, however, a lot of the connections I attributed to Disney Plus seemed to stall after the ICMP message was sent by my router. The client would retry a few times, and then eventually the app would show a message advising you to contact support.

I observed that the app was actually trying to establish IPv6 connections to the relevant content servers, which I could tell from inspecting the TLS Client Hello packets, as they had distinctive domain names. Despite what Disney Plus help pages say, IPv6 is in use, and surely, they can’t expect me to disable IPv6 when they *should* design their app and infrastructure to avoid using IPv6 if they weren’t ready for it.

My ISP is currently Zen Internet, GB, and like so many ISPs in the UK, they use PPPoE, and since PPPoE has an overhead of around 8 bytes per packet, the MTU on internet bound connections in my home is lowered by 8, which is not the typical convention on the internet. However, with ICMP working correctly, this should pose no problem with any modern apps or services. I lived with this fact, having inspected network traffic and confirmed that it takes about 1ms after connection established for the relevant ICMP message is sent by my router to both ends of the connection… and I thought that’s not bad. In practice, the way TCP handles packet loss actually adds a slightly longer delay than 1ms LAN latency would imply, but nothing frustrating enough to act on.

Well, since I wanted to watch Disney Plus, this was finally the time to investigate how to address this in the hopes that it might fix Disney Plus streaming too.

I did some Google searches, and found some speculative information that Zen Internet will accept an a Layer 2 MTU (Ethernet) of 1508 in order to compensate for the overhead of PPPoE. Heh! Really? It’s that simple? Why didn’t I bother to check this two years ago?

Anyway, logged into my Mikrotik router, tweaked the L2 MTU for “ether1” which is acting as my WAN port up by +8 bytes. PPPoE session drops and restarts, and voila! MTU is now 1500 bytes.

Okay, that’s good. No more wasting precious milliseconds retransmitting packets due to ICMP packet too big. Great. I launch the Disney Plus app on my phone, it feels snappier than before, and instantly starts streaming.

Wow. I could have done this two freaking years ago 🙂

The moral of this story is that the Disney Plus app and infrastructure development team probably needs to pay more attention into how their infrastructure handles variable MTU values on the internet. Their app seems to suffer from significantly higher latency when used on networks with the non-typical MTU, and in addition, some of the servers in their video delivery CDN appear unable to deal with path MTU discovery when processing IPv6 traffic. Hopefully one of you stumbles upon this blog and puts some effort into improving this. Netflix and Youtube handle this stuff flawlessly, and there’s no reason why you cannot. Also, if you really don’t want users to use IPv6 on your service, don’t advertise AAAA records :).

Finding a USB C cable that does it all

Puzzled by the mass of USB type C cables that seemingly only support USB 2.0 speeds in 2025, I did some searching on Amazon, each time increasing the USB version number.


To my surprise, when I searched “usb 4 cable” on Amazon, I found actually decent quality results, for decent prices. To be clear, from experience, I consider Cable Matters, Anker and Amazon Basics to be of acceptable quality. You may have different rankings.

I ended up buying this one: https://amzn.eu/d/hNqvNSg on sale for £10, which is a good price if it actually works as advertised.

They are thicker than normal, but worth it in my view, to not have to think too much about what features the cable supports.