Bluetooth headphones no longer playing sound after bluez update, pinning older bluez version does not make it work again

Already mentioned this here, but no luck there, so…

Recently, like yesterday probably, Bluetooth headphones (only experienced w/ one pair, but seems nixpkgs version specific so didn’t even bother) do connect but stopped actually playing sound, at least when using pulseaudio (no idea about pipewire, don’t use it (at least not for audio) for… reasons, and that will change) on KDE Wayland (that last part is probably unimportant).

Definitely still worked two or three days ago when I did a bunch of stuff to my config (don’t worry I branched off to a point before that in order to eliminate those changes as the culprit here) and updated flake.lock in the process; worked fine at least on - host os: Linux 6.15.2-zen1, NixOS, 25.11 (Xantusia), 25.11.20250706.1fd8bad, so somewhere between 1fd8bad..6e98748. Still works with the older lockfile.

My config is here, kinda important because there’s some specific pairing script stuff I have going on (TL;DR automatically sends VolumeUp commands to the headphones because “absolute volume” stuff, and also disconnect-and-connect-again workaround for Intel BT (which is what this is, to be fair) which might not be needed anymore); really doubt that this is what it is, though (but can try without if so requested.)

journalctl -xefu bluetooth.service:

Jul 19 11:34:39 t480 systemd[1]: Starting Bluetooth service...
░░ Subject: A start job for unit bluetooth.service has begun execution
░░ Defined-By: systemd
░░ Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel
░░ 
░░ A start job for unit bluetooth.service has begun execution.
░░ 
░░ The job identifier is 259.
Jul 19 11:34:39 t480 bluetoothd[2014]: Bluetooth daemon 5.80
Jul 19 11:34:39 t480 bluetoothd[2014]: Starting SDP server
Jul 19 11:34:39 t480 bluetoothd[2014]: Bluetooth management interface 1.22 initialized
Jul 19 11:34:39 t480 systemd[1]: Started Bluetooth service.
░░ Subject: A start job for unit bluetooth.service has finished successfully
░░ Defined-By: systemd
░░ Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel
░░ 
░░ A start job for unit bluetooth.service has finished successfully.
░░ 
░░ The job identifier is 259.
Jul 19 11:34:40 t480 bluetoothd[2014]: Battery Provider Manager created
Jul 19 11:34:40 t480 bluetoothd[2014]: Adv Monitor Manager created with supported features:0x00000000, enabled features:0x00000000, max number of supported monitors:32, max number of supported patterns:16
Jul 19 11:34:48 t480 bluetoothd[2014]: Adv Monitor app :1.36 disconnected from D-Bus
Jul 19 11:34:52 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSource/ldac_hq
Jul 19 11:34:52 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSource/ldac_sq
Jul 19 11:34:52 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSource/ldac_mq
Jul 19 11:34:52 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSink/aptx_hd
Jul 19 11:34:52 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSource/aptx_hd
Jul 19 11:34:52 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSink/aptx
Jul 19 11:34:52 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSource/aptx
Jul 19 11:34:52 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSink/sbc
Jul 19 11:34:52 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSource/sbc
Jul 19 11:34:52 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSink/sbc_xq_453
Jul 19 11:34:52 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSource/sbc_xq_453
Jul 19 11:34:52 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSink/sbc_xq_512
Jul 19 11:34:52 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSource/sbc_xq_512
Jul 19 11:34:52 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSink/sbc_xq_552
Jul 19 11:34:52 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSource/sbc_xq_552
Jul 19 11:34:52 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSink/faststream
Jul 19 11:34:52 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSource/faststream
Jul 19 11:34:53 t480 bluetoothd[2014]: Endpoint unregistered: sender=:1.73 path=/MediaEndpoint/A2DPSource/ldac_hq
Jul 19 11:34:53 t480 bluetoothd[2014]: Endpoint unregistered: sender=:1.73 path=/MediaEndpoint/A2DPSource/ldac_sq
Jul 19 11:34:53 t480 bluetoothd[2014]: Endpoint unregistered: sender=:1.73 path=/MediaEndpoint/A2DPSource/ldac_mq
Jul 19 11:34:53 t480 bluetoothd[2014]: Endpoint unregistered: sender=:1.73 path=/MediaEndpoint/A2DPSink/aptx_hd
Jul 19 11:34:53 t480 bluetoothd[2014]: Endpoint unregistered: sender=:1.73 path=/MediaEndpoint/A2DPSource/aptx_hd
Jul 19 11:34:53 t480 bluetoothd[2014]: Endpoint unregistered: sender=:1.73 path=/MediaEndpoint/A2DPSink/aptx
Jul 19 11:34:53 t480 bluetoothd[2014]: Endpoint unregistered: sender=:1.73 path=/MediaEndpoint/A2DPSource/aptx
Jul 19 11:34:53 t480 bluetoothd[2014]: Endpoint unregistered: sender=:1.73 path=/MediaEndpoint/A2DPSink/sbc
Jul 19 11:34:53 t480 bluetoothd[2014]: Endpoint unregistered: sender=:1.73 path=/MediaEndpoint/A2DPSource/sbc
Jul 19 11:34:53 t480 bluetoothd[2014]: Endpoint unregistered: sender=:1.73 path=/MediaEndpoint/A2DPSink/sbc_xq_453
Jul 19 11:34:53 t480 bluetoothd[2014]: Endpoint unregistered: sender=:1.73 path=/MediaEndpoint/A2DPSource/sbc_xq_453
Jul 19 11:34:53 t480 bluetoothd[2014]: Endpoint unregistered: sender=:1.73 path=/MediaEndpoint/A2DPSink/sbc_xq_512
Jul 19 11:34:53 t480 bluetoothd[2014]: Endpoint unregistered: sender=:1.73 path=/MediaEndpoint/A2DPSource/sbc_xq_512
Jul 19 11:34:53 t480 bluetoothd[2014]: Endpoint unregistered: sender=:1.73 path=/MediaEndpoint/A2DPSink/sbc_xq_552
Jul 19 11:34:53 t480 bluetoothd[2014]: Endpoint unregistered: sender=:1.73 path=/MediaEndpoint/A2DPSource/sbc_xq_552
Jul 19 11:34:53 t480 bluetoothd[2014]: Endpoint unregistered: sender=:1.73 path=/MediaEndpoint/A2DPSink/faststream
Jul 19 11:34:53 t480 bluetoothd[2014]: Endpoint unregistered: sender=:1.73 path=/MediaEndpoint/A2DPSource/faststream
Jul 19 11:34:53 t480 bluetoothd[2014]: profiles/audio/bap.c:bap_detached() Unable to find bap session
Jul 19 11:34:53 t480 bluetoothd[2014]: Destroy Adv Monitor Manager
Jul 19 11:34:53 t480 bluetoothd[2014]: Battery Provider Manager destroyed
Jul 19 11:35:12 t480 bluetoothd[2014]: Battery Provider Manager created
Jul 19 11:35:12 t480 bluetoothd[2014]: Adv Monitor Manager created with supported features:0x00000000, enabled features:0x00000000, max number of supported monitors:32, max number of supported patterns:16
Jul 19 11:35:12 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSource/ldac_hq
Jul 19 11:35:12 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSource/ldac_sq
Jul 19 11:35:12 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSource/ldac_mq
Jul 19 11:35:12 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSink/aptx_hd
Jul 19 11:35:12 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSource/aptx_hd
Jul 19 11:35:12 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSink/aptx
Jul 19 11:35:12 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSource/aptx
Jul 19 11:35:12 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSink/sbc
Jul 19 11:35:12 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSource/sbc
Jul 19 11:35:12 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSink/sbc_xq_453
Jul 19 11:35:12 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSource/sbc_xq_453
Jul 19 11:35:12 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSink/sbc_xq_512
Jul 19 11:35:12 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSource/sbc_xq_512
Jul 19 11:35:12 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSink/sbc_xq_552
Jul 19 11:35:12 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSource/sbc_xq_552
Jul 19 11:35:12 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSink/faststream
Jul 19 11:35:12 t480 bluetoothd[2014]: Endpoint registered: sender=:1.73 path=/MediaEndpoint/A2DPSource/faststream
Jul 19 11:35:26 t480 bluetoothd[2014]: src/profile.c:record_cb() Unable to get Hands-Free Voice gateway SDP record: Host is down
Jul 19 11:35:30 t480 bluetoothd[2014]: src/service.c:btd_service_connect() a2dp-sink profile connect failed for XX:XX:XX:XX:XX:XX: Device or resource busy
Jul 19 11:35:31 t480 bluetoothd[2014]: Path / reserved for Adv Monitor app :1.98
Jul 19 11:35:34 t480 bluetoothd[2014]: Adv Monitor app :1.98 disconnected from D-Bus
Jul 19 11:35:34 t480 bluetoothd[2014]: No matching connection for device
Jul 19 11:35:39 t480 bluetoothd[2014]: Path / reserved for Adv Monitor app :1.99
Jul 19 11:35:40 t480 bluetoothd[2014]: profiles/audio/avctp.c:avctp_control_confirm() Control: Refusing unexpected connect
Jul 19 11:35:40 t480 bluetoothd[2014]: Adv Monitor app :1.99 disconnected from D-Bus
Jul 19 11:35:40 t480 bluetoothd[2014]: Adv Monitor app :1.100 disconnected from D-Bus
Jul 19 11:35:40 t480 bluetoothd[2014]: /org/bluez/hci0/dev_XX_XX_XX_XX_XX_XX/sep1/fd0: fd(42) ready

I tried having it build the bluez version it was using previously:

  hardware.bluetooth = {
    enable = true;
    package = (pkgs.bluez.overrideAttrs (old: rec {
      version = "5.80";
      src = pkgs.fetchurl {
        url = "mirror://kernel/linux/bluetooth/bluez-${version}.tar.xz";
        hash = "sha256-pNC8oymWkfBtW9l3O4VGOCBKUaUCbEKwrX8cbPFrRZo=";
      };
    }));
    powerOnBoot = false;
    settings = {
      General = {
        Experimental = true;
        KernelExperimental = true;
      };
    };
  };

but that did not work. Also tried to have it use kernel 6.6 instead of pkgs.linuxPackages.zen, also to no effect; had to try because some people on other distros had issues with bluetooth after upgrading to 6.15.5 and in my case it got bumped to 6.15.6 from… something before both of those.

(unrelated, but nixpkgs kernel package naming is really confusing, took way too long to find out that the package for kernel 6.6 is pkgs.linuxPackages_6_6, tried at least pkgs.linuxKernel.linux_6_6 and pkgs.linuxPackages.linux_6_6, and search.nixos.org did not bring up the one it was actually supposed to be)

It’s a kernel regression apparently. LTS probably got hit as well so that’s likely why it didn’t work there either.

Patch exists and most likely coming in next stable kernel: linux: bluetooth headphones do not play audio · Issue #426467 · NixOS/nixpkgs · GitHub