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

iNotifypaplay, 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.

Vus : 1484
Publié par Artisan Numérique : 100