Chargement...
 
Skip to main content

Historique: TUTO : ALSA vers JACK

Aperçu de cette version: 4



À noter que l'astuce ci-dessous a seulement été testée et utilisée sur mon système (intel 32 bit), basé sur Debian Unstable, utilisant un noyau 2.6.32, Jack2 1.9.6 et ALSA 1.0.21. Ce système est très stable à toutes latences. Donc je ne garantis pas un succès pour d'autres configurations.

Introduction


Certains producteurs / musiciens / etc utilisent linux pour leur travail. Il se peut qu'ils aient construit un PC entièrement dédié à leur production, où le serveur Jack Audio Connection Kit tourne de façon permanente. En tant que musicien-producteur moi-même, je ne désire pas d'autres couches son intermédiaires entre JACK et le niveau matériel (piloté par ALSA dans mon cas) du genre PulseAudio ou autre. En effet, je possède une carte son pro RME HDSP + Multiface II. Le pilotage de l'interface de mixage de cette carte ne se range pas dans le cas générique qu'ALSA fournit pour la majorité des cartes du genre interne (Intel HDA, etc). D'une part, seul le logiciel spécial de mixage TotalMix (ou hdspmixer en linuxien) allié à Jack me permet d'utiliser cette carte sous toutes ces coutures. Cela a comme inconvénient que les logiciels ou applications non "jackifiés" ne peuvent rejoindre l' environment très flexible et fiable fournit par le graphe audio de Jack. D'autre part, je ne souhaite pas recourir à ma carte son interne (l' "infâme" puce Intel HDA 🙀 ) que je garde constamment 'off' (config niveau BIOS).

Dans ce cas, comment peut-on établir un pont permanent entre Jack et les applications non jackifiees ? Je recherchais une solution du type 'client jack permanent' (à la fois playback et capture). Il y a un 'plugin' ALSA-jack mais malheureusement, ce n'est pas une solution pour plusieurs raisons:
- le client n'apparaît dans le graphe jack que lorsque l'application ALSA joue quelque chose et disparaît aussiôt après
- ce plugin n'a pas été mis à jour depuis longtemps et est très instable.
En bref, il n'est pas à la hauteur des propriétés désirées (permanence du pont, etc).

Ce n'est que récemment, alors que je faisais "mumuse" avec la carte virtuelle ALSA-Loopback que l'idée d'un pont permanent ALSA-vers-Jack m'est revenue. Une sorte de flash, en quelque sorte 😀

La carte son virtuelle ALSA-Loopback

La carte virtuelle ALSA-Loopback est comme son nom l'indique un matériel complètement virtuel, une émulation d'une vraie carte son. Elle apparaît dans la liste des cartes son ALSA dès que le module noyau 'snd-aloop' est chargé.

Compiler le module noyau 'snd-aloop' si besoin

Il se peut fortement que le noyau installé par la distro ne contienne pas ce module par défaut. On peut y remédier par la compilation "manuelle" de ce module.

GROS AVERTISSMENT: À noter que le chargement de ce module peut s'avérer difficile après compilation manuelle même lorsque le paquet 'linux-headers' est installé et la compilation sans problème! Voir la discussion (en anglais) sur le forum linuxmusicians.


À vérifier au préalable que le module 'snd-aloop' n'est pas connu du noyau:

Copy to clipboard
sudo modinfo snd-aloop


Si 'modinfo' ne reporte rien, alors va falloir compiler la bête. Il faut choper le code source 'alsa-driver' correspondant à la version d'ALSA installé par défaut. Aller soi sur le site http://www.alsa-project.org ou bien utiliser 'sudo apt-get install alsa-source'

Une fois le code source installé, décompressé et désarchivé quelque part sur le disque dur, aller dans le répertoire principal (cd alsa-driver-xxxx) et configurer pour la compilation (ne pas installer le résultat, on fera ça "à la main"):

Copy to clipboard
./configure --with-cards=loopback make


Maintenant, copier le module compiler vers l'installation noyau et enregistrer ses dépendances :

Copy to clipboard
sudo cp ./modules/snd-aloop.ko /lib/modules/`uname -r`/kernel/sound/drivers/ sudo depmod -a


Vérifier que le noyau est maintenant à jour:

Copy to clipboard
~$ sudo modinfo snd-aloop filename: /lib/modules/2.6.32/kernel/sound/drivers/snd-aloop.ko license: GPL description: A loopback soundcard author: Jaroslav Kysela <perex@perex.cz> srcversion: B85A5847D027749DCF96195 depends: snd-pcm,snd vermagic: 2.6.32 SMP preempt mod_unload modversions CORE2 parm: index:Index value for loopback soundcard. (array of int) parm: id:ID string for loopback soundcard. (array of charp) parm: enable:Enable this loopback soundcard. (array of bool) parm: pcm_substreams:PCM substreams # (1-8) for loopback driver. (array of int)


Charger le module:
Copy to clipboard
~$ sudo modprobe snd-aloop ~$ lsmod | grep aloop snd_aloop 4732 0 snd_pcm 57065 6 snd_aloop,snd_hdsp snd 40404 18 snd_aloop,snd_hdsp,snd_pcm,snd_hwdep,snd_rawmidi,snd_seq,snd_timer,snd_seq_device


On garde les options par défaut du module (mais on peut modifier au chargement si on veut, sauf que c'est pas la peine).

Comprendre la structure de la carte virtuelle ALSA-Loopback

Comme son nom l'indique, cette carte virtuelle a pour but de boucler le signal envoyé en sortie vers son entrée. On peut donc collecter le signal d'une application ALSA qui envoie son signal vers la sortie de cette carte à l'entrée de cette même carte 😀 et vice-versa.

Par défaut, cette carte virtuelle est composée de 2 parties, elles-mêmes composées de 8 sous-parties. Par exemple, on peut constater après le chargement du module les choses suivantes:

Copy to clipboard
~$ aplay -l **** List of PLAYBACK Hardware Devices **** card 0: DSP [Hammerfall DSP], device 0: RME Hammerfall DSP + Multiface [RME Hammerfall DSP + Multiface] Subdevices: 0/1 Subdevice #0: subdevice #0 card 1: Loopback [Loopback], device 0: Loopback PCM [Loopback PCM] Subdevices: 7/8 Subdevice #0: subdevice #0 Subdevice #1: subdevice #1 Subdevice #2: subdevice #2 Subdevice #3: subdevice #3 Subdevice #4: subdevice #4 Subdevice #5: subdevice #5 Subdevice #6: subdevice #6 Subdevice #7: subdevice #7 card 1: Loopback [Loopback], device 1: Loopback PCM [Loopback PCM] Subdevices: 8/8 Subdevice #0: subdevice #0 Subdevice #1: subdevice #1 Subdevice #2: subdevice #2 Subdevice #3: subdevice #3 Subdevice #4: subdevice #4 Subdevice #5: subdevice #5 Subdevice #6: subdevice #6 Subdevice #7: subdevice #7


Les Loopback devices 0 et 1 sont symmétriques, dans le sens où si 0 est utlisé pour la sortie, 1 est automatiquement une entrée et vice-versa.
Les labels ALSA pour ces "devices" sont:
Copy to clipboard
hw:Loopback,0 hw:Loopback,1


Le principe est assez simple: si un signal est envoyé vers le "sub-device" hw:Loopback,i,n alors ce même signal se retrouve en entrée au sub-device correspondant hw:Loopback,j,n avec
i = 0..1
j = ~i (c-à-d. si i = 0, j = 1, et vice-versa)
n = 0..7

Construire un fichier .asoundrc

Ah! le asoundrcien, quelle langue splendide! 😀
J'ai jamais vraiment lu quoi que ce soit à ce sujet mais j'ai du sérieusement le faire pour pouvoir établir ce pont vers Jack. Je vous épargne les quelques noms d'oiseau que j'ai lancé de temps en temps durant l'"apprentissage" ... 😉

Bon, le but est de créer un défaut ALSA basé sur la carte virtuelle Loopback. Comme ça, toutes les applications ALSA utiliseront ce défaut. On a besoin d'un PCM de playback, un PCM de capture, et combiner les deux PCMs en un "plug device" étant capable de full duplex. Noter que le but final est de pouvoir entendre via Jack ce que les applications ALSA jouent, et inversement, enregistrer les entrées Jack dans des applications ALSA.

Voici le fichier .asoundrc dans toute sa gloire :
Copy to clipboard
# playback PCM device: using loopback subdevice 0,0 pcm.amix { type dmix ipc_key 219345 slave.pcm "hw:Loopback,0,0" } # capture PCM device: using loopback subdevice 0,1 pcm.asnoop { type dsnoop ipc_key 219346 slave.pcm "hw:Loopback,0,1" } # duplex device combining our PCM devices defined above pcm.aduplex { type asym playback.pcm "amix" capture.pcm "asnoop" } # ------------------------------------------------------ # for jack alsa_in and alsa_out: looped-back signal at other ends pcm.ploop { type plug slave.pcm "hw:Loopback,1,1" } pcm.cloop { type dsnoop ipc_key 219348 slave.pcm "hw:Loopback,1,0" } # ------------------------------------------------------ # default device pcm.!default { type plug slave.pcm "aduplex" }


En résumé, on a défini les PCM suivant:

* ALSA playback = subdevice 0,0
* ALSA capture = subdevice 0,1

* Jack readable client (cloop) = subdevice 1,0 (par symmetrie avec 0,0)
* Jack writable client (ploop) = subdevice 1,1 (par symmetrie avec 0,1)

Tester le nouveau défaut ALSA


Sauver ce fichier dans '$HOME/.asoundrc_loop' et le copier dans $HOME/.asoundrc
A vérifier qu'il ne se trouve pas de fichier .asoundrc existant et déjà utilisé à l'insu de son plein gré 😉

Maintenant, jouer par ex. un fichier audio avec mplayer:
Copy to clipboard
mplayer -ao alsa fichier_audio


On peut aussi utliser lmms avec ALSA pour tester notre défaut.
Evidemment , on entendra rien encore via Jack!

Le Pont vers Jack

créer des clients jack permanents entre ALSA et Jack


Alors, comme subdevice 0,0 est le PCM ALSA de sortie, le signal sera disponible en entrée vers le PCM 'cloop' défini plus haut (subdevice 1,0). Tout ce qu'on a faire pour le connecter à Jack est d'utiliser alsa_in sur ce PCM 😀
A l'inverse, le PCM ALSA d'entrée (subdevice 0,1) collectera le signal de sortie du subdevice 1,1 ou 'ploop' qu'on a défini plus haut. Tout ce qu'on à faire est d'utiliser alsa_out sur de subdevice. Comme ça, on peut connecter le signal audio d'applications jack à 'ploop' et l'enregistrer dans l'application ALSA 😀
Brillant non ?😎

On peut d'abord tester la chose à partir d'un terminal

Copy to clipboard
alsa_in -j cloop -dcloop

et
Copy to clipboard
alsa_out -j ploop -dploop


Connecter le client jack 'cloop' vers les ports de sortie system:playback_xx correspondant aux moniteurs ou casque, rejouer la commande 'mplayer' plus haut ... alors alors ?

Pareil avec skype, connecter system:capture_xx avec le client jack 'ploop' (microphone ou basse ou une session ardour complète!), dans skype, configurer l'audio en sélectionnant "Default" partout (mic, sorties, sonnerie tel). Essayer l'appel test de skype, baragouiner dans le micro ou jouer de la gratte ... alors alors ? 😀

créer un script pour automatiser la création du pont dans Qjackctl

Les clients jack 'cloop' et 'ploop' et leur connection aux ports jack selon les besoins peuvent être créés et initialisés par Qjackctl si on met tout ça dans un script shell, par exemple /usr/local/bin/loop2jack

Copy to clipboard
#!/bin/sh # script loop2jack, dans /usr/local/bin # création des clients /usr/bin/alsa_out -j ploop -dploop -q 1 2>&1 1> /dev/null & /usr/bin/alsa_in -j cloop -dcloop -q 1 2>&1 1> /dev/null & # donner 1 seconde de répit avant de connecter au ports jacks sleep 1 # cloop ports -> jack output ports jack_connect cloop:capture_1 system:playback_1 jack_connect cloop:capture_2 system:playback_2 # au choix: microphone (RME analog input 3 pour moi) vers ports de "ploop" jack_connect system:capture_3 ploop:playback_1 jack_connect system:capture_3 ploop:playback_2 # done exit 0


sauver dans /usr/local/bin/loop2jack (avec sudo) et ajouter la permission +x

Copy to clipboard
sudo chmod +x /usr/local/bin/loop2jack


Dans Qjackctl, allers dans "Options -> Executer après départ du serveur" et ajouter cette ligne

Copy to clipboard
/usr/local/bin/loop2jack


Sauver la config, faire repartir jack. Loop2jack doit executer la création de 'c/ploop' et connecter vers les ports jacks choisis.
Maintenant, essayer la chose en lançant 'skype', ou 'smasher' ou 'lmms', ou juste 'aplay' ou 'arecord'. Alors, ça marche ? 😀
Bien sûr, il y a de la latence vu qu'on a choisi le défaut de buffering des plugins 'dsnoop' et 'dmix'. Et alors ? on s'en fout un peu non ? 😀

Historique

Avancé
Information Version
Lundi 20 février 2012 03:34 Dominique configuration d'alsa 26
Afficher
Dimanche 26 décembre 2010 20:02 olinuxx BOX 25
Afficher
Dimanche 26 décembre 2010 18:44 olinuxx BOX + tuto 24
Afficher
Dimanche 26 décembre 2010 18:32 olinuxx BOX + tuto 23
Afficher
Dimanche 26 décembre 2010 17:12 olinuxx BOX 22
Afficher
Dimanche 26 décembre 2010 16:57 olinuxx ajout tuto BOX 21
Afficher
Dimanche 26 décembre 2010 15:33 olinuxx BOX 20
Afficher
Dimanche 26 décembre 2010 15:30 olinuxx BOX-ification 19
Afficher
Mercredi 22 décembre 2010 00:04 louis121 précisions 18
Afficher
Dimanche 19 décembre 2010 23:10 olinuxx ptits trucs 17
Afficher
Dimanche 19 décembre 2010 23:08 olinuxx ptits trucs 16
Afficher
Dimanche 19 décembre 2010 18:12 louis121 15
Afficher
Dimanche 19 décembre 2010 03:20 louis121 précisions 14
Afficher
Dimanche 19 décembre 2010 03:06 louis121 note pour contrer des erreurs de compil 13
Afficher
Jeudi 16 décembre 2010 06:19 olinuxx 12
Afficher
Lundi 23 août 2010 13:47 jy_moustache Amélioration lisibilité box 11
Afficher
Mercredi 09 juin 2010 23:09 thorgal 10
Afficher
Mercredi 09 juin 2010 20:10 thorgal ajouté méthode forte pour compiler le pilote ALSA. 9
Afficher
Dimanche 30 mai 2010 18:04 thorgal ajouté une commande de forçage pour charger le module noyau snd-aloop 8
Afficher
Dimanche 16 mai 2010 22:44 thorgal 7
Afficher
Dimanche 16 mai 2010 22:42 thorgal 6
Afficher
Dimanche 16 mai 2010 22:23 thorgal 5
Afficher
Dimanche 16 mai 2010 17:14 Samuel lien vers site jack 4
Afficher
Dimanche 16 mai 2010 17:01 Samuel Mis en page/tikiwikification 3
Afficher
Dimanche 16 mai 2010 16:12 thorgal version brouillon, sans mise en page 2
Afficher
Dimanche 16 mai 2010 14:27 Samuel Création de la page 1
Afficher
  • 1
  • 2 (en cours)
  • »