ALSA, pulseaudio, jack, FFADO, etc

ALSA

ALSA est une collection de pilotes de cartes sons PCI et USB & un serveur son/framework multimédia. Elle couvre les pilotes pour les cartes son (sauf Firewire qui utilisent FFADO) et les différentes fonctionnalités supplémentaires pour en tirer partie.

Il est nécessaire de maîtriser cet aspect avant toute chose, pour avoir du son sous Linux, et ensuite envisager d'utiliser JACK.

Site officiel : http://www.alsa-project.org
Support : les cartes ISA, PCI et USB.

Sommaire

Autres liens

---------

JACK

Site officiel : http://jackaudio.org
Support : ALSA, FFADO.

JACK est un serveur audio. Il fait le lien entre les logiciels et le pilote de la carte son. Il sert principalement à mixer les différentes sources audio entre elles.

★ Réseau : JACK permet également une liaison audio de plusieurs ordinateurs par le réseau.

Sommaire

- Installation de Jack : Installation / Compilation de Jack

- Premier lancement de Jack : Configuration de Jack

- Jack dans un terminal : Jack dans un terminal

--- Jack-Transport : Jack-Transport, Synchronisation des applications

--- Net Jack : Netjack: Jack en basse latence par le réseau et internet

--- JACK-MIDI : La gestion du MIDI par JACK

--- jack-session : Jack session

--- Cartes son Alsa 5.1 et 4.0 avec Jack : Configurer sa carte son multicanal pour Jack

- Jack et plusieurs cartes son : Jack et plusieurs cartes son

--- Jack_alsa_io : Utilisation de alsa_in et alsa_out

--- Fusionner des cartes son ALSA : Carte son multicanal virtuelle

------ Fusionner deux cartes M-Audio Delta 1010 : configuration pour fonctionner avec JACK

- Jack et les autres serveurs son : Jack et les autres serveurs son

--- jack_alsa_oss : Rediriger le son des applications OSS vers JACK

--- pulseaudio vers jack : Comment rediriger le son de pulseaudio vers jack

--- TUTO : ALSA vers JACK : Comment rediriger le son d'ALSA vers jack

--- Router le son de son navigateur : Configurer son navigateur web pour accéder aux données multimédia

- Jack te parle : Jack te parle ! Encore faut-il le comprendre

ROUTAGE

connecter les entrées et sorties d'applications compatibles pour transmettre des signaux AUDIO ou MIDI (grâce au pont a2jmidid) sans redémarrer les applications !

Used in Jack Used in Jack

Les interfaces graphiques

Pour lancer et gérer JACK : les gestionnaires de connexions Audio et MIDI.

Les jack-tools : petits outils

Jack Transport

Pour synchroniser les boutons lecture, retour au début, etc., d'interagir de façon simultanée d'un logiciel à l'autre, de placer "la tête de lecture" au même endroit dans tous ces logiciels et de modifier le tempo.

Pour plus d'infos voir la page Jack-Transport.

Jack session

implémenter la gestion de session dans les gestionnaire de session audio.
Pour plus d'infos voir la page Jack-session.

Réseau

avec Jack-UDP, Net Jack, jacktrip

Manipulations avancées

jackd ("jack daemon") est le serveur son lui-même.
libjack ("jack library") est une bibliothèque de fonctions (de code) que les toutes les applications audio doivent utiliser pour être compatibles avec le serveur son et communiquer entre elles (utile aux développeurs seulement)
qjackctl ("Qt jack control") est un logiciel tierce mais fourni par défaut par la plupart des distributions pour lancer et contrôler jackd graphiquement.

Router d'autres serveurs son

- Rapports difficiles entre Jack et les autres serveurs son ?

- Router le son du navigateur internet vers jack

- Router OSS et ALSA vers Jack

- PulseAudio vers jack

- Alsa vers Jack (version thorgal de mai 2010)

Multiples cartes son

Jack et plusieurs cartes son : comment utiliser les entrées de plusieurs cartes son pour se faire un gros 4 pistes avec deux 2 pistes par exemple.

Utilisation de alsa_in et alsa_out

QJackctl - associer deux cartes son : comment associer une carte en capture et l'autre en playback.

Liens :

- Tuto premier lancement de Jack

- les options de configuration de Jack

- Le temps-réel pour les applications

- Voir et modifier les priorités à la main

- fil lié

Installation et configuration

- Installation et/ou compilation de Jack

- Tuto : Configuration de Jack, premier lancement

- JACK en lignes de commande

Craquements et autres bruits parasites avec Jack

Sur les distributions qui ne sont pas tournées vers la MAO, il est fort à parier qu'un noyau basse-latence ne soit pas installé ou bien que lors d'une mise à jour de votre distribution le noyau soit remplacé par un noyau "générique". Dans ce cas, il faut changer le noyau pour un basse-latence ou un temps-réel.

Éventuellement un

sudo dpkg-reconfigure -p high jackd

---

PulseAudio

PulseAudio est le serveur son qui s'intercale entre les applications et les pilotes de circuit son ALSA.

Il permet une facilité d’utilisation avec branchement à chaud.
Par exemple, vous pouvez diffuser certains sons sur la sortie casque et d'autres sur les HP.

Imaginez les possibilités de connexions !

Site web officiel : http://pulseaudio.org
Lien wikipedia : http://fr.wikipedia.org/wiki/PulseAudio

PulseAudio permet aussi de diffuser le son en réseau avec une grande souplesse (transfert d'un flux sonore sur un serveur et diffuser sur une autre unité centrale).

Réglages

Lancez l'outil de configuration de PulseAudio en ligne de commande : paprefs &

Nécessite l'installation du paquet paprefs.

Used in PulseAudio
Used in PulseAudio
Cocher les options comme indiqué ci-dessus puis redémarrer la session.

Contrôle du volume

PulseAudio Volume Control nécessite l'installation du paquet pavucontrol.
Cette application permet de configurer PulseAudio avec une ou plusieurs cartes son, de choisir celle par défaut, les entrées sorties, etc...

Image

PulseAudio et Jack

5 solutions pour la cohabitation :

Solution douce

Une solution consiste à dire à QJackCtl de faire taire PulseAudio avant de démarrer en allant, dans QJackCtl, dans Réglages puis Options. Puis, sur la ligne : exécuter un script au démarrage, on peut remplacer la ligne :

artsshell -q terminate

par :

pulseaudio -k

Solution aigre-douce

Éditer /etc/pulse/client.conf puis modifier la ligne qui ressemble à autospawn=yes par autospawn = no. Ceci va "éteindre" pulseaudio du coup, au prochain démarrage, il ne va pas se lancer et vous devrez le démarrer manuellement depuis une commande si vous en avez besoin.

Solution forte
Il faut quitter PulseAudio pour que QJackCtl puisse démarrer puis faire un :

ps ax

afin de rechercher d'autres processus tournant et enfin :

kill numéro_du_processus

Solution alternative
Pourquoi s'acharner sur ce pauvre PulseAudio ?
voici un tutoriel (en anglais) scripts compris pour utiliser PulseAudio ET Jack > http://fuzzle.org/~petern/index.html
à tester et à traduire si ça marche vraiment ...

Autre solution alternative
Cette solution est de loin la meilleure pour plusieurs raisons :

- évite tout bricolage système et est pérenne

- très robuste, car si Pulseaudio est une couche logicielle récente, elle est souvent fragile en sortie, c'est à dire au plus près de la couche ALSA, donc de votre carte Son. Ainsi lorsque vous constaterez des arrêts de son sur des cartes mal supportées avec pulseaudio, en passant par PulseAudio/Jack vous bénéficierez de la plus grande résistance de Jack aux cartes sons (Jack étant beaucoup plus ancien et donc robuste)

- avec Jack et pulseaudio vous bénéficiez de tous les contrôles de Jack même pour les sons en provenance de sites diffusant des MP3 avec DRM. (remastersation d'un son avec Jamin), égalisation d'un son plus fine qu'avec les outils bureautiques, utilisation de Jack Timemachine, etc ...

La marche à suivre pour faire cohabiter pulseaudio et jack se trouve dans cette page : pulseaudio vers jack.

Installation

Il est intégré par défaut dans les distributions Fedora, Mandriva et Ubuntu.

La doc sur ubuntu-fr : http://doc.ubuntu-fr.org/pulseaudio.

Pour Debian :

sudo apt-get install pulseaudio-esound-compat pulseaudio-module-gconf pulseaudio-module-hal pulseaudio-module-lirc pulseaudio-module-x11 pulseaudio-module-zeroconf libtool padevchooser paman paprefs pavucontrol pavumeter pulseaudio pulseaudio-utils libpulse0 libpulse-browse0 libglademm-2.4-1c2a libpulse-mainloop-glib0 libglademm-2.4-1c2a libpulse-mainloop-glib0 libasound2-plugins libgstreamer-plugins-pulse0.10-0 libao-pulse libpulse-dev

Noyau rt

Il faut rajouter les droits, dans un terminal super utilisateur, taper :

sudo vi /etc/group

puis rajouter le nom_utilisateur à pulse pulse-access et pulse-rt.

---------

rediriger le son d'ALSA vers jack

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' environnent 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 jackifiées ? 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 aussitô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

Cette page est une adaptation française de Jack and Loopback device as Alsa-to-Jack bridge avec quelques ajouts propres à un wiki général sur l'audio professionnelle.

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' : la méthode douce

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 AVERTISSEMENT : À 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 !
EDIT: J'ai réglé le problème! Voir la mise-à-jour juste après cette section.

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

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"):

./configure --with-cards=loopback
make
/!\ NE PAS FAIRE "make install"

Note: Si vous avez des erreurs à la compilation, vous pouvez tenter de compiler avec les sources de http://www.alsa-project.org/snapshot/files/ (alsa-driver) qui sont les versions les plus à jour ( règle les problèmes liés au noyau 2.6.36-2.dmz.5-liquorix-amd64 entre autres. )

Note 2: Si toutefois à la fin de la compilation vous n'aviez pas le fichier snd-aloop.ko dans ./modules, tentez ces deux commandes:

./configure --with-cards=aloop
make
/!\ NE PAS FAIRE "make install"

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

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

Vérifier que le noyau est maintenant à jour:

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:

sudo modprobe snd-aloop

Si ça foire, forcer la main au noyau:

sudo modprobe -f snd-aloop

Ensuite, vęrifier:

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).

Compiler le module noyau 'snd-aloop' : la méthode forte!

OK, si la méthode douce a foiré, on va passer à des choses plus drastiques. On va réinstaller la totalité du pilote ALSA. Alors bien sûr, il va falloir dans ce cas ajouter toutes les cartes sons du système dans la configuration de la compilation. Par exemple, voici mon cas:

sudo make clean
./configure --with-cards=hdsp,loopback,hrtimer,usb-audio --with-oss=yes --with-sequencer=yes
OU FAIRE
./configure --with-cards=hdsp,aloop,hrtimer,usb-audio --with-oss=yes --with-sequencer=yes
make
sudo make install

Pour savoir de quels pilotes le système a besoin, on peut inspecter le fichier suivant:

cat /proc/asound/modules

et aussi voir à quoi ça correspond pour la compilation:

./configure --help

La dernière commande va reporter toutes les cartes possibles, y en a un paquet

OK, une fois compilé et installé, il va falloir faire repartir ALSA:

sudo alsa force-reload

sans oublier de charger snd-aloop bien sûr!

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:

~$ 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:

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]

Modifier la configuration d'ALSA

Quand ils sont lancés sans paramètre particulier, les programmes ALSA (comme flash dans firefox) utilisent la carte son par défaut qui correspond généralement à la première carte son. Si celle-ci est utlisée par JACK, elle ne sera pas disponible pour ALSA. Il est donc nécessaire de configurer ALSA pour que la permière carte son soit la loopback. JACK utilisera alors la deuxième carte (ou celle appropriée à votre configuration).

Autre avantage, nous pourrons même nous passer complêtement de pulseaudio. C'est souvent même nécessaire car ce programme a la sale manie de démarrer de façon intempestive. De plus, il semble obsédé de vouloir être la carte son par défaut, et ceci va perturber notre configuration. Pour désinstaller pulseaudio, cela est une autre histoire, très simple sous gentoo, plus compliquée avec les distributions basée sur debian ou rpm qui ont gnome comme bureau par défaut. Récemment, gnome-settings-daemon et gdm se sont mis à dépendre de pulseaudio. Le plus simple est donc de déactiver pulseaudio. Pour cela, désactivez autospawn dans le fichier /etc/pulse/client.conf :

 

autospawn = no

Exemple de configuration (vous pourrez trouver une description plus détaillée du réglage de "carte par défaut" sur cette page) :
Fichier /etc/modprobe.d/alsa.conf

# Alsa kernel modules' configuration file.

# ALSA portion
alias char-major-116 snd
# OSS/Free portion
alias char-major-14 soundcore

## Options
options snd-aloop index=0
options snd-ice1724 index=1
options snd-ice1724 model=ap192
options snd-virmidi index=2

##  ALSA portion
alias snd-card-0 snd-aloop
alias snd-card-1 snd-ice1724
alias snd-card-2 snd-virmidi
##  OSS/Free portion
alias sound-slot-0 snd-card-0
alias sound-slot-1 snd-card-1
alias sound-slot-2 snd-card-2

# OSS/Free portion - card #1
alias sound-service-0-0 snd-mixer-oss
alias sound-service-0-1 snd-seq-oss
alias sound-service-0-3 snd-pcm-oss
alias sound-service-0-8 snd-seq-oss
alias sound-service-0-12 snd-pcm-oss
##  OSS/Free portion - card #2
alias sound-service-1-0 snd-mixer-oss
alias sound-service-1-3 snd-pcm-oss
alias sound-service-1-12 snd-pcm-oss
##  OSS/Free portion - card #3
alias sound-service-2-0 snd-mixer-oss
alias sound-service-2-3 snd-pcm-oss
alias sound-service-2-12 snd-pcm-oss

alias /dev/mixer snd-mixer-oss
alias /dev/dsp snd-pcm-oss
alias /dev/midi snd-seq-oss

# Set this to the correct number of cards.
options snd cards_limit=3

Les options importantes ici sont index=n et cards_limit=m

Ne pas oublier de mettre à jour la configuration du kernel avec nos modifications. Sous gentoo:

update-modules

et de relancer ALSA:

/etc/init.d/alsasound restart

Une autre exemple: avec les kernels récents (hum, tout kernel depuis 2 ou 3 ans), une syntaxe plus succincte donne le même résultat:

Fichier /etc/modprobe.d/alsa.conf

alias snd-card-0 snd-aloop
alias snd-card-1 snd-hdsp
alias snd-card-2 snd-hda-intel

options snd-aloop index=0 pcm_substreams=2
options snd-hdsp index=1
options snd-hda-intel index=2

J'ai changé dernièrement ma carte son contre une plus silencieuse, et avec la sortie hdmi de la carte se trouve une sortie son, donc pour ALSA, une carte supplémentaire. Cette carte utilise le même module ALSA que la carte sur la carte mère. De plus, elle insiste pour se charger comme première carte son. Ma seule solution fut d'utiliser le fichier /etc/conf.d/modules:

module_snd_args="slots=snd-aloop,snd-ice1724,snd-hda-intel,cx88-alsa,snd-usb-audio,snd-virmidi,snd-hda-intel"

Cette ligne réserve les emplacements des cartes lors du chargement du module snd dans l'ordre dans lequel les modules sont écrits.

Les options de snd-aloop

Le module snd-aloop accepte les options suivantes:

# modinfo snd-aloop
...
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)
parm:           pcm_notify:Break capture when PCM format/rate/channels changes. (array of int)

TODO: finir de décrire ces paramètres:

Ces paramètres peuvent être spécifiés dans le fichier de configuration d'ALSA (/etc/modprobe.d/alsa.conf avec une ligne options comme dans les exemples ci-dessous.

* index: obligatoire, détermine l'ordre des cartes sons.
* id: facultatif, un nom.
* enable: facultatif
* pcm_substreams: faclutatif, détermine le nombre de périphériques pcm virtuels de la carte
* pcm_notify: facultatif, ???

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 :

# 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:

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

avec alsa_in et alsa_out

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

alsa_in -j cloop -dcloop

et

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 ?

Pour éviter d voir des warnings, nous pouvons ajouter des paramètres, par exemple:

alsa_in -j cloop -dcloop -n 2 -p 256 -r 96000

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

#!/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

Noter les paramètres -q 1. Cette option règle la qualité de ré-échantillonage. Dans l'exemple, la configuration est adaptée pour des faibles latences et des petits tampon. Abec -q à 2 ou 3, l'utilisation processeur va grimper.

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

sudo chmod +x /usr/local/bin/loop2jack

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

/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 ?

La beauté du truc c'est que si Jack plante comme une m...rde, les applications ALSA continuent à tourner sans s'être aperçues de quoi que ce soit. Y a qu'à refaire partir jack via Qjackctl, et le son revient

avec zita-ajbridge

zita-ajbridge est une nouvelle solution proposée par Fons Adriaensen qui comprend 2 applications, zita-a2j et zita-j2a, équivalentes à alsa_in et alsa_out. L'avantage de cette solution est qu'elle offre une meilleure qualité audio. La fréquence d’échantillonnage est stable à raison de 1 PPM (partie par million) et ne change que très peu. Le délai est également très stable même dans les pires conditions.

La syntaxe (traduite) de ces deux applications est la suivante:

Usage: zita-a2j <options>
Options:
  -h                 Montre ce texte
  -j <jackname>      Nom du client Jack [zita-a2j]
  -d <device>        Périphérique de capture ALSA [none]
  -r <rate>          Taux d'échantillonnage [48000]
  -p <period>        Taille de période [256]
  -n <nfrags>        Nombre de fragments [2]
  -c <nchannels>     Nombre de canaux [2]
  -Q <quality>       Qualité du ré-échantillonage [48]
  -L                 Force 16-bit et 2 canneaux [off]
  -v                 Montre les informations de trace [off]

Pour zita-j2a, la seule différence est que le périphérique ALSA est en lecture.
Nous devons donc leur indiquer au moins le périphérique ALSA.
L'option -L est utile avec des logiciels comme mplayer qui ne supportent pas plus que que 2 canaux ou un format d'échantillons un virgule flottante. Heureusement, nous pouvons utiliser mplayer en mode JACK, donc normalement cette option n'est pas nécessaire. Mais si votre appli ALSA préférée ne fonctionne pas (par exemple l'infâme flashplayer d'Adobe), ce sera l'occasion d'essayer cette option.

Dans le README de zita-ajbridge, nous pouvons lire aussi que pour obtenir le délai minimum, le périphérique ALSA doit utiliser une période plus petite (-p ici) que celle de JACK (Frames/Period dans qjackctl).

Je vous donne directement le script que cela me donne:

#!/bin/sh
# Lance les programmes voulus après le lancement de JACK.
# Usage: loop2jack sample_rate
# où sample_rate est le taux d'échantillonnage de JACK
# Pour le lancer depuis l'interface de qjackctl:
# loop2jack %r %p
# où %r=<sampling rate>; %p=Periods/Frames

# taille de période ALSA; on divise %p par 2.
PSize=$(( $2/2 ))

## lancer et configurer la boucle ALSA <-> JACK
#  création des clients
/usr/bin/zita-j2a -d hw:0,1 -r $1 -p "${PSize}" -L 2>&1 1> /dev/null &
/usr/bin/zita-a2j -d hw:0,1 -r $1 -p "${PSize}" -L 2>&1 1> /dev/null &

# donner 1 secondes de répit avant de connecter aux ports jacks
sleep 1

# cloop ports -> jack output ports; pas nécessaire avec jackdbus
#jack_connect zita-a2j:capture_1 system:playback_1
#jack_connect zita-a2j:capture_2 system:playback_2

# au choix: microphone (RME analog input 3 pour moi) vers ports de "ploop"
# pas nécessaire avec jackdbus
#jack_connect system:capture_1 zita-j2a:playback_1
#jack_connect system:capture_2 zita-j2a:playback_2

## Timidity++ en mode serveur
if [ ! `pidof timidity` ]
then
    timidity -iA -B2,8 -Oj -EFreverb=0 -s $1 2>&1 1> /dev/null &
fi

## Start a2jmidid
if [ ! `pidof a2jmidid` ]
then
    a2jmidid -e 2>&1 1> /dev/null &
fi

exit 0

Si vous utilisez jackd, vous devez enlever les commentaires pour les 4 lignes jack_connect.
Si vous n'obtenez pas de son, la chose à essayer en premier est de changer le périphérique ALSA hw:0.1 par exemple en hw:0,0 ou hw:0. Si vous obtenez du son, vous pouvez essayer d'enlever l'option -L à zita-a2j et zita-j2a, mais le son avec flash ne fonctionnera plus.

Comme mentionné au début du script, vous devez le lancer avec une ligne comme la suivante dans qjackctl->Setup->Options->Execute script after Startup:

/home/dom/bin/loop2jack %r %p

C'est l'heure d'un petit test : Calle 13, Gustavo Dudamel y la Orquesta Sinfónica Simón Bolívar en los Grammys

Après quelques heures d'utilisation de cette configuration, je n'ai pas eu un seul xrun, alors qu'ils étaient récurant avec alsa_in et alsa_out lors du lancement des programmes jack. De plus, l'amélioration de la qualité du son des applications alsa est frappante. Zita-bridge n'améliore donc pas seulement la qualité de son et les délais, mais il n'influence pas la stabilité de jack comme le font alsa_in et alsa_out.

Exemple pour RME Multiface II

Exemple d'asoundrc pour RME Multiface II
Certaines cartes son nécessitent de rajouter des paramètres liés à leur infrastructure matérielle. Ainsi, pour une RME Multiface II nous pourrons avoir le fichier ~/,asoundrc suivant:

# ------------------------------------------------------
# hardware 0,0 : utilisé pour la lecture ALSA
pcm.loophw00 {
  type hw
  card Loopback
  device 0
  subdevice 0
  format S32_LE
  rate 96000
}

# ------------------------------------------------------
# périphérique de lecture PCM ALSA: utilise loopback 0,0
# Ne pas utiliser une taille de tampon trop petite. Certaines
# applications ne l'aimeront pas et le son ne sera pas bon. 

pcm.amix {
  type dmix
  ipc_key 219345
  slave {
  	pcm loophw00
	period_size 4096
	periods 2
  }
}

# ------------------------------------------------------
# volume logiciel
pcm.asoftvol {
  type softvol
  slave.pcm "amix"

  control { name PCM }

  min_dB -51.0
  max_dB   0.0
}

# ------------------------------------------------------
# pour jack alsa_in: looped-back signal aux autres bouts
pcm.cloop {
  type hw
  card Loopback
  device 1
  subdevice 0
  format S32_LE
  rate 96000
}

# ======================================================
# ------------------------------------------------------
# hardware 0,1 : utilisé pour la capture ALSA
pcm.loophw01 {
  type hw
  card Loopback
  device 0
  subdevice 1
  format S32_LE
  rate 96000
}

# ------------------------------------------------------
# pour jack alsa_out: looped-back signal aux autres bouts
pcm.ploop {
  type hw
  card Loopback
  device 1
  subdevice 1
  format S32_LE
  rate 96000
}

# ======================================================
# ------------------------------------------------------
# périphérique duplex qui combine nos périphériques PCM définis ci-dessus
pcm.aduplex {
  type asym
  playback.pcm "asoftvol"
  capture.pcm "loophw01"
}

# ------------------------------------------------------
# périphérique par défaut
pcm.!default {
  type plug
  slave.pcm aduplex

  hint {
       show on
       description "Duplex Loopback"
  }
}

Setup alternatif

Setup alternatif : solution matérielle et logicielle
Thorgal, l'auteur de l'article original en anglais, utilise en plus d'une carte RME, une carte sur la carte mère (Intel HDA) et aussi une webcam USB avec son propre micro. Cela serait un comble de ne pas pouvoir utiliser leurs capacités d'enregistrement d'une façon ou d'une autre, ceci surtout en tenant compte du fait qu'il utilise beaucoup skype.

Rajout de quelques entrées matérielles supplémentaires dans asoundrc

A la place d'utiliser le périphérique loopback pour la capture ALSA capture (toutes les entrées relatives à "ploop" dans les asoundrc précédents), nous pouvons déclarer simplement les entrées matérielles dans asoundrc. Donc, nous enlevons toutes les entrées ploop (y compris les sous-périphériques utilisés pour la capture ALSA et alsa_out, ils sont maintenant inutiles, et nous rajoutons les périphériques matériels PCM de la carte son Intel et de la webcam USB.

# ------------------------------------------------------
# hardware 0,0 : utilisé pour la lecture ALSA
pcm.loophw00 {
  type hw
  card Loopback
  device 0
  subdevice 0
  format S32_LE
  rate 96000
}

# ------------------------------------------------------
# périphérique de lecture PCM : utilise le sous périphérique loopback 0,0
pcm.amix {
  type dmix
  ipc_key 219347
  slave {
  	pcm loophw00
	period_size 4096
	periods 2
  }
}

# ------------------------------------------------------
# volume logiciel
pcm.asoftvol {
  type softvol
  slave.pcm "amix"

  control { name PCM }

  min_dB -51.0
  max_dB   0.0
}

# ------------------------------------------------------
# pour jack alsa_in: looped-back signal aux autres bouts
pcm.cloop {
  type hw
  card Loopback
  device 1
  subdevice 0
  format S32_LE
  rate 96000
}

# ------------------------------------------------------
# hardware Intel: utilisé pour la capture ALSA
pcm.intel {
  type hw
  card Intel
}

pcm.isnoop {
  type dsnoop
  ipc_key 219346
  slave.pcm "intel"
}

# ------------------------------------------------------
# hardware USB cam: utilisé pour la capture ALSA
pcm.usb {
  type hw
  card U0x46d0x81b # nom obtenu en inspectant le fichier '/proc/asound/cards'
}

# ------------------------------------------------------
# ------------------------------------------------------
# ------------------------------------------------------

# ------------------------------------------------------
# périphérique duplex qui combine nos périphériques PCM définis ci-dessus
pcm.aduplex {
  type asym
  playback.pcm "asoftvol"
  capture.pcm "usb"
}

# ------------------------------------------------------
# périphérique par défaut

defaults.pcm.rate_converter "samplerate_best"

pcm.!default {
  type plug
  slave.pcm aduplex

  hint {
       show on
       description "ALSA Default"
  }
}

Autre exemple

Dominique a mis sa config ALSA sur sa page perso. Cette config utilise le loopback avec plusieurs autres cartes dont des non utilisées.

Test du nouveau périphérique ALSA en capture

Ceci fut facile à tester. Nous devons être sur que la carte par défaut dans asoundrc utilise pcm capture "usb" comme ci-dessus. Ensuite, nous démarrons skype et le réglons pour qu'il utilise le périphérique "Default" pour tout. Ensuite avec QasMixer ou votre mixeur préféré, nous contrôlons le niveau de capture de la webcam (pourquoi laisser kype le régler?). Ansuite, nous essayons le test d'appel de skype et nous assurons qu'il a bien enregistré votre voix.

Notez que la même chose peut être faite avec la carte Intel HDA ("intel" pcm capture défini dans l'asoundrc précédent) à condition de brancher un micro à son entrée.

latence

Pour mesurer et régler la latence, nous devons fournir une source sonore commune à Jack et ALSA.

Lecture seule
D'abord, j'ai lancé jackd et alsa_in sur "cloop" (comme ci-dessus). Ensuite, j'ai utilisé ecasound comme intermédiaire pour être capable de mesurer un délai éventuel dans ardour (que je connais bien, vous pouvez bien sur utiliser un autre logiciel d'enregistrement compatible avec JACK).

Voici la ligne de commande pour ecasound, c'est très simple :

ecasound -i jack -o alsa

Puis dans qjackctl, j'ai connecté une source sonore comme mon micro disponible sous system:capture_3 à ecasound:playback_1/2.

Dans ardour, j'ai créé deux pistes : une piste mono qui prend le son depuis le même port de capture, et une piste stéréo connectée au client "cloop". En fait, comme la sortie d'ecasound se fait sur le périphérique par défaut d'ALSA, le client cloop doit avoir l'audio par le loopback. J'ai ensuite enregistré quelque chose dans ardour pour que les deux pistes contiennent les données qui viennent de la source sonore. J'ai comparé les ondes résultantes et j'ai observé un délai de 120 ms quand les paramètres de dmix sont réglé sur "default".

Une autre façon de faire est d'utiliser le clic d'ardour à la place d'un microphone. Connectez le port de sortie "click" d'ardour au port d'entrée d'ecasound, et ce port "click" à une des pistes d'ardour, la deuxième doit toujours recevoir les données du client cloop. Si vous changez les paramètres de dmix dans le .asoundrc, vous observerez que vous allez obtenir des délais différents. C'est à vous de décider des réglages des paramètres period_size et buffer_size.

Un délai de 120 ms n'est pas mauvais du tout en tenant compte du grand tampon de données que dmix utilise par défaut. Mais souvenez-vous que dmix est réellement mauvais avec des petits tampons et que vous devez donc choisir une taille qui soit suffisament grande. J'ai terminé avec les valeurs suivantes :

# ------------------------------------------------------
# playback PCM device: using loopback subdevice 0,0
pcm.amix {
  type dmix
  ipc_key 219347
  slave {
   	pcm "loophw00"
 	period_size 4096
 	periods 2
  }
}

Ce réglage me donne une latence finale du Loopback d'environ 35ms, tandis que dmix fait un bon travail sans disparition du son.

Lecture et enregistrement
Si vous utilisé la solution logicielle complète (lecture et enregistrement ALSA avec cloop et ploop), vous pouvez toujours utiliser ecasound comme outil intermédiaire. Il faut juste le lancer de cette façon :

ecasound -i alsa -o alsa

Dans qjackctl, connectez les ports "click" d'ardour sur les ports "ploop". Ceci va permettre à ecasound d'enregistrer les clicks d'ardour à travers l'audio de ploop et loopback. Ensuite, ecasound va sortir sur le périphérique PCM ALSA par défaut qu'alsa_in collecte à travers le client cloop.

Dans ardour, comme dans le setup précédent, créer deux pistes, une qui reçoit les clics internes d'ardour directement, l'autre connectée sur le port cloop. Armez la piste pour l'enregistrement, lancez le clic, et activez le transport. Vous allez voir (ce que vous allez voir) les données audio sur les deux pistes, celle qui est branchée sur cloop est retardée. Avec mon .asoundrc customisé, j'obitient une latence globale en dessous de 100ms (approximativement 75ms). Ce n'est pas mal du tout compte tenu du but du pont de bouclage Loopback.

Si une faible latence est une nécessité, n'utilisez que des applications compatibles avec JACK

Conclusion

L'idée était d'utiliser un périphérique de capture matériel au lieu du périphérique Loopback. Cela réduit le rôle du périphérique Loopback à la seule lecture ALSA, et supprime le besoin d'alsa_out, ce qui économise un peu le CPU ainsi que des cycles d'activité dans jack. Pour le moment, j'utilise ma webcam USB en capture car je n'ai besoin de la capture ALSA que pour skype. L'Intel HDA est aussi disponible bien que je n'en ait pas réellement besoin. Il est cependant connecté à mon panneau de connexions, comme cela je peux toujours l'utiliser si besoin est (improbable).

Note

Contrôle de volume pour le Loopback
Un peu de asoundercien pour finir. Un contrôle de volume pour le Loopback peut être facilement rajouté. Editez ~/.asoundrc, et rajouter une section softvol:

# soft volume
pcm.asoftvol {
  type softvol
  slave.pcm "amix"

  control { name PCM }

  min_dB -51.0
  max_dB   0.0
}

Puis dans pcm.aduplex, remplacez playback.pcm "amix" par playback.pcm "asoftvol":

pcm.aduplex {
  type asym
  playback.pcm "asoftvol"
#  playback.pcm "amix"
  capture.pcm "asnoop"
}

Et là, alors que nous avons défini un seul contrôle de volume pour la lecture, miracle! nous nous retrouvons dans alsamixer avec deux contrôles de volumes pour la carte Loopback, un pour la lecture, le deuxième pour la capture. Le asoudercien est décidément une langue bien mystérieuse.

Jack et la lecture audio et video HTML5 dans Firefox
Attention, avec cette configuration, la lecture audio HTML5 dans Firefox ne fonctionnera pas.
Il faut apporter une modification dans le menu "about:config"
Créer un booléen "media.use_cubeb" et le mettre à "false"
Ainsi firefox enverra le flux en 16 bits et non 32bits flottants.

Latence et dérive
Pour que le loopback et zita*2* fonctionnent bien, Fons Adriaensen, le développeur de zita*2*, a fait quelques remarquas sur la LAD (à ne pas confondre avec le Laboratoire suisse d'Analyse du Dopage):

- JACK utilise une horloge interne d'une résolution de l'ordre de la microseconde. Pour qu'il n'y ait pas de dérive dans jack, le hardware doit lui fournir cette horloge.

- Même remarque pour le aloop. Il simule une carte son à un taux d’échantillonnage donné, et pour que la fréquence d’échantillonnage ne varie pas, l'ordinateur doit disposer d'une horloge haute résolution.

- Pour l'USB, utiliser 44,1 kHz de fréquence d’échantillonnage est ouvrir la porte aux problèmes. Il faut utiliser 48 kHz, ce qui donne une relation plus simple entre cette fréquence et le taux d'interruption de l'USB (1 kHz).

- Pour l'USB, une période de 3 peut aussi aider.

- zita*2* a été développé pour rajouter une carte son additionnelle et décente dans jack. (Une vraie carte son, Fons a ses doutes sur le aloop, on en saura pas plus...) Pour ne pas rajouter de latence, la taille de la période de zita*2* doit être plus petite que celle de jack, sauf si cette dernière est déjà très petite.

---------

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *