My Own Memory Hole
Blog♯bluetooth

MPD, PulseAudio et Bluetooth sous Raspbian Buster

Alors que je venais juste de mettre en place la cohabitation entre MPD et mon ampli connecté en Bluetooth sur mon Raspberry Pi 2 (voir ici), je basculais sur un modèle 4, modifiant quelque peu mes usages et utiisant cette fois-ci l'interface graphique (afin de profiter notamment de Spotify, une fois la gestion des DRM ajoutée). Et du coup, afin d'avoir une maîtrise plus fine de mes sorties audio, j'ai opté pour l'utilisation de PulseAudio.

On commence par purger bluealsa s'il est installé :

sudo apt purge bluealsa

puis on installe tout ce qui concerne le Bluetooth et PulseAudio :

 sudo apt install pi-bluetooth pulseaudio pulseaudio-module-bluetooth paprefs pavumeter pavucontrol pasystray

On vérifie la configuration de PulseAudio (/etc/pulse/default.pa) notamment pour ce qui est du Bluetooth :

### Automatically load driver modules for Bluetooth hardware
.ifexists module-bluetooth-policy.so
load-module module-bluetooth-policy
.endif

.ifexists module-bluetooth-discover.so
load-module module-bluetooth-discover
.endif

et on ajoute ces éléments :

# automatically switch to newly-connected devices
load-module module-switch-on-connect

load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1 # IP of localhost

On tue PulseAudio :

pulseaudio -k

S'il ne redémarre pas tout seul, il suffit de lancer la commande :

pulseaudio -D

On veille à bien connecter notre enceinte Bluetooth via l'utilitaire en ligne de commande bluetoothctl : on commence par rechercher les périphériques disponibles (scan on), puis on lui accorde notre confiance (pas d'authentification nécessaire, trust) avant de faire l'appairage avec le bon device (pair) et de nous y connecter (connect) ; on peut alors cesser la recherche (scan off) :

bluetoothctl 
Agent registered
[bluetooth]# scan on
Discovery started
[CHG] Controller 00:1A:7D:DA:71:15 Discovering: yes
[CHG] Device FC:58:FA:14:27:BC RSSI: -71
[CHG] Device FC:58:FA:14:27:BC TxPower: 4
[...]
[bluetooth]# pair FC:58:FA:14:27:BC 
Attempting to pair with FC:58:FA:14:27:BC
[CHG] Device FC:58:FA:14:27:BC Connected: yes
[...]
[CHG] Device FC:58:FA:14:27:BC ServicesResolved: yes
[CHG] Device FC:58:FA:14:27:BC Paired: yes
Pairing successful
[CHG] Device FC:58:FA:14:27:BC ServicesResolved: no
[CHG] Device FC:58:FA:14:27:BC Connected: no
[bluetooth]# trust FC:58:FA:14:27:BC 
[CHG] Device FC:58:FA:14:27:BC Trusted: yes
Changing FC:58:FA:14:27:BC trust succeeded
[bluetooth]# connect FC:58:FA:14:27:BC 
Attempting to connect to FC:58:FA:14:27:BC
[CHG] Device FC:58:FA:14:27:BC Connected: yes
Connection successful
[CHG] Device FC:58:FA:14:27:BC ServicesResolved: yes
[Tangent Ampster BT]# scan off
Discovery stopped
[...]
[Tangent Ampster BT]# exit

On configure une sortie PulseAudio dans la configuration de mpd, /etc/mpd.conf :

sudo nano /etc/mpd.conf
audio_output {
        type            "pulse"
        name            "My Pulse Output"
        server          "localhost"
        mixer_type      "software"
}

On relance MPD et l'affaire est jouée :

sudo service mpd restart

MPD et Bluetooth sur Raspberry Pi 2

Afin d'utiliser pleinement mon « système multimédia » à base d'un NAS et d'un Raspberry Pi – qui commence à se faire vieillissant puisque dans sa vesion 2 –sur lequel tourne un serveur MPD, je souhaitais connecter via Bluetooth ce dernier à mon petit amplificateur Tangent Ampster BT.

Connexion Bluetooth

J'ai fait l'aquisition d'un dongle USB/Bluetooth TP-Link reconnu, dans mon souvenir, nativement sous Raspbian Buster, sous réserve d'avoir bien installé le paquet pi-bluetooth :

sudo apt install pi-bluetooth

Pour connecter l'ampli au Raspberry Pi, on utilise l'utilitaire en ligne de commande bluetoothctl : on commence par rechercher les périphériques disponibles (scan on), puis on fait l'appairage avec le bon device (pair) et on lui accorde notre confiance (pas d'authentification nécessaire, trust) avant de nous y connecter (connect) et de cesser la recherche (scan off) :

bluetoothctl 
Agent registered
[bluetooth]# scan on
Discovery started
[CHG] Controller 00:1A:7D:DA:71:15 Discovering: yes
[CHG] Device FC:58:FA:14:27:BC RSSI: -71
[CHG] Device FC:58:FA:14:27:BC TxPower: 4
[...]
[bluetooth]# pair FC:58:FA:14:27:BC 
Attempting to pair with FC:58:FA:14:27:BC
[CHG] Device FC:58:FA:14:27:BC Connected: yes
[...]
[CHG] Device FC:58:FA:14:27:BC ServicesResolved: yes
[CHG] Device FC:58:FA:14:27:BC Paired: yes
Pairing successful
[CHG] Device FC:58:FA:14:27:BC ServicesResolved: no
[CHG] Device FC:58:FA:14:27:BC Connected: no
[bluetooth]# trust FC:58:FA:14:27:BC 
[CHG] Device FC:58:FA:14:27:BC Trusted: yes
Changing FC:58:FA:14:27:BC trust succeeded
[bluetooth]# connect FC:58:FA:14:27:BC 
Attempting to connect to FC:58:FA:14:27:BC
[CHG] Device FC:58:FA:14:27:BC Connected: yes
Connection successful
[CHG] Device FC:58:FA:14:27:BC ServicesResolved: yes
[Tangent Ampster BT]# scan off
Discovery stopped
[...]
[Tangent Ampster BT]# exit

Cependant, si à l'étape de la connexion à l'ampli, vous obtenez une erreur, il convient alors d'installer le paquet pulseaudio-module-bluetooth  :

sudo apt install pulseaudio-module-bluetooth

Ouvez ensuite le fichier /etc/pulse/default.pa et vérifiez aux alentours des lignes 65-67 que vous avez bien :

.ifexists module-bluetooth-discover.so
load-module module-bluetooth-discover
.endif

et ajoutez à la fin du fichier :

# automatically switch to newly-connected devices
load-module module-switch-on-connect

Lancez alors pulseaudio avec la commande pulseaudio -D après l'avoir tué si besoin (pulseaudio -k) puis relancez la commande connect dans l'outil bluetoothctl.

Configurer de nouvelles sorties dans MPD

Une nouvelle fois, je ne suis pas parvenu à configurer MPD pour qu'il utilise PulseAudio... On s'en tient donc à ALSA et au « Bluetooth Audio ALSA Backend » bluealsa que l'on commence par installer :

sudo apt install bluealsa

Puis on « crée » de nouveaux périphériques audio pour l'ensemble du système et de ses utilisateurs :

sudo nano /etc/asound.conf
pcm.tangent {
    type plug
    slave {
        pcm {
            type bluealsa
            device FC:58:FA:14:27:BC
            profile "a2dp"
        }
  }
  hint {
    show on
    description "Tangent Ampster BT"
    }
}

pcm.jblgo {
  type plug
  slave {
    pcm {
      type bluealsa
      device 78:44:05:61:4C:17
      profile "a2dp"
    }
  }
  hint {
    show on
    description "JBL Go"
  }
}

On en vient ensuite à la configuration de MPD auquel on doit déclarer les nouvelles sorties à utiliser :

audio_output {
        type            "alsa"
        name            "Tangent Ampster BT - ALSA Bluetooth"
        device          "tangent"
        mixer_type  "software"
    format          "44100:16:2"
}
audio_output {
        type            "alsa"
        name            "JBL Go - ALSA Bluetooth"
        device          "jblgo"
        mixer_type      "software"
}

Et on relance le service :

sudo service mpd restart

Connexion Bluetooth au retour de veille sous Lubuntu 18.04 sur ASUS F200M

Sous Lubuntu 18.04, il m'était impossible de me re-connecter en Bluetooth à mon ampli Hi-Fi au retour de la veille.
Et aucune des solutions repérées sur le forum de la communauté anglophone d'Ubuntu, ni celle de Ferux, ni celle de lotharmat ne me permettait de re-connecter mon ampli, bien qu'il soit bien enregistré comme de confiance. J'avais toujours le même message d'erreur :

Connection Failed: blueman.bluez.errors.DBusFailedError: Resource temporarily unavailable

Une solution simple et définitive  !

La solution vient de Halka sur askubuntu.com, bien qu'il ne faille pas se contenter d'une version >=5.28.2 de bluez : la version disponible dans les dépôts de Lubuntu 18.04 est la 5.48-0ubuntu3 (au 7 juillet 2018)...

Par contre, l'utilisation de la version que propose la « Ubuntu Bluetooth team » via son PPA, la 5.50-0ubuntu0ppa1 (au 7 juillet 2018) permet de résoudre le problème.
Donc, on fait tout simplement :

$ sudo add-apt-repository ppa:bluetooth/bluez
$ sudo apt-get update && sudo apt-get upgrade

Si ça ne marche pas... comment retrouver mes connections Bluetooth ?

J'utilisais le programme bluetoothctl et devais retirer l'appareil avant de l'appairer à nouveau et de le connecter...

$ bluetoothctl 
Agent registered
[bluetooth]# disconnect FC:58:FA:14:27:BC 
Attempting to disconnect from FC:58:FA:14:27:BC
Successful disconnected
[bluetooth]# connect FC:58:FA:14:27:BC
Attempting to connect to FC:58:FA:14:27:BC
[CHG] Device FC:58:FA:14:27:BC Connected: yes
Connection successful
[CHG] Device FC:58:FA:14:27:BC ServicesResolved: yes
[Tangent Ampster BT]#

Si la seule déconnexion ne suffit pas, il faut alors complètement retirer le périphérique&nbsp:

$ bluetoothctl
Agent registered
[Tangent Ampster BT]# remove FC:58:FA:14:27:BC
[CHG] Device FC:58:FA:14:27:BC ServicesResolved: no
Device has been removed
[CHG] Device FC:58:FA:14:27:BC Connected: no
[DEL] Device FC:58:FA:14:27:BC Tangent Ampster BT
[bluetooth]# scan on
Discovery started
[CHG] Controller 54:27:1E:C9:81:80 Discovering: yes
[NEW] Device FC:58:FA:14:27:BC Tangent Ampster BT
[bluetooth]# pair FC:58:FA:14:27:BC
Attempting to pair with FC:58:FA:14:27:BC
[CHG] Device FC:58:FA:14:27:BC Connected: yes
[CHG] Device FC:58:FA:14:27:BC UUIDs: 00001101-0000-1000-8000-00805f9b34fb
[CHG] Device FC:58:FA:14:27:BC UUIDs: 0000110b-0000-1000-8000-00805f9b34fb
[CHG] Device FC:58:FA:14:27:BC UUIDs: 0000110c-0000-1000-8000-00805f9b34fb
[CHG] Device FC:58:FA:14:27:BC UUIDs: 0000110e-0000-1000-8000-00805f9b34fb
[CHG] Device FC:58:FA:14:27:BC UUIDs: 00001200-0000-1000-8000-00805f9b34fb
[CHG] Device FC:58:FA:14:27:BC ServicesResolved: yes
[CHG] Device FC:58:FA:14:27:BC Paired: yes
Pairing successful
[CHG] Device FC:58:FA:14:27:BC ServicesResolved: no
[CHG] Device FC:58:FA:14:27:BC Connected: no
[bluetooth]# connect FC:58:FA:14:27:BC
Attempting to connect to FC:58:FA:14:27:BC
[CHG] Device FC:58:FA:14:27:BC Connected: yes
Connection successful
[CHG] Device FC:58:FA:14:27:BC ServicesResolved: yes
[Tangent Ampster BT]#

Quelque peu pénible... le plus simple étant de redémarrer le service Bluetooth :

$ sudo service bluetooth restart

puis de reconnecter l'ampli depuis l'applet Blueman.