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.