[Jessie et +] Bluetooth audio en ligne de commande

Jessie et ultérieurs utilisent bluez 5, qui introduit pas mal de changements dont :

[ul]
[li] Incompatibilité avec alsa, et donc obligation de passer par pulseaudio[/li]
[li] Depreciation de [mono]bluez-utils[/mono], c’est à dire les commandes [mono]bt-*[/mono][/li][/ul]

Si vous utilisez la ligne de commande pour la gestion du bluetooth, tout est à revoir. Bien que je focalise sur l’audio, la nouvelle méthode d’appairage peut servir dans d’autres situations. J’ai eu pas mal d’appréhension vis à vis de pulseaudio, mais la gestion du BT est en fait plus simple qu’avec alsa.

Ce tuto est particulièrement ciblé vers des systèmes sans environnements de bureau.

[size=150]Installation des paquets de base[/size]

apt-get install pulseaudio pulseaudio-module-bluetooth pavucontrol bluetooth

pavucontrol (petit mixer audio graphique) n’est pas obligatoire mais recommandé pour déboguer les scripts shell de gestion de pulseaudio. Il n’y a pas d’equivalent à [mono]alsamixer[/mono] avec pulseaudio. En ligne de commande il faut passer par [mono]pactl[/mono] et [mono]pacmd[/mono] qui sont les equivalents d’[mono]amixer[/mono], en moins convivial.

A noter que alsamixer est capable de gerer les canaux ‘Master’ et ‘Capture’ de pulse.

Si vous avez un recepteur bimode (a2dp alias haute qualité et un basse qualité), pavucontrol vous permets de choisir le mode.

[size=150]Demarrage du démon pulseaudio[/size]

Le démon doit être lancé en utilisateur. Une solution consiste à placer la ligne:

pulseaudio -D

dans [mono]~/.xsessionrc[/mono]

Vous pouvez au choix fermer votre session ou lancer la ligne ci-dessus afin d’avoir pulseaudio actif. C’est obligatoire pour la suite.

[size=150]Appairage[/size]

Appuyez sur le bouton d’appairage de votre récepteur bluetooth, puis lancez :

$ bluetoothctl

Entrez les commandes situées après ‘[bluetooth]#’. La sortie des commandes est présentée ici indentée, et vous pouvez utiliser tab pour la completion. Notez l’adresse MAC de votre recepteur (ici C8:84:47:15:74:7C), cela va nous servir pour la suite.

    [NEW] Controller 88:9F:FA:F0:AD:83 nucleardevice [default]
[bluetooth]# agent on
[bluetooth]# default-agent
[bluetooth]# scan on
    Discovery started

    [CHG] Controller 88:9F:FA:F0:AD:83 Discovering: yes
    [NEW] Device C8:84:47:15:74:7C (7C)Logitech Adapter

[bluetooth]# pair C8:84:47:15:74:7C 

    Attempting to pair with C8:84:47:15:74:7C
    [CHG] Device C8:84:47:15:74:7C Connected: yes
    [CHG] Device C8:84:47:15:74:7C UUIDs:
        0000110b-0000-1000-8000-00805f9b34fb
    [CHG] Device C8:84:47:15:74:7C Paired: yes
    Pairing successful
    [CHG] Device C8:84:47:15:74:7C Connected: no
[bluetooth]# trust C8:84:47:15:74:7C
[bluetooth]# connect C8:84:47:15:74:7C 
    
    Attempting to connect to C8:84:47:15:74:7C
    [CHG] Device C8:84:47:15:74:7C Connected: yes
    Connection successful

[bluetooth]# quit
    
    [DEL] Controller 88:9F:FA:F0:AD:83 nucleardevice [default]

Le [DEL] est sans importance, la connexion est faite et la diode du récepteur a du passer au vert.

[size=150]Vérification[/size]

Si vous avez mplayer, lancez une video ou un titre de musique, la connexion étant opérationnelle et mplayer utilisant pulse par défaut, le son devrait sortir via le bluetooth. Si ça ne fonctionne pas, utilisez [mono]pavucontrol[/mono] pour définir la sortie vers le BT.

Vous pouvez utiliser bien sûr un autre lecteur, mais veillez à ce que la sortie se fasse via pulseaudio et non alsa. Toutes vos applications utilisant du son devraient être configurées pour utiliser pulseaudio.

[size=150]Script de gestion[/size]

Vous l’avez sûrement remarqué, vos raccourcis de volume ne fonctionne plus, vous vous demandez aussi comment vous allez vous reconnecter au prochain reboot etc.

Comme je l’ai dit plus haut, il va falloir passer par du script, peu importe le langage, pour gérer tout ça. Ici j’utilise un script shell qui permet de :
[ul]
[li] Passer toutes les applications vers une sortie particulière (basculement entre bluetooth et le filaire en pratique)[/li]
[li] Régler le volume[/li]
[li] Connecter le PC au récepteur[/li]
[li] Lister les sorties disponibles[/li][/ul]
Ce script est minimal, mais fait la base. Consultez [mono]man pactl[/mono] et [mono]pacmd help[/mono] pour voir l’intégralité des fonctionnalités disponibles. N’oubliez pas de modifier votre adresse MAC dans le script aussi ^^

#!/bin/sh

# L'adresse MAC du recepteur pour la connexion
MAC="C8:84:47:15:74:7C" 

_list() {
    pacmd list-sinks | awk  -F ': ' '
        BEGIN {
            print("Cartes disponibles (id => nom):\n")
        }
        /^[ \t\*]+index:/ {
            printf("%s => ", $2)
        }
        /^[ \t]+card/ {
            split($2, elems, " ")
            gsub(/[<>]/, "", elems[2])
            print(elems[2])
        }
    '
}

_switch() {
    for app in $(pacmd list-sink-inputs | awk -F': ' '/index/ {print $2}'); do 
        pacmd move-sink-input $app $1 
    done
    pacmd set-default-sink $1 
}


_vol() {
    vol="$1"
    for sink in $(pacmd list-sinks | awk -F ': ' '/index:/ {printf $2" "}'); do
        pactl set-sink-volume $sink -- "$vol"
    done
}

_help() {
    cat <<EOF
$0: Gestionnaire minimal pulseaudio + BT
Syntaxe: $0 commande [options]

list, l 
    Affiche la liste des sorties audio disponibles.
    Les informations sont représentées sous le format "id => nom".
    Un id ou un nom peut être utilisé indiféremment avec la
    commande switch. Les id peuvent être différents suivant les sesisons
    mais les noms sont toujours identiques.

switch, s nom|id
    Modifie la sortie audio par défaut en cours, et y redirige la sortie
    audio de toutes les applications. 

vol valeur
    Modifie le volume de toute les sorties audios. Les dB ou % sont
    acceptés et peuvent être préfixés de '+' et '-' pour être relatifs
    à la valeur en cours.

connect, c
    Se connecte au recepteur BT.

disconnect, d 
    Se deconnecte du recepteur BT.
EOF
    exit 1
}


case "$1" in
    list|l|"") _list;;
    switch|s) shift; _switch "$1";;
    vol|v) shift; _vol "$1";;
    connect|c) printf "connect $MAC\nquit"| bluetoothctl;;
    disconnect|d) printf "disconnect $MAC\nquit\n"| bluetoothctl;;
    *) _help;;
esac

Exemples
On récupére la liste des sorties dispos:

$ mypa list
Sorties disponibles (id => nom):

0 => alsa_card.pci-0000_00_1b.0
8 => bluez_card.C8_84_47_15_74_7C

Vous l’aurez deviné, [mono]bluez_card.C8_84_47_15_74_7C[/mono] est mon recepteur BT. Si je veux le mettre par défaut :

$ mypa s 8

Pour monter le volume de +2db par exemple :

$ mypa vol +2db

Le remettre à son ancien niveau :

$ mypa vol -2db

Bien sur on peut mettre un pourcentage d’augmentation ou de baisse, relatif au reglage du volume en cours, et non pas au volume total.

$ mypa vol +10%
$ mypa vol -20%

Je n’ai pas intégré de mute, mais vous pouvez utiliser :

$ mypa vol

sans argument pour mettre en sourdine.

Ayant fini de jouer, je me déconnecte.

$ mypa d

Le son devrait repasser par le filaire :slightly_smiling: