Apr 15

Gérer le dual screen sous linux avec X

Avec mon PC portable (un Asus U36SD) je n’arrivais pas à faire fonctionner la sortie HDMI ni même la sortie VGA sous Gentoo Linux.
L’utilisation de la combinaison de touche Fn+F8 l’affichage changeait, la sortie vidéo était activée mais X plantait sans autre solution pour moi de redémarrer la machine.

Ce portable dispose de la technologie Optimus de nvidia.

Optimus est assez bien supporté sous linux aujourd’hui malgré l’impression de bidouiller, on s’en sort très bien avec bumblebee. Sous optimus, l’affichage passe tout le temps par la carte graphique intégrée au processeur Intel. La carte nvidia (ici une GT520M) n’est utilisée que pour le rendu de certaines applications. Une telle configuration nécessite 2 serveurs X.

Cette petite introduction, juste pour dire que ce qui suit marche sous Optimus, mais fonctionne très bien sans architecture Optimus. De plus, cela fonctionne très bien avec tout autre type de sortie d’écran (VGA, HDMI, DVI, …)

Donc, c’est parti.

La solution présentée ici permet de:

  • gérer l’affichage en mode miroir (affichage identique sur les deux écrans)
  • gérer l’affichage en mode bureau étendu (affichage différent sur les deux écrans)

La solution est basée sur lxrandr et xrandr.

Une fois installé, il suffit de taper lxrandr ou xrandr dans un terminal les utiliser.

Avant de continuer, un bon test est de démarrer l’ordinateur avec tous les écrans branchés afin de voir que ceux-ci fonctionnent bien durant la phase de démarrage de la machine.

lxrandr: le mode mirroir simplement

lxrandr offre une interface graphique simple. Celle-ci ne permet pas de gérer le mode bureau étendu. Elle offre la gestion de la résolution et de l’allumage des écrans en mode miroir:

Cette interface est fort simple, cochez la case “Activer”, règlez la résolution et la fréquence de rafraîchessement, faites “Appliquer” et voilà les écrans configurés.

Comme dit précédemment, impossible de gérer le mode bureau étendu avec cette interface.

xrandr: utilisation avancée et mode étendu

Voici comment utiliser la commande xrandr.

Lister les différentes sorties vidéos, les différentes résolutions supportées:

$ xrandr -q
Screen 0: minimum 320 x 200, current 1920 x 1080, maximum 8192 x 8192
LVDS1 connected 1366×768+0+0 (normal left inverted right x axis y axis) 293mm x 164mm
1366×768       59.4*+   60.0
1024×768       60.0
800×600        60.3     56.2
640×480        59.9
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 connected 1920×1080+0+0 (normal left inverted right x axis y axis) 160mm x 90mm
1920×1080      60.0*+
1600×1200      60.0
1680×1050      60.0
1280×1024      75.0     60.0
1440×900       75.0     59.9
DP1 disconnected (normal left inverted right x axis y axis)

Sur cette sortie console, ce qui est important est:

  • “LVDS1″, “VGA1″, “HDMI1″, “DP1″: ce sont les identifiants de chaque sortie/écran
  • Les résolutions de chaque écran

Voici ce que l’application lxrandr produit comme commande une fois que le bouton “Appliquer” est cliqué:

$ xrandr --output LVDS1 --mode 1366x768

$ xrandr --output HDMI1 --mode 1920x1080

  • –output définit la sortie/écran affectée par la commande xrandr
  • –mode permet de choisir la résolution de l’écran

Pour créer un bureau étendu, seule la commande suffit:

$ xrandr --output HDMI1 --right-of LVDS1

  • LVDS1 est l’écran de gauche (mon pc portable)
  • HDMI1 est l’écran de droite (un écran externe)

Pour éteindre un écran, on utilise l’option “--off“. Par exemple, pour éteindre l’écran branché sur ma sortie HDMI, j’utilise donc la commande suivante:

$ xrandr --output HDMI1 --off

Pour me simplifier la vie j’ai mis la suite de commandes suivantes dans un fichier bash:

$ cat startHDMI.sh
#!/bin/sh
xrandr –output LVDS1 –mode 1366×768
xrandr –output HDMI1 –mode 1920×1080
xrandr –output HDMI1 –right-of LVDS1

Pour arrêter la sortie HDMI:

$ cat stopHDMI.sh

#!/bin/sh
xrandr –output HDMI1 –off

C’est pas si compliqué que ca, c’est moins overkill que nvidia-settings (surtout qu’avec optimus pas de salut pour utiliser le panneau de configuration de nvidia…)

Apr 15

Linux: Activer le son sur une sortie HDMI avec ALSA

Sur mon ordinateur, lors de l’utilisation de la sortie HDMI, je n’avais pas de son sur l’écran branché en HDMI mais uniquement sur les enceintes interne de l’ordinateur.

L’astuce suivante fonctionne dans d’autres cas notamment lorsque l’on veut basculer sur entre différentes cartes son.

Tout d’abord, il faut lister les périphériques aptes à générer du son (playback devices):

 $ aplay -l
**** Liste des Périphériques Matériels PLAYBACK ****
carte 0: PCH [HDA Intel PCH], périphérique 0: ALC269VB Analog [ALC269VB Analog]
Sous-périphériques: 1/1
Sous-périphérique #0: subdevice #0
carte 0: PCH [HDA Intel PCH], périphérique 1: ALC269VB Digital [ALC269VB Digital]
Sous-périphériques: 1/1
Sous-périphérique #0: subdevice #0
carte 0: PCH [HDA Intel PCH], périphérique 3: HDMI 0 [HDMI 0]
Sous-périphériques: 1/1
Sous-périphérique #0: subdevice #0

Pour moi, la sortie son HDMI est sur la carte 0, périphérique 3.

En sachant cela, on créé un fichier ~/.asoundrc (dans le répertoire home de l’utilisateur donc)

$ vi ~/.asoundrc
pcm.dmixer {
type dmix
ipc_key 1024
ipc_key_add_uid false
ipc_perm 0660
slave{
pcm “hw:0,3
rate 48000
channels 2
period_time 0
period_size 1024
buffer_time 0
buffer_size 4096
}
}
pcm. !default {
type plug
slave.pcm “dmixer”
}

Il suffit lancer un programme jouant un fichier audio pour entendre le résultat (attention, si le logiciel était lancé avant la création du fichier ~/.asoundrc, il faut le fermer et l’ouvrir à nouveau.

Personnellement, j’ai ajouté la création et la suppression de ce fichier dans mes fichiers startHDMI.sh et stopHDMI.sh.
Donc voici mes scripts au complet (affichage en mode étendu, basculement du son sur l’écran HDMI):

$ vi startHDMI.sh
#!/bin/sh
xrandr –output LVDS1 –mode 1366×768
xrandr –output HDMI1 –mode 1920×1080
xrandr –output HDMI1 –right-of LVDS1

SOUNDSTR=`cat <<-EOF
pcm.dmixer {
type dmix
ipc_key 1024
ipc_key_add_uid false
ipc_perm 0660
slave{
pcm “hw:0,3
rate 48000
channels 2
period_time 0
period_size 1024
buffer_time 0
buffer_size 4096
}
}
pcm. !default {
type plug
slave.pcm “dmixer”
}
EOF`

echo $SOUNDSTR > ~/.asoundrc

$ vi stopHDMI.sh
#!/bin/sh
xrandr –output HDMI1 –off
rm ~/.asoundrc

Voilà il ne resterait plus qu’à binder ces scripts sur ma combinaison de touches Fn+F8 pour être complet !

Older posts «