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