Bluetooth, le son et les softphones sous Mandriva 2008.1

Introduction :

        Confiant dans les possibilités présentes et avenir de Linux, j'ai acheté voici quelques mois un casque bluetooth Plantronics 590E et un dongle USB Sitecom CN-521 avec l'intention de m'en servir pour écouter de la musique et, surtout, téléphoner avec mes softphones préférés que sont Twinkle, Ekiga et Wengophone. J'espérais que Mandriva m'offrirait les outils permettant d'atteindre ces objectifs facilement, mais je n'ai rien trouvé de tel. Certes, il existe ce qu'il faut pour échanger des fichiers entre ordinateur et  téléphone cellulaire mais, à ma connaissance, rien pour le son. Je me suis donc livré à une recherche sur l'internet qui m'a permis d'aboutir et j'ai enfin aujourd'hui le plaisir de vous en faire profiter. Ce qui vaut pour mon matériel vaut probablement tout aussi bien pour un casque d'une autre marque ou n'importe quelle oreillette bluetooth, mais je ne l'ai pas vérifié. Les procédés que je vais décrire sont sans avenir car des développeurs travaillent à améliorer les choses du côté de Bluez, ALSA et pwlib, notamment . C'est une des raisons pour lesquelles je n'ai pas choisi d'écrire un article dans le wiki Mandriva, une autre raison étant le caractère « science officielle » de ce wiki, peu propice à l'exposé d'une technique hésitante par le pauvre bidouilleur que je suis.
   

Contexte et prérequis :

        Je n'expliquerai pas aujourd'hui comment procéder au pairage du casque et de l'ordinateur, pour la bonne raison que je ne me rappelle pas comment je l'ai réalisé il y a déjà plusieurs semaines. Cette opération, qui n'est pas spécifique aux applications audio, n'est en effet à faire qu'une seule fois, du moins si on n'utilise le périphérique qu'avec un seul pair, en l'occurence un ordinateur. Avec votre aide, je rajouterai peut-être un paragraphe à ce sujet par la suite.
L'adresse MAC du casque est supposée connue. Elle ne figure probablement pas dans sa notice mais on y trouve son code PIN.

        Pulseaudio est activé mais je pense que cela ne concerne que la carte son.

        Le fichier /etc/bluetooth contient à sa dernière ligne : Autostart=true

        L'adresse MAC du casque est recopiée dans le fichier de configuration /etc/bluetooth/rfcomm.conf à la ligne device.

        Le code PIN est recopié dans le fichier /etc/bluetooth/pin. Pour moi c'est 0000 mais il y avait 1234 à l'origine.

        Les services alsa, bluetooth, hidd, sound sont actifs.

        Kbluetooth est en cours d'exécution et son icône dans la boîte à miniatures indique par sa couleur si la connexion avec le casque est établie.

        Il me semble que dès le premier enfichage du dongle USB ou peut-être même avant, Mandriva a installé un certain nombre d'outils. D'autres furent installés par mes soins, dont une partie n'est peut-être pas utile. Quoiqu'il en soit, voici une liste des paquets installés qui me semblent en rapport avec le sujet. En les installant chez vous, vous serez à peu près sûr de ne manquer de rien :

  • bluez-firmware-1.2-3mdv2008.0
  • bluez-utils-3.28-1.1mdv2008.1
  • libbluez-devel-3.28-1.1mdv2008.1
  • python-pybluez-0.9.2-1mdv2008.1
  • bluez-utils-alsa-3.28-1.1mdv2008.1
  • libbluez2-3.28-1.1mdv2008.1
  • alsa-utils-1.0.16-1mdv2008.1
  • libalsa-plugins-1.0.16-8mdv2008.1
  • kdebluetooth-1.0-0.beta8.8mdv2008.1         <- J'utilise KDE.
  • libkdebluetooth0-1.0-0.beta8.8mdv2008.1
  • gnome-bluetooth-0.11.0-2mdv2008.1           <- probablement utile sous Gnome

Méthode facile fonctionnant avec la plupart des applications multimédia et Skype :

Préparation :

Source : http://wiki.bluez.org/wiki/HOWTO/AudioDevices

        On y décrit des commandes shell que j'ai expérimentées avec succès et qu'on pourrait réunir dans des scripts bash, ce qui éviterait d'avoir à installer encore un paquet, mais j'ai trouvé plus facile de procéder ainsi :

- Installer python-dbus-0.82.4-2mdv2008.1
- Créer un script python qu'on peut, comme moi, nommer bthifi.py et dont voici le contenu :

#! /usr/bin/env python
import dbus
bus = dbus.SystemBus()
manager = dbus.Interface(bus.get_object('org.bluez', '/org/bluez'), 'org.bluez.Manager')
bus_id = manager.ActivateService('audio')
audio = dbus.Interface(bus.get_object(bus_id, '/org/bluez/audio'), 'org.bluez.audio.Manager')
path = audio.CreateDevice('00:19:7F:3C:CA:DE') #   <-- remplacer par la vraie adresse MAC du casque
sink = dbus.Interface (bus.get_object(bus_id, path), 'org.bluez.audio.Sink')
sink.Connect()


- Créer un second script python, btvoice.py :

#! /usr/bin/env python
import dbus
bus = dbus.SystemBus()
manager = dbus.Interface(bus.get_object('org.bluez', '/org/bluez'), 'org.bluez.Manager')
bus_id = manager.ActivateService('audio')
audio = dbus.Interface(bus.get_object(bus_id, '/org/bluez/audio'), 'org.bluez.audio.Manager')
path = audio.CreateHeadset('00:19:7F:3C:CA:DE')#   <-- remplacer par la vraie adresse MAC du casque
headset = dbus.Interface (bus.get_object(bus_id, path), 'org.bluez.audio.Headset')
#Connect and Play are not required in PCM mode
headset.Connect()
#headset.Play()


        Ces deux scripts ayant été rendus exécutables, on peut rendre plus facile leur lancement en les plaçant dans un répertoire figurant dans le PATH de l'utilisateur, comme /usr/local/bin. Pour ma part, j'ai seulement mis dans ce répertoire des liens symboliques pointant vers ces scripts quelque part dans mon home. Il est déconseillé de les lancer en root et j'ignore même si l'effet attendu se produirait.

- Mettre ce qui suit dans ~/.asoundrc qu'on crée pour la circonstance s'il n'existe pas :

pcm.bluetooth {
    type bluetooth
        device "00:19:7F:3C:CA:DE" #  <-- remplacer par la vraie adresse MAC du casque
        profile "auto"             #optional, supported profiles are: auto, hifi and voice
}

Utilisation dans les applications multimédia :

- Enficher le dongle
- Allumer le casque
- Exécuter bthifi.py
        Si tout va bien, on peut déjà écouter de la musique en faisant simplement :

$ aplay -D bluetooth fichier.wav ou
$ mplayer -ao alsa:device=bluetooth fichier.ogg

        Configurer l'application qu'on se propose d'utiliser de façon qu'elle utilise le périphérique ALSA bluetooth. Par exemple, pour VLC, il faut remplacer la dernière ligne de ~/.vlcrc par « alsadev=bluetooth ». (Sans les guillemets.) Certaines applis se configurent facilement depuis leur interface graphique, d'autres non. Le site bluez donne quelques indications à ce sujet.

Utilisation avec les softphones :

- Enficher le dongle
- Allumer le casque
- Exécuter btvoice.py
        Vérifier qu'on s'entend parler dans le casque avec cette commande :

$ arecord -D bluetooth -f S16_LE | aplay -D bluetooth -f S16_LE

- Configurer le softphone. Malheureusement, seul Skype dans sa récente version 2 accepte le device ALSA bluetooth. Cela fonctionne parfaitement mais n'est guère satisfaisant pour un amateur de logiciels libres. (J'ai vainement essayé Ekiga, Twinkle, Wengophone, Kphone, Linphone, Gizmo et même XLite.)

Méthode plus compliquée permettant d'utiliser Twinkle :

Source : http://bluetooth-alsa.sourceforge.net/build.html

Préparation :

- Installer les paquets suivants si ce n'est déjà fait :
  • cvs-1.12.13-12mdv2008.1
  • libbluez-devel-3.28-1.1mdv2008.1
  • libalsa2-devel-1.0.16-2mdv2008.1
  • libdbus-1-devel-1.1.20-5mdv2008.1
  • libpcre-devel-7.6-2.1mdv2008.1
  • glib-gettextize-2.16.2-1mdv2008.1
  • libglib2.0-devel-2.16.2-1mdv2008.1
  • libdbus-glib-1_2-devel-0.74-4mdv2008.1
- En appliquant les consignes données sur le site ci-dessus, procéder à l'installation de libsbc puis plugz. Après le make, j'ai fabriqué pour chacun un petit rpm à usage local avec l'aide de checkinstall. Ce sera plus simple pour les supprimer ultérieurement.

- Télécharger et installer un kernel-source 2.6.23 car ce sont les derniers à pouvoir être patchés comme indiqué plus loin. J'ai choisi celui-ci : ftp://mon-miroir-favori/ftp.mandriva.com/MandrivaLinux/official/2008.0/i586/media/contrib/updates/kernel-linus-2.6.23.16-1mdv-1-1mdv2008.0.i586.rpm
Comme il est imprudent de travailler en root dans les répertoires système, on peut ensuite recopier le répertoire des sources dans son home et y effectuer le patch et la compilation comme suit :

- Appliquer le patch flow-control-v4.3.diff contenu dans le répertoire des sources de plugz :

$ cd ~/rpmbuild/SOURCES/kernel-linus-2.6.23.16-1mdv         <-- Ce sont des exemples de chemins
$ patch -p1 < ~/plugz/patches/sco-flowcontrol-v4.3.diff          <-- à adapter au besoin.

        Tout s'accomplit en un clin d'œil et sans erreur et sans laisser dans les deux répertoires visités aucun fichier .rej ou .orig.

- Compiler le noyau. Ayant jugé prudent et plus rapide de ne toucher à rien, je ne suis pas passé par l'étape « make mrproper » ni par « make xconfig » mais on peut en profiter pour supprimer tel ou tel module ou modifier certains choix, vous êtes libre :

$ make
$ su   <-- Il faut bien passer root pour l'installation proprement dite, qui ne dure que quelques instants.
# make modules_install
# make install

        Et voila notre noyau installé, grub s'étant configuré automatiquement pour offrir ce choix au prochain redémarrage. Pour atteindre notre objectif, il ne faudra pas oublier de rebooter avec. Personnellement, j'en ai fait mon noyau par défaut dans le mcc.

- Mettre ce qui suit dans ~/.asoundrc. On peut laisser ce qui s'y trouve déjà s'il n'y existe aucun autre pcm.headset :

pcm.headset {
    @args [BDADDR TIMEOUT]
# The Bluetooth device address for target headset, used for Audio Gateway (PC) initiated connections
        # Please note that this value is ignored when the connection is Headset initiated
    @args.BDADDR {
        type string
        default "00:19:7F:3C:CA:DE"  #  <-- à adapter
    }
# This value represents how long we will try to reach the headset, until we give up.
    # Value is in milliseconds
    @args.TIMEOUT {
        type integer
        default 6000
    }
    type        sco
    bdaddr      $BDADDR
    timeout     $TIMEOUT
}
ctl.headset {
    type sco
}

Utilisation :

        On peut, comme moi, laisser le dongle USB enfiché en permanence, sa consommation étant négligeable.

- Lancer le démon headsetd :

$ headsetd

        J'ai obtenu qu'il se lance automatiquement au démarrage de l'ordinateur en mettant dans /home/.kde/Autosart un lien vers un script bash ultra-simple dont voici le contenu :

#!/bin/sh
sleep 10
/usr/bin/headsetd


        De cette façon, j'e n'ai rien d'autre à faire pour téléphoner avec Twinkle que d'allumer le casque. :-) Ce soft qui permet d'exploiter des comptes SIP chez n'importe quel opérateur virtuel a en outre bon caractère : C'est le seul parmi ceux cités plus haut qui accepte le périphérique ALSA « headset ». Et cela se fait simplement dans son interface graphique après avoir choisi comme haut-parleur et comme microphone « ALSA: other device » dans Edition -> Paramètres système -> Audio. Comme sonnerie, il vaut autant à mon avis laisser « default » si on ne veut pas vivre en permanence avec un casque sur les oreilles.

Pour utiliser aussi Ekiga :

       Dans le répertoire des sources de plugz se trouve également un patch appliquable à pwlib, une bibliothèque utilisée par Ekiga. Ce patch, qualifié de grossier par son auteur, a le grand mérite de faire apparaître dans la configuration d'Ekiga un périphérique audio « Bluetooth headset » qu'on peut choisir dans Edition -> Préférences -> Périphériques. J'ai procédé comme suit avec succès, mais ce n'est pas un modèle d'orthodoxie administrative :

- Téléchargeons pwlib-1.10.10.3mdv2008.1.src.rpm :

$ wget ftp://mon-miroir-favori/ftp.mandriva.com/MandrivaLinux/official/2008.1/SRPMS/main/release/pwlib-1.10.10-3mdv2008.1.src.rpm

- Installons le avec urpmi, de sorte que les dépendances soient installées automatiquement (21 petits paquetages dans mon cas) :

# urpmi ./pwlib-1.10.10-3mdv2008.1.src.rpm

        Recopions le répertoire des sources dans notre home où nous pourrons travailler sans risque excessif :

$ cp /usr/src/rpm/SOURCES/pwlib* ~/rpmbuild/SOURCES

- Décompressons et désarchivons :

$ cd ~/rpmbuild/SOURCES
$ bunzip2 pwlib-1.10.10.tar.bz2
$ tar -xf pwlib-1.10.10

- Appliquons le patch :

$ cd pwlib-1.10.10
$ patch -p0 < ~/plugz/patches/pwlib.1.10.10.diff

  - Passons à l'étape classique du configure. Les options sont choisies à l'instinct, les deux premières ne sont peut-être pas utiles :

$ ./configure --enable-h323 --enable-opal --enable-plugins --enable-alsa

- Puis construisons la totalité de la bibliothèque :

$ make

        La suite est du bricolage parce que je n'ai pas eu le courage de (chercher comment) recréer un paquet libpwlib1-plugins :

$ cd /usr/lib/pwlib/devices/sound
$ su
# mv alsa_pwplugin.so alsa_pwplugin.so.save
# cp  /home/user/rpmbuild/SOURCES/pwlib-1.10.10/plugins/pwlib/device/sound/alsa_pwplugin.so ./

- Lançons Ekiga et choisissons le périphérique ALSA « Bluetooth headset ». Il est peut-être utile de redémarrer Ekiga.

        Et voilà, ça marche. :-)

Complément du 25 septembre 2008 :

Ekiga 3.x.x n'utilise plus la bibliothèque pwlib mais ptlib. Qu'à cela ne tienne, le même patch pwlib.1.10.10.diff s'applique aussi bien à cette dernière malgré des offsets différents. Après téléchargement des sources de ptlib on pourra donc compiler et utiliser cette dernière après avoir appliqué ce patch de la même façon :

$ cd ptlib-2.4.1
$ patch -p0 < ~/plugz/patches/pwlib.1.10.10.diff

Utiliser aussi des logiciels multimédia avec a2dpd :

        Plugz fournit aussi le moyen d'écouter de la musique. J'ai essayé et ça marche bien, même si je préfère m'en tenir à la méthode avec le script bthifi et le périphérique bluetooth qui fonctionnent aussi bien avec ce noyau 2.6.23. Voici ce qu'il reste à faire si vous voulez comparer :

$ cd ~/plugz
$ cp alsa-plugins/a2dpd/sample.a2dprc ~/.a2dprc

- Éditer le fichier ~/.a2dprc ainsi créé et y corriger l'adresse MAC du casque à la ligne address=. (Ligne 92)

- Ajouter ces trois lignes dans ~/.asoundrc :

pcm.a2dpd {
    type a2dpd
}

- Lancer le démon a2dpd :

$ a2dpd

- Configurer le logiciel multimédia pour utiliser le périphérique ALSA a2dpd, ou le préciser dans la ligne de commande.

Conclusion provisoire :

        Pour le moment, je ne vois plus rien d'autre à ajouter mais j'ai forcément oublié quelque chose d'important et/ou commis des erreurs. Merci de me le signaler à l'adresse suivante : geo.cherchetout@laposte.net et je corrigerai ou m'efforcerai de compléter avec votre aide.

        Régalez vous les oreilles avec bluetooth.


Auteur : Gegetel ~ Première édition : 16 août 2008 ~ Dernière modification : 25 septembre 2008