Artisan Numérique

/système/audio/alsa/kernel/ Mixer du 5.1 en 2.0 avec ALSA

Autant je ne suis pas totalement persuadé de l'apport de PulseAudio, autant ALSA (Advanced Linux Sound Architecture) a été en son temps, et est toujours, une réelle avancée par rapport au vénérable OSS (Open Sous System).

Et une bonne manière de s'en convaincre est de voir comment l'utiliser pour traiter l'épineux problèmes d'une bande son 5.1 "inécoutable" sur un bon vieux système Stéréo.

Les systèmes Audio de Linux

OSS est le système "ancestral" de gestion des périphériques Audio pour UNIX en général, de Linux en particulier. Son écriture remonte à 1992 et il est systématiquement utilisé dans Linux jusqu'à l'arrivée d'ALSA dans les kernel 2.5. ALSA n'est alors qu'une option qui n'est le choix par défaut qu'à partir du noyau 2.6. La raison de ce revirement semblerait surtout venir d'un changement de licence, conduisant à une adoption massive d'ALSA dans les distributions. Un petit peu le même phénomène que nous avions déjà observé avec XFree86 et XOrg, sauf qu'ALSA est tout sauf un fork d'OSS.

Démarré par Jaroslav Kysela en 1998, ALSA n'est alors qu'un simple pilote pour la mythique Gravis Ultrasound. Pilote qui va rapidement devenir un système puissant et complet à base de plugins pouvant servir d'interface matériel à des systèmes audio aussi professionnels que le célèbre serveur Jack.

Pour information, Jack, PulseAudio, aRTS, ou encore eSound, sont des serveurs audio qui utilisent OSS, ALSA ou autre pour leur entrées/sorties physiques.

Le problèmes DVD

De nombreux DVD ne disposent pas de piste audio en 2.0, c'est à dire compatible avec un système Hi-Fi stéréo. En revanche, à peu près tous fournissent du 5.1 (ou plus) utilisable sur les systèmes à 6 ou 7 sorties. Le problème pour un audiophile est qu'il aime son système HiFi et ses deux enceintes choisies avec soin. Un goût qui ne devrait pas être incompatible avec le visionnage de temps à autre d'un bon film. Et pourtant, ça ne marche pas car les bandes son 5.1 sont mixées de telle sorte que les voix des personnages passent majoritairement sur des enceintes qui pour nous, n'existent pas. Du coup, les dialogues sont lointains, difficilement audibles. Et si l'on monte le volume, la moindre explosion provoque une vague de contestation justifiée du voisinage.

La solution est donc de demander gentiment à ALSA de remixer le son 5.1 en quelque chose de compatible avec du 2.0 (downmix).

Les plugs

Le problème majeur d'ALSA n'est pas sa puissance, mais sa documentation quasi inexistante et relativement inbitable. Il y a bien un wiki mais dés que l'on s'attaquer à des choses un peu velues, cela devient vite la jungle.

Pour régler notre problèmes, nous allons utiliser le puissant système de "plug". Pour faire simple, il s'agit de périphérique audio virtuelles s'appuyant sur un plugin d'Alsa. Pour le système, le plug sera vu comme une nouvelle carte, et ici plus particulièrement comme une nouvelle sortie audio.

Pour ajouter cette sortie, nous pouvons soit travailler au niveau du système en modifiant /etc/asound.conf, soit plus simplement dans notre compte, en modifiant (ou créant) le fichier ~/.asoundrc. Pour info, ces fichiers sont chargés par la configuration /usr/share/alsa/alsa.conf.

Nous allons donc créer une sortie "films" qui va opérer notre transformation 5.1 vers 2.0:

pcm.films {
  type route
  slave.pcm surround51
  slave.channels 6

  ttable.0.0 0.75
  ttable.1.1 0.75
  ttable.2.0 0.75
  ttable.3.1 0.75
  ttable.4.0 0.8
  ttable.4.1 0.8
  ttable.5.0 0.675
  ttable.5.1 0.675
}

Comme indiqué par la première instruction, notre plug utilise le plugin "route". Il va nous permettre de un chemin virtuel entre le son version 5.1 (slave.pcm surround51) en 6 canaux (slave.channels 6) et sa sortie en 2.0.

Ensuite avec l'instruction ttable.x.y z nous dirigeons le son du canal original x vers le canal destination y en appliquant un facteur sur le volume z. Pour les 4 premières voies, ce volume est donc réduit de 75%. Le canal central (5) est lui réduit à 80% et le LFE est réduit à 67.5%. Ces facteurs sont issues de recherches sur le Grand Net et adapté par mes soins à mes petites oreilles.

Lorsqu'ALSA va utiliser ce plug, il va donc fonctionner comme une table de mixage et fusionner pour chaque voie de sortie, les sons venant des différents ttable aux volumes indiqués.

Notez qu'il est possible grâce à ce principe de faire strictement la même chose, mais dans l'autre sens. Si vous avez un système audio à 6 canaux et que vous écoutez un fichier musical à 2 canaux, vous pouvez utiliser toutes vos enceintes avec le profile suivant :

pcm.musique {
  type route
  slave.pcm surround51
  slave.channels 6
  ttable.0.0 1
  ttable.1.1 1
  ttable.0.2 1
  ttable.1.3 1
  ttable.0.4 0.5
  ttable.1.4 0.5
  ttable.0.5 0.5
  ttable.1.5 0.5
}

La source de nos routes x est toujours 0 ou 1, logique. Et nous ventilons ces deux sources sur les 6 canaux en appliquant une fois encore des changements de volume.

Utilisation des plugs

Déjà pour tester les profiles, le plus simple est de disposer d'un fichier audio de test au format 5.1. On en trouve des tonnes via duckduckgo. Une fois que vous en avez un, vous pouvez utiliser la commande de lecture audio d'ALSA aplay :

gastonaplay -D movies fichier_5_1.wav
ou
gastonaplay -D music fichier_stéréo.wav

Le -D signifie device car pour ALSA, votre plug est comme une nouvelle périphérique de sortie ce qui le rend facile à utiliser avec un autre lecteur multimédia, par exemple mplayer :

mplayer -channels 6 -ao alsa:device=movies dvd://

Et il en va de même pour VLC ou autre en vérifiant dans leurs documentations comment se modifie le paramétrage du pilote ALSA.

Pour modifier les paramètres du mixer en ligne de commande : amixer sset "Duplicate Front" off

Conclusion

Dire qu'ALSA est simple à utiliser serait mentir. Ce type de paramétrage me rappelle furieusement IPTables et les quelques cauchemars que j'ai eu avec. Mais ce qui est certain, c'est que l'outil est très puissant et permet avec quelques efforts de couvrir les configuration audio les plus farfelues ou les plus exigeantes.