XBMC Eden & Debian Wheezy
Vincent Bernat
Il y a deux ans, je me suis monté un HTPC pour y faire tourner XBMC. À l’époque, j’étais parti sur une installation minimale de Ubuntu Lucid pour y installer les paquets officiels de l’équipe XBMC. Depuis, la version Eden a été publiée and XBMC a fait son apparition dans Debian unstable. C’était donc une excellente occasion de faire le saut.
En bref
L’installation de XBMC sur une Debian Wheezy est extrêmement simple. La seule difficulté majeure est la configuration de la télécommande : soit le profil par défaut est satisfaisant, soit il est nécessaire de s’enfoncer des les arcanes pour y apporter les modifications nécessaires.
Ma configuration matérielle est la suivante :
- un boîtier Antec Micro Fusion 350 comprenant un combiné récepteur infra-rouge/afficheur LCD SoundGraph iMON1,
- une carte mère Zotac ION-ITX-D-E incluant un processeur Intel Atom 330 et une puce NVIDIA ION,
- un amplificateur home cinéma Onkyo connecté via HDMI,
- une télécommande Logitech Harmony 555.
Installation#
Installer Debian Wheezy#
L’installation d’une Debian Wheezy2 ne présente aucune difficulté. Obtenir une clé USB amorçable depuis l’image ISO de l’installeur Debian pour Wheezy est devenu très simple :
$ sudo dd if=debian-testing-i386-netinst.iso \ > of=/dev/disk/by-id/usb...
L’installation s’est déroulée sans problème à l’exception de l’incapacité de GRUB de s’installer sur le disque. Il s’agit d’un bug connu ne se produisant qu’en présence de partitions LVM. J’espère que celui-ci sera corrigé pour la publication de Wheezy.
Cela n’a que peu de rapport avec XBMC, mais je voulais également en
profiter pour tester systemd qui pourrait devenir l’init par
défaut dans Debian (du moins dans Debian GNU/Linux). Voici un extrait
du README.Debian
:
systemd
peut être installé aux côtés desysvinit
et, par défaut, ne change absolument rien au comportement du système. C’est voulu. Pour testersystemd
, il convient d’ajouterinit=/bin/systemd
à la ligne de commande du noyau et de redémarrer. Une autre solution est d’installer le paquetsystemd-sysv
.
Le système final démarre en environ 15 secondes.
Configurer X#
Le décodage vidéo dans le pilote nouveau en est
encore à ses balbutiements. Il est donc encore nécessaire de se
rabattre sur le pilote propriétaire de NVIDIA. Le fichier
/etc/apt/sources.list
doit être complété pour ajouter les dépôts
contrib
et non-free
. Il faut ensuite installer les paquets
xserver-xorg-video-nvidia
, nvidia-vdpau-driver
et xserver-xorg
.
Voici le contenu de mon /etc/X11/xorg.conf.d/nvidia.conf
:
Section "Device" Identifier "NVidia ION" Driver "nvidia" VendorName "NVIDIA Corporation" Option "HWCursor" "False" Option "NoFlip" "False" Option "FlatPanelProperties" "Scaling = Native" Option "DynamicTwinView" "False" Option "ConnectedMonitor" "DFP-1" Option "CustomEDID" "DFP-1:/etc/X11/edid.bin" Option "NoLogo" "True" EndSection Section "Extensions" Option "Composite" "false" EndSection
L’option CustomEDID
permet d’indiquer au pilote d’utiliser l’EDID
indiqué notamment si l’ampli est éteint. Il est possible d’obtenir
celui adapté à votre ampli en utilisant la commande get-edid
issue
du paquet read-edid
.
Installer XBMC#
Grâce au travail d’Andrés Mejía, XBMC est désormais disponible
officiellement dans Debian Wheezy. Pour l’installer, il suffit de
taper aptitude install xbmc
. J’ai placé ce fichier
xbmc.service
dans le répertoire /etc/systemd/system
pour
l’intégration de XBMC dans systemd :
[Unit] Description = XBMC media center After = syslog.target [Service] User = xbmc Group = xbmc Type = simple ExecStart = /usr/bin/xinit /usr/bin/xbmc-standalone -- :0 Restart = on-failure [Install] WantedBy = multi-user.target
La commande systemctl enable xbmc.service
permet d’activer ce
service au démarrage. Il convient également d’autoriser l’utilisateur
xbmc
de lancer X. Pour se faire, il suffit d’exécuter
dpkg-reconfigure -plow x11-common
et d’autoriser tout le monde à
lancer le serveur X. sudo
peut constituer une alternative.
Configuration#
Son#
Bien que je souhaiterais utiliser PulseAudio, je veux également que la conversion stéréo vers 5.1 soit effectuée par l’ampli. Avec PulseAudio, l’ampli reçoit un signal sur six canaux et n’effectuera aucune conversion. J’opte donc pour l’utilisation directe d’ALSA.
Activer les sorties numériques constitue la première étape :
$ amixer scontrols | grep IEC958 Simple mixer control 'IEC958',0 Simple mixer control 'IEC958 Default PCM',0 Simple mixer control 'IEC958',1 $ amixer sset 'IEC958',0 unmute $ amixer sset 'IEC958 Default PCM',0 unmute $ amixer sset 'IEC958',1 unmute $ sudo systemctl stop alsa-utils.service
L’ordre des différents canaux est incorrecte. Il est possible de le
corriger avec le fichier /etc/asound.conf
suivant où est déclarée
une nouvelle sortie, hdmi2
:
pcm.hdmi2 { type asym playback.pcm { type plug slave.pcm "remap-surround51" } } pcm.!remap-surround51 { type route slave.pcm "hdmi" ttable { 0.0= 1 1.1= 1 2.4= 1 3.5= 1 4.2= 1 5.3= 1 } }
On indique ensuite à XBMC d’utiliser cette sortie au lieu de celle par
défaut. La sortie hdmi
classique doit cependant toujours être
utilisée pour les signaux type AC3. La commande speaker-test -D hdmi2
-c 6
permet de vérifier le bon ordonnancement des canaux.
Afficheur LCD#
L’afficheur LCD intégré dans le SoundGraph iMON est supporté par le
module noyau imon
ainsi que par le paquet lcdproc
. Voici les
modifications qu’il faut apporter au fichier /etc/LCDd.conf
pour le
faire fonctionner :
[server] Driver=imonlcd ServerScreen=off [imonlcd] Protocol=1 OnExit=2 Contrast=400
Mise à jour (05.2012)
L’utilisation de l’écran LCD provoque un
certain nombre de bugs incluant des plantages complets de la
machine. Étant donné que la lisibilité de l’écran est particulièrement
mauvaise, il m’a semblé plus simple de ne plus l’utiliser. J’ai donc
retiré le paquet lcdproc
et écrit ce petit script pour éteindre
l’écran :
#!/usr/bin/python import struct open("/dev/lcd0", "w").write(struct.pack("Q",0x8800000000000008))
J’utilise alors la règle suivante pour udev
:
# Disable LCD screen ACTION=="add", NAME=="lcd0", RUN+="/usr/local/bin/disable_lcd"
Télécommande#
Il s’agit de la partie la plus complexe. J’utilise une télécommande universelle Logitech Harmony. Le support pour Linux est satisfaisant : la configuration s’effectue à travers le site web de Logitech et l’utilitaire congruity permet de pousser la configuration définie vers la télécommande.
Les télécommandes sous Linux#
Avant Linux 2.6.36, la plupart des télécommandes infra-rouges nécessitaient LIRC :
- Le pilote reçoit le signal du récepteur infra-rouge et le rend
disponible via
/dev/lirc
. lircd
, avec l’aide d’un fichier de configuration décrivant le protocole utilisé par la télécommande, lit ce signal et le transforme en un code LIRC.- XBMC, connecté à
lircd
, reçoit le code LIRC et le transforme en une commande XBMC. Cette transformation est définie dans le fichierLircmap.xml
. - XBMC fait correspondre chaque commande à une action (telle que
Play
ouFullscreen
) à l’aide d’une table de correspondance également utilisée par les autres périphériques comme la souris, le clavier ou un joystick.
Depuis Linux 2.6.36, les télécommandes sont reconnues comme un périphérique d’entrée générique au même titre qu’un clavier :
- Le pilote reçoit le signal du récepteur infra-rouge.
- Un décodeur va transformer ce signal en un évènement (généralement
l’appui d’une touche). La configuration du décodeur est effectuée à
l’aide de
ir-keytable
. - X reçoit ces évènements et les transforment en évènements X destinés aux applications.
- XBMC les reçoit et utilise la table de correspondance appropriée pour les transformer en actions.
Pour compliquer un peu les choses, il est toujours possible d’utiliser
LIRC : lircd
va recevoir les évènements en provenance du noyau et
les transformer en codes LIRC.
De plus, le récepteur infra-rouge du SoundGraph iMON accepte deux protocoles différents : un protocole propriétaire et le protocole RC-6. Le pilote Linux sait gérer ces deux protocoles mais utilise par défaut le premier. Le protocole RC-6 est le protocole utilisé par de nombreuses télécommandes MCE.
J’espère n’avoir perdu personne jusqu’ici.
La façon simple#
Il est possible d’obtenir une configuration fonctionnelle avec peu de configuration :
- Télécommande Logitech Harmony
- La télécommande doit être déclarée comme étant un Media Center PC de marque Microsoft: Windows Media Center SE.
- Récepteur infra-rouge iMON
- Il doit être configuré pour utiliser le protocole RC-6. Voir ci-dessous pour les détails.
- LIRC
- Dans
/etc/lirc/hardware.conf
, mettreDEVICE=/dev/input/by-id/usb-15c2_0038-event-if00
etDRIVER=devinput
. Dans/etc/lirc/lircd.conf
, mettre simplementinclude "/usr/share/lirc/remotes/devinput/lircd.conf.devinput"
. - XBMC
- Une fois les autres éléments configurés, la télécommande doit fonctionner sans aucune configuration supplémentaire dans XBMC.
Pour utiliser le protocole RC-6, il faut installer le paquet
ir-keytable
et utiliser les commandes suivantes :
$ sudo modprobe rc-imon-mce $ sudo ir-keytable -s rc0 -p rc-6 -c -w /lib/udev/rc_keymaps/imon_mce Read imon_mce table Old keytable cleared Wrote 77 keycode(s) to driver Protocols changed to RC-6
Pour rendre ce changement permanent, ajouter le module rc-imon-mce
dans /etc/modules
et créer le fichier
/etc/udev/rules.d/90-imon.rules
avec le contenu suivant :
# Override the keytable for iMON ACTION=="add|change", SUBSYSTEM=="rc", DRV_NAME="imon", \ RUN+="/usr/bin/ir-keytable -s $name -p rc-6 -c -w /lib/udev/rc_keymaps/imon_mce"
La façon compliquée#
Si la configuration par défaut ne convient pas totalement et que l’on désire lier certains boutons à certaines actions, il y a deux grandes solutions possibles :
- Partir de la configuration décrite ci-dessus avec LIRC et définir les boutons supplémentaires à cinq endroits différents.
- Retirer LIRC et configurer la télécommande Logitech pour émuler un clavier Microsoft MCE.
La première option est particulièrement pénible. Il faut d’abord
trouver un code non utilisé au niveau de la Logitech Harmony, s’il en
reste. Ensuite, il faut s’assurer que ce code est bien défini dans la
table utilisée par l’utilitaire ir-keytable
. Dans le cas contraire,
il est possible de l’ajouter mais cela nécessite de compiler un
noyau avec des instructions de débogage pour le
connaître. Ensuite, ce code doit être traduit dans le fichier
lircd.conf
. Il faut ensuite définir une traduction supplémentaire
dans le fichier Lircmap.xml
. Enfin, il faut définir l’action
associée au niveau de XBMC.
L’autre solution n’est pas non plus idéale mais me semble plus simple. La première étape est de configurer la télécommande Logitech Harmony en tant que Microsoft MCE keyboard. Cela nous permet d’avoir beaucoup de touches disponibles. En raison de l’absence de touches multimédias, il faut redéfinir la configuration de la télécommande. Le plus simple est de suivre la configuration d’un clavier dans XBMC :
Bouton | Commande | Bouton | Commande |
---|---|---|---|
Channel Down | PageDown |
Stop | X |
Channel Up | PageUp |
Skip back | Comma |
Prev | Backspace |
Skip forward | . |
Up | DirectionUp |
Play | P |
Down | DirectionDown |
Rewind | R |
Left | DirectionLeft |
Fast forward | F |
Right | DirectionRight |
Star | Delete |
OK | Enter |
Pound | W |
Menu | C |
Red | F1 |
Exit | Esc |
Green | F2 |
Guide | Tab |
Yellow | F3 |
Info | I |
Blue | F4 |
Malheureusement, le fichier de programmation fourni avec
ir-keytable
n’est pas complet. J’ai construit une
version plus complète3. Avec cette configuration,
la plupart des fonctionnalités de XBMC fonctionneront sans avoir à
modifier d’autres fichiers.
Les touches supplémentaires peuvent être définies en écrivant une table de correspondance dédiée pour XBMC4. Voici un extrait de celle que j’utilise :
<keymap> <global> <keyboard> <end>XBMC.ShutDown()</end> <f1>XBMC.ActivateWindow(MusicLibrary)</f1> <f2>XBMC.ActivateWindow(Videos,TvShowTitles)</f2> <f3>XBMC.ActivateWindow(Videos,MovieTitles)</f3> <f4>XBMC.ActivateWindow(Weather)</f4> </keyboard> </global> <FullscreenVideo> <keyboard> <opensquarebracket>SubtitleDelayMinus</opensquarebracket> <closesquarebracket>SubtitleDelayPlus</closesquarebracket> <f6>xbmc.runscript(script.xbmc.subtitles)</f6> </keyboard> </FullscreenVideo> </keymap>
FTP#
Plutôt que d’utiliser SSH, je préfère déposer les nouveaux fichiers via FTP anonyme. vsftpd permet de répondre très simplement à ce besoin. Voici mon fichier de configuration :
listen=YES xferlog_enable=YES use_localtime=YES setproctitle_enable=YES secure_chroot_dir=/var/run/vsftpd/empty nopriv_user=ftp ftpd_banner=XBMC hide_ids=YES ftp_username=xbmc anon_umask=022 anon_root=/home/xbmc/media anonymous_enable=YES write_enable=YES anon_upload_enable=YES anon_world_readable_only=YES
vsftpd n’est actuellement pas compatible avec systemd (voir le bug
#670308). J’ai retiré le lien symbolique dans /etc/rc2.d
et
j’utilise le fichier vsftpd.service
suivant :
[Unit] Description=Vsftpd ftp daemon After=syslog.target network.target [Service] Type=simple ExecStart=/usr/sbin/vsftpd /etc/vsftpd.conf ExecReload=/bin/kill -HUP $MAINPID ExecStartPre=-/bin/mkdir -p /var/run/vsftpd/empty [Install] WantedBy=multi-user.target
Divers#
-
Dans
/etc/default/grub
, réduireTIMEOUT
à 0 permet d’obtenir un démarrage plus rapide. -
Activer le mécanisme « dirty regions » permet d’augmenter la réactivité de XBMC.
-
aptitude install upower pm-utils
permet à XBMC d’arrêter/suspendre la machine lui-même. Il est nécessaire de lui donner les droits nécessaires en créant le fichier/var/lib/polkit-1/localauthority/50-local.d/xbmc.pkla
:[Actions for xbmc user] Identity=unix-user:xbmc Action=org.freedesktop.upower.*;org.freedesktop.consolekit.system.* ResultAny=yes ResultInactive=yes ResultActive=yes
-
La lisibilité de l’afficheur LCD est désastreuse. Il est hautement préférable de s’orienter vers la version VFD. Le récepteur infra-rouge est également très médiocre et la télécommande plus que minimaliste. ↩︎
-
Debian Wheezy n’est pas encore publiée. Si vous n’êtes pas familier avec Debian, il peut être assez pénible de maintenir une telle installation jusqu’au début du gel dans quelques mois. ↩︎
-
Certaines touches ne sont pas présentes dans cette table. Par exemple, le point d’exclamation dispose d’un code dans le protocole RC-6 mais n’a pas de code spécifique au niveau du noyau. Il partage en effet la touche « 1 ». Il serait possible de l’affecter à un code arbitraire mais cela risque de rendre les choses difficiles à maintenir. ↩︎
-
Par exemple, dans
~/.xbmc/userdata/keymaps/harmony.xml
. ↩︎