Cette manipulation vise à lier deux cartes son (ou plus) supportées par ALSA pour qu'elles apparaissent comme une carte unique (carte virtuelle).
Ceci peut être bien pratique, en particulier avec un logiciel comme Jack, qui n'utilise (en duplex) qu'une carte son à la fois.
Il faut cependant bien comprendre que cela ne synchronisera PAS l'horloge des cartes, et que le son se décallera d'une carte à l'autre avec le temps. Ceci est problématique en particulier pour l'enregistrement, mais est moins grave pour l'écoute. Certaines cartes son plus haut de gamme proposent une connectique spéciale pour relier l'horloge interne, comme wordclock, ADAT...
Table des matières
Carte son multicanal virtuelle
Recopié et traduit de ?Virtual multi channel devices.Copiez et collez le code suivant dans votre fichier asoundrc.
# Créé une carte son virtuelle de quatre canaux avec deux # cartes son réelles. # Il s'agit en fait de deux flux stéréo entrelaçés dans # différentes adresses mémoire, donc Jack devrai se plaindre # qu'il n'a pas un accès mmap. Voir plus bas. pcm.multi { type multi; slaves.a.pcm "hw:0,0"; slaves.a.channels 2; slaves.b.pcm "hw:1,0"; slaves.b.channels 2; bindings.0.slave a; bindings.0.channel 0; bindings.1.slave a; bindings.1.channel 1; bindings.2.slave b; bindings.2.channel 0; bindings.3.slave b; bindings.3.channel 1; } # Jack ne sera pas content s'il n'a pas de mixeur logiciel à # qui parler, donc nous utiliserons celui de la carte son # numéro 0. Il pourrai s'agir de n'importe quelle carte. ctl.multi { type hw; card 0; } # Ceci créé un flux pcm entrelacé de 4 canaux basé sur # la carte 'multi'. Jack fonctionnera avec celui-ci. pcm.ttable { type route; slave.pcm "multi"; slave.channels 4; ttable.0.0 1; ttable.1.1 1; ttable.2.2 1; ttable.3.3 1; } # Voir plus haut ctl.ttable { type hw; card 0; }
Ceci produira des xruns, mais ça convient pour des essais. Pour tester on peut enregistrer puis lire un signal audio :
arecord -f S16_LE -r 44100 -c 4 -D multi | aplay -f S16_LE -r 44100 -c 4 -D multi
Pour démarrer Jack avec la nouvelle carte son virtuelle :
jackd -d alsa -d ttable
pcm_multi, ttable, mmap
pianolivier : j'écris ce paragraphe d'après ce que j'ai pu comprendre sur cette page, mais n'ayant pas essayé ces manipulations moi-même il se peut qu'il soit biaisé. Dans ce cas merci de corriger (et d'effacer cette phrase).Comme on peut le voir dans le fichier de configuration, le programme qui permet de lier/fusionner plusieurs cartes son est donc pcm_multi, il fait partie d'ALSA.
Le programme de routage pcm_ttable permet de relier les blocs ou canaux pour faire fonctionner Jack sans qu'il soit nécessaire que celui-ci ai le support MMAP_COMPLEX. Cependant les ressources supplémentaires nécessitées par ce plugin augmenteraient le temps de latence (en fait cela comprimerait complètement toute opération de basse latence) et les versions de Jack actuelles supportent maintenant MMAP_COMPLEX par défaut.
Le fichier de configuration pourrai donc être simplifié ainsi, à tester :
# Créé une carte son virtuelle de quatre canaux avec deux # cartes son réelles. pcm.multi { type multi; slaves.a.pcm "hw:0,0"; slaves.a.channels 2; slaves.b.pcm "hw:1,0"; slaves.b.channels 2; bindings.0.slave a; bindings.0.channel 0; bindings.1.slave a; bindings.1.channel 1; bindings.2.slave b; bindings.2.channel 0; bindings.3.slave b; bindings.3.channel 1; } # Jack ne sera pas content s'il n'a pas de mixeur logiciel à # qui parler, donc nous utiliserons celui de la carte son # numéro 0. Il pourrai s'agir de n'importe quelle carte. ctl.multi { type hw; card 0; }
Puis démarrer Jack avec :
jackd -d alsa -d multi
Synchronisation de l'horloge interne
Comme expliqué dans l'intro, si les horloges des cartes son ne sont pas synchronisées, des erreurs apparaîtront fatalement, surtout lors de l'enregistrement, avec des messages du type :- snd_pcm_mmap_commit: Assertion `frames <= snd_pcm_mmap_avail(pcm)' failed,
- des Xruns,
- etc...
Liens
Le document ayant servi de base à cette page + exemple de configuration avec deux RME Hammerfall + des explications sur la syntaxe :Virtual multi channel devices sur alsa-project.org (anglais)
Le document ayant servit de base au document précedent (je pense) :
http://alsa.opensrc.org/TwoCardsAsOne (anglais)
Description technique de la bibliothèque de programmation derrière pcm_multi :
http://alsa-project.org/alsa-doc/alsa-lib/pcm_plugins.html (anglais, si on peut dire ça)
Un tuto d'un type dingue pour synchroniser ses deux cartes son à coup de fer à souder dans le cas ou ça n'est pas prévu :
http://quicktoots.linux-audio.com/toots/el-cheapo/ (anglais)
Un tuto sur linuxmao pour fusionner et synchroniser les cartes son pro basées sur la puce ICE1712, en particulier deux m-audio delta 1010 :
exemple de configuration avec deux m-audio delta 1010
Une méthode alternative plus récente et qui agit directement au niveau de Jack :
Jack_alsa_io
[+]