Bip
Par Dimitri Robert, vendredi 8 avril 2005 à 11:48 :: Bidouille :: #14 :: rss
Hier je me suis posé un petit problème (j'aime bien me creuser la tête pour des trucs insignifiants) : je communique avec mes proches par le biais de réseaux de messageries instantannées et j'utilise un client sous Linux que je trouve fabuleux pour gérer tout ça. Il s'agit de centericq. J'ai donc des contacts sur ICQ, AIM et MSN, tous affichés dans la même liste de la même fenêtre. Lorsqu'un message me parvient, le haut-parleur interne m'envoie un bip. Jusqu'ici tout va bien. Sauf que j'ai découvert que l'on pouvait attribuer des sons différents pour chacun des contacts. Ces sons ne sont pas joués par le haut-parleur interne, mais par la carte son.
Cruel dilemme : ma carte son fonctionne en permanence, avide de musique comme je le suis. En effet, j'écoute la radio en continu (j'oscille entre la douce musique de Gotham Radio et les sédiments magnétiques de Divergence-FM). Dans ce cas, les sons produits par centericq sont tout bonnement ignorés, la carte son étant déjà occupée.
L'idéal serait de pouvoir faire une pause dans la musique le temps de jouer le son du message. L'idéal est possible, voici la solution. Cependant, cette solution est très ciblée. Elle est adaptée à l'usage de Xmms auquel il faut rajouter xmms-shell, un outil permettant de manipuler Xmms depuis la ligne de commande.
Le problème de la pause classique est quelle ne libère pas le périphérique son. Vous pouvez essayer de mettre Xmms en pause et de jouer un son depuis un autre logiciel, ça ne marche pas. En regardant dans les commandes de xmms-shell on remarque celle-ci : fakepause : pause XMMS and release the output device. C'est la commande qu'il nous faut.
Pour exécuter une commande xmms-shell en mode non-interactif, on utilise la syntaxe suivante :
xmms-shell -e commande
Or, fakepause ne peut être exécutée qu'en mode interactif (c'est-à-dire, en exécutant xmms-shell sans argument ; on se retrouve alors avec un nouveau prompt). En effet, la commande fakepause, pour libérer le périphérique son, est obligée de faire en réalité un « stop », donc de perdre la position courante dans le morceau (en vrai pause, on conserve cette position). C'est donc xmms-shell qui conserve cette position. Or, appelé en mode non-interactif, xmms-shell est quitté, et toutes ses variables vidées dès la fin de la commande appelée. En mode interactif, xmms-shell n'est terminé qu'à l'appel de la commande quit (ou d'un arrêt brutal).
Le but premier de ce billet est de réaliser un script. Il nous faut donc trouver un moyen d'appeler cette commande fakepause puis de glisser un son ! Voici donc ce script :
echo "fakepause" | xmms-shell music123 $1
On envoie le mot « fakepause » à une instance interactive de xmms-shell créée à la volée. Pour une raison que j'ignore encore, cette instance ne vit pas longtemps et nous laisse juste le temps de placer une autre commande derrière. Si quelqu'un a une idée sur la question, je suis preneur.
J'utilise ici la commande music123, qui, en fonction du format du fichier passé en paramètre, appelle la commande nécessaire pour traiter ce format (par exemple ogg123 pour un son Ogg Vorbis, esdplay pour un fichier Wav).
Il ne reste ensuite plus qu'à dire à centericq quelle commande appeler à quel moment. Ouvrez le fichier ~/.centericq/sounds. Vous verrez sans doute une ligne comme celle-ci :
* msg !spk1
Cela signifie qu'à l'arrivée d'un message, quelque soit l'expéditeur (*), un bip sera joué par le speaker (haut-parleur interne). Pour vos contacts auxquels vous voulez attribuer un son ajoutez une ligne ressemblant à celle-ci :
icq_numéro msg /home/dimitri/bin/icq-sound /usr/share/games/wesnoth/sounds/eagle.wav
Ici j'utilise un son provenant du jeu de stratégie en tour par tour Battle of Wesnoth dont je parlerai forcément prochainement.
Évolution : il y aurait encore mieux à faire, mais pour l'instant cette solution me convient. Quand j'en aurai marre que la musique soit entre-coupée sans cesse au cours d'une discussion, je réfléchirai au moyen de faire passer les deux sons ensemble par la carte son. Je pense que c'est possible. Toutes les suggestions sont les bienvenues dans les commentaires.
PS : je ne suis pas geek, simplement curieux :)


Commentaires
1. Le vendredi 8 avril 2005 à 12:14, par jop :: site
2. Le vendredi 9 décembre 2005 à 17:04, par psirac
3. Le jeudi 14 septembre 2006 à 11:02, par 3Zen
Ajouter un commentaire
Les commentaires pour ce billet sont fermés.