Utiliser deux casques simultanément avec ALSA
Ceux qui ont un petit savent qu'il est impossible de se mater un bon film en soirée, avec le son à plein volume, sans risquer de voir un schtroumpf débarquer en pleine scène gore... La solution est pourtant simple : avoir chacun son casque. Voyons donc comment faire cela simplement avec ALSA.
Choix des casques
Pour faire fonctionner deux casques à l'unisson, il nous faut d'évidence deux casques USB. Personnellement j'aime bien les H600 de logitech mais n'importe lesquels feront l'affaire. Le seul point important est qu'ils aient des fréquences d'échantillonnage compatible. Ne mixez donc pas un casque qui n'accepte que du 44.1Khz avec un casque qui ne consomme que du 48Khz. En revanche un casque qui accepte de 8Khz à 48Khz fonctionnera très bien avec un autre qui ne prend que du 44.1Khz. En gros il faut une plage de fréquence commune et c'est celle là qui sera utilisée par ALSA.
Notez au passage que je parle de casque, mais qu'en réalité tout ce qui suit fonctionnerait tout aussi bien pour n'importe quelle carte son USB ou pas.
Identification des cartes
Une fois les deux casques connectés, lancez alsamixer puis pressez s pour une liste des périphériques reconnues. Notez les deux indices des deux casques (ex. 3 et 4 dans mon cas).
Paramétrage de la sortie virtuelle
Ne reste maintenant plus qu'à éditer (ou créer) votre fichier ~/.asoundrc (ou /etc/asound.conf pour une configuration globale).
pcm.casques {
type route;
# Création d'une sortie virtuelle PCM sur 4 voies
slave.pcm {
type multi;
# On utilise les 2 canaux du 1ier casque
slaves.a.pcm "hw:2,0";
slaves.a.channels 2;
# Puis les 2 canaux du second casque
slaves.b.pcm "hw:3,0";
slaves.b.channels 2;
# On forme les canaux 0 et 1 de la sortie virtuelle
# avec les canaux 0 et 1 du premier casque
bindings.0.slave a;
bindings.0.channel 0;
bindings.1.slave a;
bindings.1.channel 1;
# On forme les canaux 2 et 3 de la sortie virtuelle
# avec les canaux 0 et 1 du premier casque
bindings.2.slave b;
bindings.2.channel 0;
bindings.3.slave b;
bindings.3.channel 1;
}
# routage des canaux source vers le premier casque
ttable.0.0 1;
ttable.1.1 1;
# Puis vers le second
ttable.0.2 1;
ttable.1.3 1;
}
Pour plus de simplicité, prenons ce plug à l'envers en commençant par comprendre ce que fait ce slave.pcm. Déjà il est de type multi. Le rôle de ce plugin est de permettre de fusionner deux sorties PCM en une seule sortie virtuelle. En prenant deux sorties physiques stéréo (les casques), nous obtiendrons donc une sortie virtuelle à 4 canaux. Les canaux 0 et 1 seront en réalité les deux écouteurs du premier casque, et les canaux 2 et 3 ceux du second casque.
Ensuite, on remonte d'un cran, pour retomber sur le plugin route déjà utilisé pour la conversion 5.1 vers 2.0. Son rôle est ici de définir une sortie à deux canaux en routant le premier canal sur les voies 0 et 2 de notre sortie 4 canaux, et le second sur les voies 1 et 3. Et c'est tout...
Mise en oeuvre
Nous avons donc maintenant une sortie virtuelle stéréo qui fait fonctionner à l'unisson nos deux casques. Il ne reste plus qu'à l'utiliser par exemple avec mplayer
gastonmplayer -ao alsa:device=casques notre_film.mkv
Conclusion
ALSA est sans doute aussi puissant qu'il est mal documenté. Mais une fois que l'on a compris comment cela fonctionne il fait vraiment des merveilles. En revanche, je voulais, chaque casque ayant un micro, améliorer le principe en permettant de se parler pendant la séance. Mais j'ai lamentablement échoué... Alors si quelqu'un sait comment faire, je suis preneur :)