title: Sortie audio HDMI
date: 2013-02-24
tags: Asrall, Geekeries, Linux
url: sortie-audio-hdmi

Petite astuce simple et rapide pour pouvoir exploiter la sortie audio HDMI
sans utiliser PulseAudio, sous Debian 7.0 Wheezy.

À noter : il s'agit de la solution et non de toute la démarche effectuée pour
faire fonctionner la sortie audio.

Matériel utilisé :

HP TouchSmart TM2 1050ef, disposant de deux cartes vidéo (et donc, de deux "cartes son") [1].

Je trouve que PulseAudio a été écrit pour répondre à un mauvais problème. Ce
n'est que mon avis, mais si le problème était vraiment côté alsa, à quoi ça
sert d'ajouter une surcouche à Alsa au lieu de résoudre le problème dans Alsa.
À la fin, on ne sait même plus quel était le problème dans Alsa (dmix ?) [2].

Bref, je m'égare.



Ma problématique est simple :

En déplacement, j'utilise la carte vidéo intel, donc la carte son intel-HDA (IDT).

À la maison, j'utilise la carte vidéo radeon, vu que le laptop est branché sur
mon moniteur via le port HDMI. Rappel : l'utilisation du port HDMI nécessite
l'activation de la radeon, ce n'est pas possible sur la carte intel, pour des
raisons de branchement pour l'audio, je présume, parce qu'il n'y a pas ce
problème sur le port VGA.

Donc : si je branche mon écran en HDMI, que la vidéo passe dessus, il serait logique d'avoir l'audio qui transite également sur ce port ?

Et bien non.



Par défaut, la sortie audio HDMI est désactivée dans le module radeon. Il faut
l'activer, soit via une option dans le chargement du noyau linux (donc, à
ajouter dans grub), soit lors du chargement du module.

J'ai choisi lors du chargement du module.

J'ai donc ajouté

   options radeon audio=1

dans

   /etc/modprobe.d/radeon-kms.conf

puis redémarré l'ordi.

Ensuite, en root, un petit

   echo pcm.!default hdmi:HDMI > /etc/asound.conf

puis un

   mplayer .sounds/login.au

(J'ai plein de fichiers son pour les notifications que j'accumule dans
sounds).

Après avoir entendu[3] le petit son de login (d'e16) via les hauts-parleurs de
l'écran (enfin, plutôt du kit 2.1 branché sur l'écran), il est temps
d'automatiser tout ça.


Enfin, automatiser, tout ce que je veux pour le moment, c'est : si je bascule
sur la carte radeon, alors la sortie audio par défaut est sur le port HDMI,
sinon, c'est la carte son interne.

Donc, modification de vga_switch :

   case "$1" in

   radeon)
           #radeon is known as discrete (external) card
           echo DDIS > /sys/kernel/debug/vgaswitcheroo/switch
           echo "pcm.!default hdmi:HDMI" > /etc/asound.conf
           echo "You must restart Xorg for applying changes"
   ;;
   intel)
           #intel is known as integrated (internal) card
           echo DIGD > /sys/kernel/debug/vgaswitcheroo/switch
           echo "" > /etc/asound.conf
           echo "You must restart Xorg for applying changes"
   ;;


Concrètement, c'est juste l'écriture de hdmi ou de vide dans le fichier
asound.conf. Rien de compliqué au final (une fois que l'on a trouvé toutes les
astuces).

Tout fonctionne, cependant :

Pas de DMIX sur la sortie hdmi ? Si une application joue dessus, une autre
application utilisera la carte son intégrée. Ça, c'est un problème, notamment
avec Clementine[4], lorsque je change manuellement de piste, où il m'indique
que la sortie audio est utilisée et donc, s'arrête sur ce message d'erreur
(répété, bien entendu).

   Impossible d'utiliser le périphérique audio pour la lecture. Celui-ci est occupé par une autre application.

Je pense que le fondu enchainé en est la cause. À mon avis[5], au lieu de
faire du mixage dans clementine, il ouvre un nouveau flux vers la carte son et
augmente le volume, tout en baissant progressivement l'ancien. Le mixage se
fait alors dans alsa, via DMIX.

Si je débranche l'écran HDMI, la sortie audio reste toujours configurée sur la
sortie HDMI. Il faudra que je planche sur ce problème. Si c'est possible
d'avoir une notification (pas par DBUS, merci) via Xorg comme quoi un écran
est branché sur le port HDMI (ou est débranché), sans à avoir à scruter xrandr
toutes les secondes, ça serait vraiment génial. En attendant, il faudra que je
désactive manuellement la sortie audio HDMI via mon script de gestion des
résolutions/écrans.

**UP pour le mixage audio (24 février 16h30)**

Il suffit d'utiliser :

   pcm.!default { type plug slave.pcm "dmix:1,3" }

et là, on a le mixage sur la sortie hdmi. Clementine et mplayer peuvent jouer
en même temps sur la sortie audio.

La ligne est condensée (quelques tests pour valider).

Explication rapide : On ajoute un "esclave" pcm utilisant le plugin dmix, sur
la carte 1, périphérique 3.

Pourquoi 1 et 3 ?

   alex@yue ~> aplay -l
   **** Liste des Périphériques Matériels PLAYBACK ****
   carte 0: Intel [HDA Intel], périphérique 0: STAC92xx Analog [STAC92xx Analog]
     Sous-périphériques: 1/1
     Sous-périphérique #0: subdevice #0
   carte 1: HDMI [HDA ATI HDMI], périphérique 3: HDMI 0 [HDMI 0]
     Sous-périphériques: 0/1
     Sous-périphérique #0: subdevice #0

Parce que la carte hdmi est la carte (son) 1, et que la sortie HDMI est défini
sur 3. Tout simplement.

La modification du script devient donc :

   case "$1" in

   radeon)
           #radeon is known as discrete (external) card
           echo DDIS > /sys/kernel/debug/vgaswitcheroo/switch
           echo 'pcm.!default { type plug slave.pcm "dmix:1,3" }' > /etc/asound.conf
           echo "You must restart Xorg for applying changes"
   ;;
   intel)
           #intel is known as integrated (internal) card
           echo DIGD > /sys/kernel/debug/vgaswitcheroo/switch
           echo "" > /etc/asound.conf
           echo "You must restart Xorg for applying changes"
   ;;

* * *

1 : Cf. article de présentation.

2 : Je n'ai aucun problème avec alsa, tout comme avec pulse-audio, sauf quand
je veux écouter de la musique, regarder un film, utiliser jackd, jouer avec
des synthé analogique (bristol), où systématiquement, pulse-audio se met à
bouffer du CPU pour rien, voire m'empêche d'utiliser jackd ou alsa, vu qu'il
prend la main dessus en mode exclusif. Du coup, je n'installe pas pulse-audio
et je n'ai pas de problèmes. Ceci n'est bien entendu pas un troll mais ma
constatation sous debian, ubuntu et archlinux.

3 : Ne pas oublier d'activer le son sur la sortie hdmi, via alsamixer par
exemple. On peut chercher pendant 30 minutes pourquoi ça ne marche pas alors
que le son est simplement coupé (Mute).

4 : Clementine Audio Player, un lecteur audio écrit en qt4 et inspiré d'Amarok
1.4. Une excellente alternative à Amarok2 (où je trouve dommage d'avoir
abandonné le principe de l'interface de la version 1.4). Accessoirement,
fonctionnel sous Windows et Mac OS X (10.6 mini :/).

5 : C'est une supposition, je n'ai pas regardé la doc ni parcouru le code
source, c'est fortement probable que je me trompe. Cependant, le comportement
de l'application me fait penser que ça marche comme ça.