Bluetooth A2DP Sink not showing up in Pulseaudio on NixOS

I am setting up a workstation with nixos, was all good so far and I can connect to my bluetooth headset (sony wh 1000 mx 5). But when I do, I dont get the output sink in pulseaudio. Here are some logs and my nixos configuration snippet. I did try pressing the volume control buttons. Thanks for any insight, I am clueless…

    journalctl | grep blue
    Sep 01 01:28:58 maskeLX pulseaudio[1566]: Module "module-bluetooth-policy" should be loaded once at most. Refusing to load.
    Sep 01 01:28:58 maskeLX pulseaudio[1566]: Module "module-bluetooth-discover" should be loaded once at most. Refusing to load.
    Sep 01 01:28:58 maskeLX pulseaudio[1566]: Failed to load module "module-bluez5-device" (argument: ""): initialization failed.
    Sep 01 01:28:58 maskeLX pulseaudio[1566]: Module "module-bluez5-discover" should be loaded once at most. Refusing to load.
    Sep 01 01:28:58 maskeLX pulseaudio[1566]: org.bluez.ProfileManager1.RegisterProfile() failed: org.bluez.Error.NotPermitted: UUID already registered
    Sep 01 01:45:02 maskeLX pulseaudio[1566]: org.bluez.BatteryProviderManager1.UnregisterBatteryProvider() Failed: org.freedesktop.DBus.Error.NoReply:Message recipient disconnected from message bus without replying
    Sep 01 01:45:54 maskeLX (uetoothd)[983]: ConfigurationDirectory 'bluetooth' already exists but the mode is different. (File system: 755 ConfigurationDirectoryMode: 555)
    Sep 01 01:45:54 maskeLX bluetoothd[983]: Bluetooth daemon 5.66
    Sep 01 01:45:54 maskeLX bluetoothd[983]: src/main.c:check_options() Unknown key Disable for group General in /etc/bluetooth/main.conf
    Sep 01 01:45:54 maskeLX bluetoothd[983]: src/main.c:check_options() Unknown key Enable for group General in /etc/bluetooth/main.conf
    Sep 01 01:45:54 maskeLX bluetoothd[983]: Starting SDP server
    Sep 01 01:45:54 maskeLX bluetoothd[983]: Bluetooth management interface 1.22 initialized
    Sep 01 01:45:54 maskeLX dbus-daemon[1053]: [system] Activating via systemd: service name='org.freedesktop.hostname1' unit='dbus-org.freedesktop.hostname1.service' requested by ':1.3' (uid=0 pid=983 comm="/nix/store/hpyykcygpzvrvfg8hx1830f8lh0gp419-bluez-" label="kernel")
    Sep 01 01:45:54 maskeLX bluetoothd[983]: Battery Provider Manager created
    Sep 01 01:45:54 maskeLX bluetoothd[983]: Adv Monitor Manager created with supported features:0x00000000, enabled features:0x00000000, max number of supported monitors:32, max number of supported patterns:16
    Sep 01 01:46:08 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.48 path=/MediaEndpoint/A2DPSource/ldac
    Sep 01 01:46:08 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.48 path=/MediaEndpoint/A2DPSink/aptx_hd
    Sep 01 01:46:08 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.48 path=/MediaEndpoint/A2DPSource/aptx_hd
    Sep 01 01:46:08 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.48 path=/MediaEndpoint/A2DPSink/aptx
    Sep 01 01:46:08 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.48 path=/MediaEndpoint/A2DPSource/aptx
    Sep 01 01:46:08 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.48 path=/MediaEndpoint/A2DPSink/aac
    Sep 01 01:46:08 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.48 path=/MediaEndpoint/A2DPSource/aac
    Sep 01 01:46:08 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.48 path=/MediaEndpoint/A2DPSink/sbc
    Sep 01 01:46:08 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.48 path=/MediaEndpoint/A2DPSource/sbc
    Sep 01 01:46:08 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.48 path=/MediaEndpoint/A2DPSink/sbc_xq
    Sep 01 01:46:08 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.48 path=/MediaEndpoint/A2DPSource/sbc_xq
    Sep 01 01:46:08 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.48 path=/MediaEndpoint/A2DPSource/aptx_ll_1
    Sep 01 01:46:08 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.48 path=/MediaEndpoint/A2DPSource/aptx_ll_0
    Sep 01 01:46:08 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.48 path=/MediaEndpoint/A2DPSource/aptx_ll_duplex_1
    Sep 01 01:46:08 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.48 path=/MediaEndpoint/A2DPSource/aptx_ll_duplex_0
    Sep 01 01:46:08 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.48 path=/MediaEndpoint/A2DPSource/faststream
    Sep 01 01:46:08 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.48 path=/MediaEndpoint/A2DPSource/faststream_duplex
    Sep 01 01:46:08 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.48 path=/MediaEndpoint/A2DPSink/opus_05
    Sep 01 01:46:08 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.48 path=/MediaEndpoint/A2DPSource/opus_05
    Sep 01 01:46:08 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.48 path=/MediaEndpoint/A2DPSink/opus_05_duplex
    Sep 01 01:46:08 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.48 path=/MediaEndpoint/A2DPSource/opus_05_duplex
    Sep 01 01:46:09 maskeLX pulseaudio[1529]: Module "module-bluetooth-policy" should be loaded once at most. Refusing to load.
    Sep 01 01:46:09 maskeLX pulseaudio[1529]: Module "module-bluetooth-discover" should be loaded once at most. Refusing to load.
    Sep 01 01:46:09 maskeLX pulseaudio[1529]: Failed to load module "module-bluez5-device" (argument: ""): initialization failed.
    Sep 01 01:46:09 maskeLX pulseaudio[1529]: Module "module-bluez5-discover" should be loaded once at most. Refusing to load.
    Sep 01 01:46:09 maskeLX bluetoothd[983]: src/profile.c:register_profile() :1.51 tried to register 0000111f-0000-1000-8000-00805f9b34fb which is already registered
    Sep 01 01:46:09 maskeLX pulseaudio[1529]: org.bluez.ProfileManager1.RegisterProfile() failed: org.bluez.Error.NotPermitted: UUID already registered
    Sep 01 01:46:09 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.51 path=/MediaEndpoint/A2DPSource/ldac_hq
    Sep 01 01:46:09 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.51 path=/MediaEndpoint/A2DPSource/ldac_sq
    Sep 01 01:46:09 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.51 path=/MediaEndpoint/A2DPSource/ldac_mq
    Sep 01 01:46:09 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.51 path=/MediaEndpoint/A2DPSink/aptx_hd
    Sep 01 01:46:09 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.51 path=/MediaEndpoint/A2DPSource/aptx_hd
    Sep 01 01:46:09 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.51 path=/MediaEndpoint/A2DPSink/aptx
    Sep 01 01:46:09 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.51 path=/MediaEndpoint/A2DPSource/aptx
    Sep 01 01:46:09 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.51 path=/MediaEndpoint/A2DPSink/sbc
    Sep 01 01:46:09 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.51 path=/MediaEndpoint/A2DPSource/sbc
    Sep 01 01:46:09 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.51 path=/MediaEndpoint/A2DPSink/sbc_xq_453
    Sep 01 01:46:09 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.51 path=/MediaEndpoint/A2DPSource/sbc_xq_453
    Sep 01 01:46:09 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.51 path=/MediaEndpoint/A2DPSink/sbc_xq_512
    Sep 01 01:46:09 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.51 path=/MediaEndpoint/A2DPSource/sbc_xq_512
    Sep 01 01:46:09 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.51 path=/MediaEndpoint/A2DPSink/sbc_xq_552
    Sep 01 01:46:09 maskeLX bluetoothd[983]: Endpoint registered: sender=:1.51 path=/MediaEndpoint/A2DPSource/sbc_xq_552
    Sep 01 01:46:15 maskeLX bluetoothd[983]: src/profile.c:record_cb() Unable to get Hands-Free Voice gateway SDP record: Host is down
    pacmd list-cards | grep blue

    pacmd list-sinks | grep a2dp

    pacmd list-sinks | grep blue

    dmesg | grep blue

(/etc/nixos/configuration.nix)

    [...]
      #services.blueman.enable = true;
      environment.etc."greetd/environments".text = ''
        Hyprland
      '';
      sound.enable = true;
      hardware.pulseaudio = {
        enable = true;
        support32Bit = true;
        package = pkgs.pulseaudioFull;
        daemon.config = {
         default-sample-rate = 48000;
         default-fragments = 8;
         default-fragment-size-msec = 10;
        };
        extraConfig = "
          load-module module-switch-on-connect
          #load-module module-combine-sink # if you want a combined channel where all output devices are part of
          load-module module-bluetooth-policy
          load-module module-bluetooth-discover
          load-module module-bluez5-device
          load-module module-bluez5-discover
        ";
      };
      services.pipewire.enable = true;
      hardware.enableAllFirmware = true;
      hardware.bluetooth = {
        enable = true;
        settings = {
          General = {
            Enable = "Source,Sink,Control,Media"; # bugged?
        Disable = "Socket";
            ControllerMode = "dual";
            # FastConnectable = "true"; # increased power consumption
            Experimental = "true";
        DiscoverableTimeout = "0";
          };
          Policy = {
            AutoEnable = "true";
          };
        };
      };
      users.users.s = {
        isNormalUser = true;
        extraGroups = [ "wheel" "networkmanager" "audio" "bluetooth" ];
    [...]

I am running AMD Ryzen 5 5600X on MPG B550I GAMING EDGE WIFI

3 Likes

I have the same problem where I’m not getting any a2dp sink with two different bluetooth devices and two different bluetooth headphones. There is a note on the wiki that the instructions for enabling a2dp “does not work with bluez5”

does not work with bluez5

Which leaves us to ask, what does work? Removing the Enable line results in the headset being added as an handsfree audio device (ie. with mono audio, for like a phone call). That’s about as far as I’ve gotten after fiddling with this all morning.

I am running NixOS 23.05.5533.70bdadeb94ff (Stoat) with KDE plasma 5.

Relevant configuration.nix snippet:

  hardware = { 
    pulseaudio.enable = true;
    bluetooth = { 
      enable = true;
      settings = { 
        General = { 
          Name = "Computer";
          ControllerMode = "dual";
          FastConnectable = "true";
          Experimental = "true";
          Enable = "Source,Sink,Media,Socket";
        };  
        LE = { EnableAdvMonInterleaveScan = "true"; };
      };  
    };  
  }; 

afaict everything seems in order, except the sink doesn’t show up. The resulting behavior is that even when the bluetooth headphones are connected, they do not show up as an audio device in kde settings.:

[blee@litten ~]$ pactl list modules short | grep blue
9       module-bluetooth-policy
10      module-bluetooth-discover
11      module-bluez5-discover

[blee@litten ~]$ echo -e 'info\nquit' | bluetoothctl
[WH-1000XM4]# info
Device F8:4E:17:0F:20:D4 (public)
        Name: WH-1000XM4
        Alias: WH-1000XM4
        Class: 0x00240404
        Icon: audio-headset
        Paired: yes
        Bonded: yes
        Trusted: yes
        Blocked: no
        Connected: yes
        LegacyPairing: no
...
[blee@litten ~]$ journalctl -b | grep -i bluetooth
Mar 31 09:46:08 litten kernel: Bluetooth: Core ver 2.22
Mar 31 09:46:08 litten kernel: NET: Registered PF_BLUETOOTH protocol family
Mar 31 09:46:08 litten kernel: Bluetooth: HCI device and connection manager initialized
Mar 31 09:46:08 litten kernel: Bluetooth: HCI socket layer initialized
Mar 31 09:46:08 litten kernel: Bluetooth: L2CAP socket layer initialized
Mar 31 09:46:08 litten kernel: Bluetooth: SCO socket layer initialized
Mar 31 09:46:08 litten kernel: Bluetooth: hci0: Device revision is 0
Mar 31 09:46:08 litten kernel: Bluetooth: hci0: Secure boot is enabled
Mar 31 09:46:08 litten kernel: Bluetooth: hci0: OTP lock is enabled
Mar 31 09:46:08 litten kernel: Bluetooth: hci0: API lock is enabled
Mar 31 09:46:08 litten kernel: Bluetooth: hci0: Debug lock is disabled
Mar 31 09:46:08 litten kernel: Bluetooth: hci0: Minimum firmware build 1 week 10 2014
Mar 31 09:46:08 litten kernel: Bluetooth: hci0: Bootloader timestamp 2019.40 buildtype 1 build 38
Mar 31 09:46:08 litten systemd[1061]: Reached target Bluetooth.
Mar 31 09:46:09 litten (uetoothd)[1162]: ConfigurationDirectory 'bluetooth' already exists but the mode is different. (File system: 755 ConfigurationDirectoryMode: 555)
Mar 31 09:46:09 litten systemd[1]: Starting Bluetooth service...
Mar 31 09:46:09 litten kernel: Bluetooth: hci0: Found device firmware: intel/ibt-0040-0041.sfi
Mar 31 09:46:09 litten kernel: Bluetooth: hci0: Boot Address: 0x100800
Mar 31 09:46:09 litten kernel: Bluetooth: hci0: Firmware Version: 252-24.23
Mar 31 09:46:09 litten bluetoothd[1162]: Bluetooth daemon 5.66
Mar 31 09:46:09 litten bluetoothd[1162]: src/main.c:check_options() Unknown key Enable for group General in /etc/bluetooth/main.conf
Mar 31 09:46:09 litten systemd[1]: Started Bluetooth service.
Mar 31 09:46:09 litten systemd[1]: Reached target Bluetooth Support.
Mar 31 09:46:09 litten bluetoothd[1162]: Starting SDP server
Mar 31 09:46:09 litten kernel: Bluetooth: BNEP (Ethernet Emulation) ver 1.3
Mar 31 09:46:09 litten kernel: Bluetooth: BNEP socket layer initialized
Mar 31 09:46:09 litten bluetoothd[1162]: Bluetooth management interface 1.22 initialized
Mar 31 09:46:10 litten kernel: Bluetooth: hci0: Waiting for firmware download to complete
Mar 31 09:46:10 litten kernel: Bluetooth: hci0: Firmware loaded in 1547620 usecs
Mar 31 09:46:10 litten kernel: Bluetooth: hci0: Waiting for device to boot
Mar 31 09:46:10 litten kernel: Bluetooth: hci0: Device booted in 15748 usecs
Mar 31 09:46:10 litten kernel: Bluetooth: hci0: Found Intel DDC parameters: intel/ibt-0040-0041.ddc
Mar 31 09:46:10 litten kernel: Bluetooth: hci0: Applying Intel DDC parameters completed
Mar 31 09:46:10 litten kernel: Bluetooth: hci0: Firmware timestamp 2023.24 buildtype 1 build 67068
Mar 31 09:46:10 litten bluetoothd[1162]: Battery Provider Manager created
Mar 31 09:46:10 litten kernel: Bluetooth: MGMT ver 1.22
Mar 31 09:46:10 litten kernel: Bluetooth: RFCOMM TTY layer initialized
Mar 31 09:46:10 litten kernel: Bluetooth: RFCOMM socket layer initialized
Mar 31 09:46:10 litten kernel: Bluetooth: RFCOMM ver 1.11
Mar 31 09:46:10 litten bluetoothd[1162]: Adv Monitor Manager created with supported features:0x00000000, enabled features:0x00000000, max number of supported monitors:32, max number of supported patterns:16
...
Mar 31 09:46:16 litten systemd[1250]: Starting Bluetooth OBEX service...
Mar 31 09:46:16 litten systemd[1250]: Started Bluetooth OBEX service.
Mar 31 09:46:20 litten systemd[1250]: Reached target Bluetooth.
Mar 31 09:46:23 litten systemd[1061]: Stopped target Bluetooth.
Mar 31 09:46:25 litten bluetoothd[1162]: src/profile.c:record_cb() Unable to get Hands-Free Voice gateway SDP record: Host is down
Mar 31 09:46:40 litten bluetoothd[1162]: src/profile.c:ext_io_disconnected() Unable to get io data for Hands-Free Voice gateway: getpeername: Transport endpoint is not connected (107)
[blee@litten ~]$ cat /etc/bluetooth/*.conf
[General]
ControllerMode=dual
Enable=Source,Sink,Media,Socket
Experimental=true
FastConnectable=true
Name=Computer

[LE]
EnableAdvMonInterleaveScan=true

[Policy]
AutoEnable=true

[blee@litten ~]$ pactl list sinks short
0       auto_null       module-null-sink.c      s16le 2ch 44100Hz       SUSPENDED

Fellow WH-1000XM5 user here, I was able to get it working just by removing the manual hardware.pulseaudio configuration and just completely switching to pipewire, using the default settings:

  services.pipewire = {
    enable = true;
    pulse.enable = true;
    alsa.enable = true;
    jack.enable = true;
  };

  # no manual sound or hardware.pulseaudio configuration needed

  hardware.bluetooth = {
    enable = true;
  };

I am also using Plasma 5, but I am on NixOS unstable, so you might want to try updating if it doesn’t work. Btw, afaik 23.05 is currently deprecated anyway (23.11 is the current stable release).

A2DP seems to be working:

1 Like

I now have working a2dp, thank you!

 hardware.bluetooth.enable = true;
 services.pipewire = {
    enable = true;
    pulse.enable = true;
};
1 Like