Proud to be a Geek!

Cela fait un moment que je cherche une solution multimédia pour lire les vidéos et la musique stockée sur mon serveur. Après beaucoup de solutions essayées (mediaportal, serveur Upnp et lecture depuis la freebox ou xbox, …), mon choix s’est arrêté sur XBMC. Pour les profanes, XBMC est un centre de média libre et multiplateforme permettant la gestion de la musique, des photos, et des vidéos. Il dispose d’une interface conviviale et personnalisable, gère énormément de formats de fichiers multimédias (je n’ose pas dire tous, mais je n’en ai pas encore rencontré qui ne fonctionne). Des add-ons peuvent être ajoutés afin d’augmenter les fonctionnalités, et la communauté autour du projet semble très active.
Une fois le tout monté, installé, configuré et quelques petits bugs corrigé, on peut s’installer tranquillement sur le canapé un sirop de pêche dans une main, la télécommande dans l’autre et le contrôle de toute sa médiathèque au bout des doigts… Un vieux rêve. C’est un moment parmi tant d’autre ou l’on se sent fier d’être geek !

 

Le choix du matériel

Afin que le matériel se fonde dans le décore, il faut quelque chose de discret, sobre et de petite taille. Fervent utilisateur d’ASUS, mon choix s’était d’abord posé sur la gamme eeebox. Mais devant l’impossibilité de trouver une version livrée sans OS (Windows 7 en l’occurrence), j’ai abandonné cette idée. En effet, je voulais absolument qu’XBMC soit installé sur un GNU/Linux et cela m’ennuyai profondément de payer une licence que je n’utiliserais pas avec le matériel. Je me suis donc dirigé vers la marque Shuttle, et plus particulièrement le modèle XS35GT v2.  Il ressemble à ça :

Ce modèle dispose d’un refroidissement passif faisant grâce des ventilateurs bruyants, une sortie vidéo/audio HDMI idéale pour la connexion à un téléviseur, et vendu sans OS (ni RAM ou disque dur dans mon cas). Le seul inconvénient pour moi et qu’il doit, si l’on en croit le manuel, être posé à la vertical afin de ne pas obturer les surfaces ajourées et limiter la dissipation de chaleur. Mais soyons honnête, son design s’intègre bien dans le décor, même debout. Et après plusieurs mois d’utilisation, le fait qu’il trône debout à côté de l’écran n’est ni choquant pour l’œil, ni même désagréable.

 

Installation de XBMC 10.0 Live (Dharma)

J’ai opté pour l’installation par le live CD XBMC. Il s’agit d’une distribution Debian/Ubuntu Lucid Lynx (10.04 LTS) sur laquelle XBMC et les composants essentiels à son fonctionnement sont déjà intégrés. La distribution est la dernière release stable à l’écriture de ces lignes : XBMC 10.0 Dharma.
La première contrainte lors de l’installation est l’absence de lecteur optique dans le XS35GTV2. Si aucun lecteur optique (optionnel sur ce modèle) n’a été installé, il faut passer par une installation via une clé USB. Pour cela, s’assurer dans un premier temps que la clé est formatée en FAT32. Utiliser ensuite le logiciel UNetBootin afin de générer une clé USB d’installation, puis installez l’OS XBMC Live.

Avant d’attaquer la configuration, il y a quelques paramètres à modifier. En effet, le compte logué et un compte utilisateur avec peu de droits, et le clavier et en QWERTY. C’est une question de choix personnel, mais sudo à chaque commande me gonfle, donc je passe en root :

# sudo -i

Puis l’on charge le français pour le mapping du clavier :

$ loadkeys fr

 

Activer l’interface réseau Ethernet

A près l’installation d’XBMC, aucune interface réseau (hors mis la boucle locale) n’est disponible, la carte réseau ethernet n’est pas détectée correctement. Le pilote étant déjà connu, cela peut être résolu facilement. Effectuer la combinaison de touches CTRL+ALT+F1 pour entrer dans une console si votre écran est connecté via la sortie HDMI (si vous êtes connecté avec la sortie VGA, la console est déjà affichée). A l’affichage du prompt d’authentification, entrer le login et le mot de passe (xbmc par défaut).

Entrer ensuite les commandes suivantes :

$ cd /lib/modules/2.6.32-26-generic/kernel/drivers/net/
$ sudo modprobe jme

Si toutefois le pilote n’était pas correctement intégré, voici la méthode pour l’installer.

Télécharger le pilote sur le site de l’éditeur
ftp://driver.jmicron.com.tw/Ethernet/Linux/

Copier l’archive sur une clé USB et connectez la au Shuttle (bah oui, y’a pas de réseau !!).

Monter la clé USB

$ mount /dev/sdb1 /mnt

Installez le pilote

$ cp -r /mnt/jme-1.0.6.1 /usr/local/src/
$ cd /usr/local/src/jme-1.0.6.1
$ sudo make install

Testez que le pilote est correctement installé

$ sudo modprobe jme

Maintenant que le pilote est chargé, passons à la configuration du réseau. Dans mon cas, un serveur DHCP est présent sur le réseau, la configuration réseau ne sera donc pas statique.
Editer le fichier /etc/network/interfaces

$ sudo vi /etc/network/interfaces

Le VI natif étant peut être déroutant pour la plupart, utilisez l’éditeur nano si vous n’êtes pas joueur (mais que les choses soient claires, on utilise VI quand on est un homme !!).
Donc,

$ sudo nano /etc/network/interfaces
auto eth0
iface eth0 inet dhcp

Sauvegardez le fichier et redémarrer le réseau

$ /etc/init.d/networking restart

L’interface réseau eth0 devrait maintenant avoir une adresse IP attribuée. Vous pouvez le vérifier par un petit :

$ ifconfig –a

 

Activer l’interface réseau wifi

Dans l’hypothèse ou votre infrastructure est mal conçu, vous ne disposez pas d’une prise ethernet proche de l’écran. Dans ce cas le wifi peut être une alternative.
Le pilote de la carte wifi (RTL8192SE) est disponible sur le site de l’éditeur :
http://www.realtek.com.tw/downloads/downloadsView.aspx?Langid=1&PNid=48&PFid=48&Level=5&Conn=4&DownTypeID=3&GetDown=false&Downloads=true
Pour installer les pilotes, il va falloir compiler cette fois.

$ cp -r /mnt/rtl8192se_linux_2.6.0017.0705.2010/ /usr/local/src/
$ cd /usr/local/src/rtl8192se_linux_2.6.0017.0705.2010/
$ make
$ make install

Redémarrez ensuite la machine.
Note: vous aurez peut être besoin d’installer les paquets suivant pour compiler les pilotes wifi :

$ apt-get install build-essential subversion module-assistant
module-assistant prepare

Editez le fichier /etc/network/interfaces ajoutez la configuration wifi

auto wlan0
iface wlan0 inet dhcp
wpa-ssid “wlan network name”
wpa-psk “clé wifi”

Redémarrez le réseau

$ /etc/init.d/networking restart

 

Activer l’audio via HDMI

L’étape suivante consiste à activer l’audio via HDMI.En effet, à ce stade, aucun son n’est perceptible par l’HDMI à la lecture d’une vidéo ou d’un fichier audio. Le X35GTv2 dispose de 2 cartes audios, et chacune dispose de son propre « device number ». Nous aurons besoin d’obtenir le « card number » et le « device number ». Pour ce faire, procédez comme suit :

$ aplay -l (that’s a small ‘L’)
**** List of PLAYBACK Hardware Devices ****
card 0: Intel [HDA Intel], device 0: STAC92xx Analog [STAC92xx Analog]
Subdevices: 0/1
Subdevice #0: subdevice #0
card 1: NVidia [HDA NVidia], device 3: NVIDIA HDMI [NVIDIA HDMI]
Subdevices: 1/1
Subdevice #0: subdevice #0

Nous utiliserons le  ‘HDA NVidia’ card et device number 3. Donc card #1 et device #3. Ces numerous peuvent être différents selon les configurations.
Ensuite, assurez vous que l’interface HDMI n’est pas paramétrée en “MUTE”. Pour cela, lancer la commande :

$ /usr/bin/alsamixer

Appuyez ensuite sur F6 pour sélectionner la carte audio HDA NVIDIA. Sélectionnez ensuite l’interface SDIF et appuyez sur la touche ‘m’ afin de « démuter » l’interface (le symbole OO doit apparaitre à la place de MM. MM indique que l’interface est paramétrée à « MUTE ».
La dernière étape est de configurer la sortie son dans les paramètres systèmes d’XBMC. Nous aborderons cela dans la dernière partie de l’article : paramétrage d’XBMC.

 

Autoriser l’USB à sortir de la mise en veille

Imaginons le scénario suivant : Vous ne souhaitez pas éteindre totalement le Shuttle, mais profiter de la mise en veille afin de permettre le « redémarrage » via la télécommande, dont le récepteur est connecté en USB. Outre le fait de surconsommer un peu d’énergie inutilement, et que faire quelques pas jusqu’au Shuttle pour l’allumer ne peut être que bénéfique d’un point de vue médical, un autre problème vient se greffer à l’équation : la mise en veille désactive l’alimentation des ports USB.  Pour que les ports restent alimentés durant la mise en veille, effectuez les modifications suivantes :
Vous souhaité par exemple que le port  USB0 échape à la mise en veille: USB0 est le port placé directement à côté du port VGA.

$ echo USB0 > /proc/acpi/wakeup

Pour vérifier que le port USB0 sera bien actif durant la mise en veille :

$ cat /proc/acpi/wakeup
Device S-state Status Sysfs node
P0P1 S4 disabled pci:0000:00:1e.0
AZAL S3 disabled pci:0000:00:1b.0
P0P4 S4 disabled pci:0000:00:1c.0
P0P5 S4 disabled pci:0000:00:1c.1
JLAN S3 disabled pci:0000:02:00.5
P0P6 S4 disabled
P0P7 S4 disabled pci:0000:00:1c.3
P0P8 S4 disabled
P0P9 S4 disabled
USB0 S3 enabled pci:0000:00:1d.0
USB1 S3 enabled pci:0000:00:1d.1
USB2 S3 enabled pci:0000:00:1d.2
USB3 S3 enabled pci:0000:00:1d.3
EUSB S3 enabled pci:0000:00:1d.7

Le mapping des ports USB pour le Shuttle XS35GTv2 est:
EUSB = front
USB0 = back usb port next to the capped vga
USB1 = next to USB1
USB2 = back usb port next to the vga
UBS3 = back usb port next to the lan
Afin de rendre les changements permanents, procéder comme suit :

$ sudo nano /etc/rc.local

Ajouter les lignes suivantes

echo USB0 > /proc/acpi/wakeup
echo EUSB > /proc/acpi/wakeup
echo USB1 > /proc/acpi/wakeup
echo USB2 > /proc/acpi/wakeup
echo USB3 > /proc/acpi/wakeup
exit 0

Assurez vous que la dernière ligne est bien ‘exit 0’ puis sauvegardez le fichier.
Les périphériques LIRC peuvent s’incrémenter. Nous allons donc devoir exécuter un script pour palier à ce défaut et permettre aux périphériques concernés de sortir de la mise en veille.

$ sudo nano /etc/pm/sleep.d/90_lirc

Ajoutez ces lignes au fichier

# Script to disable lirc before suspend and restart after wake.
  case${1}in
  suspend|hibernate)
  if [ "$(pidof xbmc.bin)" ] ; then
     wget -q -b -O /dev/null -o /dev/null “http://127.0.0.1:8080/xbmcCmds/xbmcHttp?command=ExecBuilt&Inparameter=LIRC.Stop”
  fi
  /etc/init.d/lirc stop
  ;;
  resume|thaw)
  # If remote still does not work after suspend, uncomment the lines below.
  # Note you may need to change “lirc_mceusb”. See output from ’sudo lsmod | grep lirc’ for module name.
  rmmod lirc_mceusb
  modprobe lirc_mceusb
  /etc/init.d/lirc start
  if [ "$(pidof xbmc.bin)" ] ; then
     wget -q -b -O /dev/null -o /dev/null “http://127.0.0.1:8080/xbmcCmds/xbmcHttp?command=ExecBuiltIn&parameter=LIRC.Start”
  fi
  ;;
  esac

Sauvegardez le fichier et quittez.
Donnez les permissions adequate au script

$ sudo chmod 755 /etc/pm/sleep.d/90_lirc

Vous devez ensuite paramétrer XBMC. Le script faisant appel à l’API JSON d’XBMC, il est nécessaire d’autoriser la prise de contrôle d’XBMC via http.
Dans  System →Network, configurez les paramètres suivant:

Allow control of XBMC via HTTP: activé
– Port: 8080
– Username: xbmc
– Password: ****
Web interface: default
Allow programs on this system to control XBMC: active

Dans System→System→Power Saving, configurez les paramètres suivant:

Shutdown function: Suspend
Dans certains cas, un écran noir est affiché après la sortie de veille. Cela est semble-t’il du au pilote réseau ‘jme’. Pour corriger cela, créez le fichier :

$ sudo nano /etc/pm/config.d/00sleep_module

Ajoutez les lignes suivantes:

SUSPEND_MODULES=”$SUSPEND_MODULES jme”

Sauvegarder et quittez, puis donnez les permissions au script:

$ sudo chmod 755 /etc/pm/config.d/00sleep_module

A présent le XS35GTv2 est mis en veille lorsque vous appuyez sur le bouton « Power » de la télécommande. Une seconde pression le sort de la veille, et XBMC est à nouveau fonctionnel.

 

Changer la résolution du Splash screen

Après l’installation, le splash screen de démarrage de la machine à une résolution basse (800×600). Ce qui donne un résultat très décevant. Ce n’est qu’un petit détail esthétique,  mais ça me turlupine. J’aime bien quand tout fonctionne! Donc pour changer la résolution, nous pourrions directement éditer le fichier de configuration GRUB, mais je pense qu’il est préférable d’éditer le fichier de valeurs par défaut de GRUB. Déjà parce qu’il est fait pour ça, et il permet d’éviter les erreurs graves. Donc:

$ vi /etc/default/grub

remplacer le paramètre #GRUB_GFXMODE=640x480 par GRUB_GFXMODE=1280x720.

La nouvelle résolution dépend de votre écran et de la capacité du chipset graphique. Cette valeur est donc à adapter selon votre configuration.

 

Paramétrage d’XBMC

Il est temps de paramétrer XBMC. Redémarrez le XS35GT puis, depuis l’écran XBMC, sélectionnez le menu System.

Configurer l’audio  HDMI

Rendez vous dans le menu System→Audio, puis paramétrez comme suit:

Audio Output: HDMI
Speaker configuration: 5.1 (Si vous disposez d’un home cinéma 5.1. Sinon adaptez à votre configuration)
Audio Output Device: Custom
Custom Audio Device: plughw:1,3 (card #1 (HDA NVidia), et device #3)
Passthrough Audio Device: Custom
Custom Passthrough Device: plughw:1,3 (card #1 (HDA NVidia), et device #3)
Dolby Digital (AC3) Capable Receiver: activé
DTS Capable Receiver: activé

L’audio via le câble HDMI doit maintenant fonctionner.

Configurer VDPAU

VDPAU=Video Decode and Presentation API for Unix. Il s’agit d’un protocole libre développé par NVIDIA et permettant l’accélération matérielle.
Afin d’activer le VDPAU, allez dans  System→System→Video→Playback et activez le bouton “Allow hardware acceleration (VDPAU)”.

 

Cloner le son sur les sortie HDMI et headphone

L’idée saugrenue m’est venu de vouloir brancher le Shutlle sur mon ampli via la prise Jack. Et là surprise, uniquement les sons de navigation des menus ne sont audibles depuis l’ampli (sons qui ne sont d’ailleur pas reproduit via le connecteur HDMI). C’est un peu génant car je ne recent pas nécessairement le besoin de laisser la télé allumée pendant que j’écoute de la musique, et il faut avouer que c’est un peu frustrant de ne pouvoir écouter la médiathèque sur l’ampli qui est là pour çà. Après beaucoup de recherches et de tests infructueux, voici une solution qui fonctionne. Il y en a certainement d’autres, et celle-ci ne permet que la stéréo sur 2 canaux, mais ça suffit pour mon installation (la HIFI c’est bien, le home cinéma c’est pour les noobs!).

Vérifiez les numéros de périphériques audio avec la commande aplay -l. Dans mon cas, les interfaces sont détectées comme suit:

  • HDMI: card 1, subdevice 3
  • Jack: card 0, subdevice 0

créez un fichier de configuration ALSA /etc/asound.conf, et ajoutez les lignes suivantes:

pcm.!default {
        type plug
        slave {
                pcm both
        }
}

pcm.both {
        type route
        slave {
                pcm multi
                channels 4
        }
        ttable.0.0 1.0
        ttable.1.1 1.0
        ttable.0.2 1.0
        ttable.1.3 1.0
}

pcm.multi {
        type multi
        slaves.a {
                pcm hdmi
                channels 2
        }
        slaves.b {
                pcm jack
                channels 2
        }
        bindings.0.slave a
        bindings.0.channel 0
        bindings.1.slave a
        bindings.1.channel 1
        bindings.2.slave b
        bindings.2.channel 0
        bindings.3.slave b
        bindings.3.channel 1
}

pcm.jack {
        type hw
        card 0
        device 0
        channels 2
}

pcm.hdmi {
        type hw
        card 1
        device 3
        channels 2
}

ALSA prendra ce fichier de configuration par défaut, mais il faut ensuite configurer XBMC pour qu’il utilise le bon périphérique. Dans l’interface XBMC, rendez vous dans le menu System→Audio, puis réglez les paramètres:

Audio Output Device: Custom
Custom Audio Device: pcm.both

Redémarrez XBMC, et le son devrait maintenant sortir par les deux cartes simultanément. Je conseil quand même de désactiver les sons de navigation qui deviennent insupportables au fil du temps.

 

Afficher les températures CPU et GPU

Si vous faites un petit tour dans le menu System→System infos, vous vous apercevrez certainement que les menus sont prévus pour afficher les températures CPU et GPU, mais qu’aucune valeur n’est retournée. Cela est du au fait que les commandes par défaut pour récupérer ces infos ne fonctionnent pas. Pour corriger cela, éditez le fichier /home/xbmc/.xbmc/userdata/advancedsettings.xml

ajoutez les deux lignes suivantes entre les balises principales <advancedsettings>:

<gputempcommand>
   echo "$(nvidia-smi -q -a | grep Temperature | awk '{print $3}') C"
</gputempcommand>
<cputempcommand>
   sed -e 's/\([0-9]*\)[0-9]\{3\}.*/\1 C/' /sys/class/thermal/thermal_zone0/temp
</cputempcommand>