My Own Memory Hole
Blog♯mpd

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

Générer des playlists pour MPD avec les dernières pistes ajoutées

Afin de retrouver facilement dans ncmpcpp les dernières pistes ajoutées à ma bibliothèque, j'ai trouvé et adapté le script suivant.

nano ~/bin/lastaddedmpd
#!/bin/bash

cd /home/$USER/NAS/Musique
find . -type f -ctime -1 | egrep '\.mp3$|\.flac$' | awk '{ sub(/^\.\//, ""); print }' | sort -n > /home/$USER/NAS/Musique/playlists/$(date +%d-%m-%Y)_last_$1_days.m3u
chmod +x ~/bin/lastaddedmpd

Et on lance la commande lastaddedmpd avec pour argument le nombre de jours à prendre en compte.

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

mpdscribble : scrobbler vers last.fm et Libre.fm

mpdscribble, une fois installé et configuré (cf. cet article), ne scrobble que vers le service last.fm.

Si vous souhaitez scrobbler la musique que vous écoutez avec MPD également vers l'alternative libre à last.fm, Libre.fm, il faut alors modifier à la main le fichier de configuration de mpdscribble qui devrait ressembler à cela :

$ sudo cat /etc/mpdscribble.conf
## mpdscribble - an audioscrobbler for the Music Player Daemon.
## http://mpd.wikia.com/wiki/Client:mpdscribble

# HTTP proxy URL.
#proxy = http://the.proxy.server:3128

# The location of the pid file.  mpdscribble saves its process id there.
#pidfile = /var/run/mpdscribble.pid

# Change to this system user after daemonization.
#daemon_user = mpdscribble

# The location of the mpdscribble log file.  The special value
# "syslog" makes mpdscribble use the local syslog daemon.  On most
# systems, log messages will appear in /var/log/daemon.log then.
# "-" means log to stderr (the current terminal).
log = syslog

# How verbose mpdscribble's logging should be.  Default is 1.
verbose = 1

# How often should mpdscribble save the journal file? [seconds]
#journal_interval = 600

# The host running MPD, possibly protected by a password
# ([PASSWORD@]HOSTNAME).  Defaults to $MPD_HOST or localhost.
#host = localhost

# The port that the MPD listens on and mpdscribble should try to
# connect to.  Defaults to $MPD_PORT or 6600.
#port = 6600

[last.fm]
url = http://post.audioscrobbler.com/
username = my_username
password = my_password
# The file where mpdscribble should store its Last.fm journal in case
# you do not have a connection to the Last.fm server.
journal = /var/cache/mpdscribble/lastfm.journal

#[libre.fm]
#url = http://turtle.libre.fm/
#username = my_username
#password = my_password
#journal = /var/cache/mpdscribble/librefm.journal

#[jamendo]
#url = http://postaudioscrobbler.jamendo.com/
#username = my_username
#password = my_password
#journal = /var/cache/mpdscribble/jamendo.journal

#[file]
#file = /var/log/mpdscribble/log

ATTENTION : il semblerait que mpdscribble ne parvienne pas à scrobbler vers les deux services si vos comptes ont le même identifiant et le même mot de passe.

Avant d'éditer le fichier /etc/mpdscribble.conf, il faut calculer le hash de votre mot de passe ; pour ce faire, lancer la commande :

$ echo -n 'PASSWORD' | md5sum | cut -f 1 -d " "

Copiez le résultat puis lancez l'édition du fichier de conf de mpdscribble :

$ sudo nano /etc/mpdscribble.conf

et modifiez la section libre.fm : décommentez chacune des lignes de celle-ci et saisissez votre nom d'utilisateur et copiez le hash de votre mot de passe. Cette section devrait ressembler à cela :

[libre.fm]
url = http://turtle.libre.fm/
username = USER
password = 319f4d26e3c536b5dd871bb2c52e3178                 #hash de PASSWORD
journal = /var/cache/mpdscribble/librefm.journal

Une fois enregistré, il vous faut relancer mpdscribble :

$ sudo service mpdscribble restart

mpdscribble : conserver les morceaux scrobblés dans un log

Par défaut, il semblerait que mpdscribble ne conserve pas dans un log les morceaux scrobblés (sauf lorsque l'on n'a pas de connexion au service de scrobbling de LastFM).
Il est évidemment possible de garder la trace localement de tout ce que MPD lit, simplement en modifiant le fichier de configuration /etc/mpdscribble.conf. Cependant, il faut bien garder à l'esprit qu'un tel fichier de log ne fait que grossir, posant d'éventuels problèmes sur le long terme. Ce n'est donc pas forcément une bonne idée...

Mais pour ce faire, il suffit donc de modifier le fichier de configuration /etc/mpdscribble.conf :

$ sudo nano /etc/mpdscribble.conf

et de décommentez les dernières lignes du fichier, pour obtenir ceci :

[file]
file = /var/log/mpdscribble/log

Puis on crée le répertoire /var/log/mpdscribble et on lui donne pour propriétaire l'"utilisateur" mpdscribble :

$ sudo mkdir /var/log/mpdscribble && sudo chown mpdscribble /var/log/mpdscribble

On relance le service mpdscribble :

$ sudo service mpdscribble restart

Pour vérifier que tout fonctionne, on lance la lecture et à la fin de la lecture de la première piste, vous devriez la voir apparaître dans le log que l'on affiche ainsi :

$ tail -f /var/log/mpdscribble/log

mpdscribble : MPD et LastFM

Utilisateur de LastFM et de MPD pour écouter ma musique, je dois pouvoir scrobbler les titres que j'écoute : mpdscribble est la solution, particulièrement simple à installer et configurer.

Il faut donc commencer par installer le paquet mpdscribble :

$ sudo apt install mpdscribble

Une fois cela fait, il faut le configurer :

$ sudo dpkg-reconfigure mpdscribble

Il faut alors accepter de lancer mpdscribble comme daemon, puis saisir ses identifiants LastFM. Une fois cela fait, le service devrait démarrer et les titres écoutés apparaîtront sur LastFM.