Artisan Numérique

/système/audio/alsa/ 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 :)