Informations du tutoriel :
> But : Associer deux cartes son comme s'il s'agissait d'une même carte
> Date : dernière mise-à-jour le 19 Mars 2012
> Auteur(s) : Claude Simon (cjpsimon).
> Fil de forum lié
Intro : Il y a des cas ou on voudrait pouvoir associer deux Cartes son pour une application bien particulière. Un de ces cas est celui qui nécessite une carte en capture (enregistrement) et une autre en playback (écoute) comme s'il s'agissait d'une même carte.
Cette page explique une des manipulations possibles pour obtenir ce résultat avec Jack.
Table des matières
Problème
Voila mon utilisation bien particulière :Je dispose d'une platine vinyle USB, d'une carte son interne, et d'une carte son USB M-audio Fast Track Pro. Mon désir est d'écouter des disques soit sur ma carte son interne soit sur ma carte son USB et de pouvoir les enregistrer.
Mes cartes
$ cat /proc/asound/cards 0 [SB ]: HDA-Intel - HDA ATI SB HDA ATI SB at 0xfccf4000 irq 16 1 [CODEC ]: USB-Audio - USB Audio CODEC Burr-Brown from TI USB Audio CODEC at usb-0000:00:13.0-1, full speed 2 [NVidia ]: HDA-Intel - HDA NVidia HDA NVidia at 0xfe97c000 irq 19 3 [Pro ]: USB-Audio - FastTrack Pro M-Audio FastTrack Pro at usb-0000:00:12.0-5, full speed
- La carte 0 est ma carte son interne
- La carte 1 appelée CODEC est ma platine vinyle USB
- La carte 2 est inutilisée (HDMI de ma carte vidéo).
- La carte 3 est ma carte Fast Trac Pro appelée Pro
Associer deux cartes son
J'ai repéré qu'avec Jack on peut construire une interface composée d'une carte en Playback et une autre en Capture. Pour voir les paramètres : man jackd.Premier essai
Voici les paramètres que j'utilise dans un premier temps pour lancer jackd :- -d alsa ? pour utiliser ALSA
- -C hw:1 ? ma platine vinyle USB
- -P hw:0 ? ma carte son interne.
J'ai donc lancé jack dans un terminal avec les paramètres suivants :
jackd -d alsa -C hw:1 -P hw:0
Tests
Après cela j'ai lancé Audacity, et dans les préférences j'ai paramétré l'interface avec JACK Audio Connection Kit. Le périphérique de lecture système et le périphérique d'enregistrement système sont imposés.
Pour vérifier mes niveau d'enregistrement j'ai voulu connecter Meterbridge.
J'ai lancé QJackCtl et cliqué sur Démarrer. Cela à pour effet pour Qjackctl de prendre en compte le serveur jackd que j'avais lancé.
J'ai lancé Meterbridge, puis j'ai connecté system => bridge.
J'ai mis un disque et j'ai lancé l'enregistrement. J'ai mis sur pause et j'ai bien vu dans le fenêtre Connecter que PortAudio et system (la carte son) étaient connectés.
Voila pour ma connexion carte interne et platine vinyle USB.
Deuxième essai
Pour connecter ma carte Fast track pro je n'ai eu qu'à remplacer le paramètre -P hw:0 par -P hw:3Automatisation de la solution
Pour automatiser le procéder, il faut définir le numéro des cartes son une bonne fois pour toutes, car ces numéros peuvent changer au redémarrage.Pour celà il y a deux solution :
? La première agit sur ALSA et est décrite plus en détails sur cette page,
? La deuxième est une sorte de contournement et agit sur Jack. C'est celle-ci que j'ai choisi pour ce tuto mais elle ne fonctionne pas dans le cas ou plusieurs des cartes son ont un nom similaire.
Pour cela on remplace le numéro de carte son par le nom donné par la commande cat /proc/asound/cards :
Dans l'exemple plus haut, la carte 1 s'appelle CODEC et la carte 3 s'appelle Pro.
Ce qui fait que ma commande jackd devient :
jackd -d alsa -C hw:CODEC -P hw:Pro
Ajout des paramètres physiques
Les paramètres physiques des cartes sont pris par défaut si on ne les précise pas. On doit/peut définir tous les paramètres du setup de Qjackctl dans la commande jackd.Par exemple :
jackd - -realtime-priority 89 -d alsa -C hw:CODEC -P hw:Pro -p 128 -r 44100
Création de scripts
J'ai donc fait un script de lancement de jackd :jackd -P 70 -d alsa -C hw:CODEC -P hw:Pro -p 128 -r 44100 -n 2& jackd_ID=$! kill -s KILL ${jackd_ID}
Ce script lance jackd en arrière-plan avec les options que j'ai choisies et récupère l'ID du process de jackd pour pouvoir le tuer quand qjacckctl est terminé.
Automatiser avec Qjackctl
J'ai essayé sans succès de lancer ces scripts dans les Options de Qjackctl mais cela ne fonctionne pas. Le start se lance mais le kill est exécuté immédiatement après. De plus les options ne sont pas conservées dans le préréglage. Donc pour le moment le start et le kill de jackd doivent se faire en dehors de Qjackctl.Il suffit pour cela d'insérer le démarrage de Qjackctl juste avant le kill de jackd dans le script.
jackd - -realtime-priority 89 -d alsa -C hw:CODEC -P hw:Pro -p 128 -r 44100 & jackd_ID=$! qjackctl kill -s KILL ${jackd_ID}
De cette manière quand on quitte Qjackctl, jackd est immédiatement tué.
Résumé
En résumé on doit faire dans l'ordre :- lancer le script
- lancer Meterbridge
- connecter system à bridge
- lancer Audacity
- paramétrer Audacity pour qu'il utilise jack
- connecter les éléments de la configuration
- travailler avec Audacity
- quitter Meterbridge
- quitter Audacity
- quitter Qjackctl
Solutions alternatives
Il existe plusieurs solutions alternatives, décrites sur la page Jack et plusieurs cartes son.En particulier, il est possible d'obtenir le même résultat grace aux programmes alsa_in et alsa_out. Cette solution est plus souple car on peut combiner plus de deux cartes son, mais elle est beaucoup plus consommatrice de CPU (15% à 26 % selon les cartes ajoutées sur ma configuration). Voir le tuto d'utilisation d'alsa_in/out.
Dans le cas ou vous vouhaitez simplement utiliser une carte pour l'enregistrement et l'autre pour la lecture, je vous conseillerai donc la solution ce présent tuto et non celle d'alsa_in/out. Elle est simple et stable et n'occupe presque pas de temps processeur (1.1% sur ma configuration).
Remarques
Il est important de tuer jackd après la sortie de Qjackctl et cela dans le script, sinon, si on relance le script il ne marchera pas forcément et si on lance un script avec une autre configuration on ne saura pas dans quelle configuration on est.
De plus avant de quitter Qjackctl il faut impérativement fermer les applications qu'on a lancées, sinon elles ne répondent plus (en tout cas sur ma configuration).
Notez que je préfère effacer le fichier .jackdrc à la fin du script pour qu'une prochaine utilisation de Qjackctl ne soit pas perturbée.
Voir aussi : Scripts bash par cjpsimon
[+]