Artisan Numérique

/bureau/bureautique/inotify/sip/ekiga/ Faire sonner Ekiga dans la bonne carte son...

Aujourd'hui un PC ne sait plus que faire de ses sorties Audio. Entre celle intégrée à la carte mère, celles deux casques USB pour la VoIP (un sans fil, et un en mode panique lorsque les batteries du premier sont à plat ;-), celle collée sous clavier et puis celle de la webcam, pulseaudio devient rapidement incontournable pour jouer les agents de carrefour.

Mais les problèmes arrivent lorsque certaines applications, Ekiga ou Skype pour ne pas les citer, soit ne savent causer qu'à ALSA, soit prennent en charge PulseAudio mais sans distinguer la sortie "sonnerie" de la sortie "blabla". Ce qui l'un dans l'autre revient au même : je loupe des appels car ils sonnent.. dans le casque...

L'objectif ici est donc, un peu comme pour Evolution et D-Bus, de créer un petit script qui corrige définitivement le problème. Nous aurions pu utiliser la même technique mais malheureusement, Skype (sauf pour faire passer son protocole proprio) comme Ekiga (sauf s'il est compilé pour), ne prenne pas en charge D-Bus. Heureusement, Linux (sans le GNU cette fois ;-) est plein de ressource, avec cette fois iNotify.

iNotify

iNotify est un mécanisme intégré au sein du noyau Linux qui permet de se mettre à l'écoute des opérations effectuées sur un dossier ou sur un fichier. Vous allez me dire c'est bien joli, mais quel rapport avec les appels entrant sur Ekiga et Skype ? Très simple, lorsque l'un ou l'autre détecte un appel entrant, il va aller lire un fichier audio défini comme sonnerie. Ce même fichier audio que je n'entend pas car il est lu dans le casque. Avec iNotify, je peux détecter l'ouverture de ce fichier, me permettant du coup d'émettre MA sonnerie sur MES baffles en passant paplay, l'utilitaire de lecture inclus dans pulseaudio. Un peu tordu, je vous l'accorde, mais diablement efficace.

Le script

Comme pour Evolution, Python semble clairement le langage le plus efficace pour cette tâche, juste une 20aine de lignes et le tour est joué :

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pyinotify, os, time

# La classe qui va recevoir les notifications
class EventHandler(pyinotify.ProcessEvent):
def process_IN_OPEN(self, event):
# Appel à paplay en spécifiant un client "dring" facilement reconnaissable dans pavucontrol
os.system("paplay --client-name='dring' /home/gaston/.sounds/ring.wav")

# Création d'un gestionnaire d'écoute iNotify
wm = pyinotify.WatchManager()

# Enregistrement de notre classe pour être notifié
notifier = pyinotify.Notifier(wm, EventHandler())

# Ajout d'une écoute sur les opérations d'ouverture du fichier audio
wm.add_watch("/usr/share/sounds/ekiga/ring.wav", pyinotify.IN_OPEN)

# Lancement de l'écoute
notifier.loop()
Sonnerie pour Ekiga et Skype

Le principe est assez simple. Tout d'abord nous allos créer le gestionnaire d'écoute wm auquel nous allons fournir une classe dont la méthode process_IN_OPEN sera appelée lors d'une opération d'ouverture. Enfin nous ajoutons une écoute sur le fichier ring.wav utilisé par Ekiga pour sa sonnerie et nous lançons le tout dans une boucle sans fin.

Dans la procédure process_IN_OPEN, nous faisons appel à la fonction paplay fournie avec pulseaudio. Cette commande va simplement jouer le fichier de ma sonnerie (un autre que celui d'Ekiga sinon ça boucle !! :-) avec Dring comme nom de client PulseAudion.

Pour tester, il suffit de lancer le script par python mon_script.py & et de faire un cat /usr/share/sounds/ekiga/ring.wav > /dev/null pour simuler une ouverture. Le second fichier devrait alors être joué. S'il ne sort pas sur la bonne carte audio, il suffit de lancer pavucontrol pour rediriger le flux du client dring vers la bonne sortie.

Conclusion

Bien évidement vous pouvez auditer plusieurs fichiers en même temps, comme celui de Skype, de sorte à obtenir une sonnerie unifié pour tous vos appels VoIP (Skype, GTalk, Ekiga, etc.) ou encore corser la sauce en rajoutant une notification via LibNotify. C'est sur ce genre de détail que l'on apprécie tellement GNU/Linux. Aucune application n'est parfaite, mais aucun autre OS (de ma connaissance en tout cas) ne permet de corriger ou personnaliser aussi facilement tel ou tel aspect sans avoir à quémander un patch ou attendre patiemment une mise à jour.