Dans le cadre de mon HTPC, je me suis heurté à la qualité audio délivrée par PulseAudio dans sa configuration initiale.
En effet, la configuration par défaut délivre un son adapté à des enceintes bas de gamme d'ordinateur, ce qui permet de ne pas exiger des performances trop gourmandes au processeur alors que dans la majeure partie des cas ce n'est pas nécessaire.

Un HTPC n'est toutefois pas un cas d'usage standard, et je souhaite obtenir une qualité optimale en accord avec les sources utilisées.

Bien que la réponse la plus courante soit de se débarrasser de PulseAudio pour utiliser seulement ALSA, je n'ai jamais trouvé d'explication rationnelle à cela. Excepté une latence supplémentaire ajoutée par PulseAudio, ce qui est évident étant donné qu'il se comporte comme une couche supplémentaire.
En revanche utiliser ALSA directement est une source de complication dont je préfère me passer...

L'essentiel de la configuration de PulseAudio se fait via le fichier /etc/pulse/daemon.conf

On peut afficher la configuration actuelle de PulseAudio avec l'argument --dump-conf

pulseaudio --dump-conf

Pour modifier cette configuration, nous allons ajouter notre propre configuration à la fin du fichier /etc/pulse/daemon.conf

# Audiophile setting
default-sample-format = s24le
default-sample-rate = 48000
resample-method = soxr-vhq
avoid-resampling = true
remixing-use-all-sink-channels = no
remixing-produce-lfe = no
remixing-consume-lfe = no
high-priority = yes
nice-level = -11
realtime-scheduling = yes
realtime-priority = 5

Après toute modification de la configuration de PulseAudio, il est nécessaire de le redémarrer:

pulseaudio -k; sleep 2; pulseaudio --start

default-sample-format

Considérant que PulseAudio va se charger de décoder le signal audio, qui est, le plus souvent, encodé dans un format audio, que ce soit mp3, wma ou de préférence flac, Dolby ou DTS, PulseAudio doit définir la taille allouée au codage de chaque échantillon au format PCM qui sera produit.

Le principe est simple, plus la taille allouée est importante, plus le codage de la quantification est fin et précis. Mais plus la taille allouée est importante plus il impactera la mémoire et le processeur.

Il est ici question de la quantification de l'échantillon, soit la précision sur l'axe vertical de la sinusoïde du signal.

En terme purement audio, il s'agit de la plage dynamique.

PulseAudio supporte un certain nombre de formats pour les échantillons, qui sont indiqués sur cette page.
Dans le cas d'un processeur performant, et considérant que nous recherchons un son optimal, nous ferons le choix du format le plus précis, accepté par la carte son, le s24.

Toutefois, PulseAudio supporte plusieurs formats s24, différenciés par le byte order supporté par le processeur.
Pour choisir, il faut connaître le byte order utilisé par le processeur installé.
Cette commande indiquera le byte order à choisir:

lscpu | grep 'Byte Order'

Enfin, pour connaître les formats accepté par la carte son, nous disposons de cette commande, qui va afficher les capacités des cartes sons installées.

cat /proc/asound/card?/codec* | grep -E "Codec|bits"

Ainsi que celle-ci pour connaître les formats accepté sur les port HDMI utilisés, le cas échéant.

cat /proc/asound/card?/eld* | grep -E "bits"

Il est inutile d'utiliser un format plus grand que celui supporté par la carte son utilisée, il se verrait réduit, entraînant une surcharge de travail superflue.

Par défaut, PulseAudio utilise un format 16 bits signé (s16le), la qualité CD.

default-sample-rate

Le sample rate est le pendant du sample format, alors que le second concerne la taille verticale de l'échantillon, le premier concerne le nombre d'échantillons par seconde, donc la taille horizontale (la durée) de l'échantillon.

À l'inverse de sample format, le sample rate a tout intérêt à être le plus petit possible.
En effet, une seule valeur étant possible pour chaque échantillon, pour obtenir d'avantage de finesse il faut multiplier les échantillons.

Ce paramètre concerne toutefois l’échantillonnage par défaut, celui sous lequel PulseAudio ne descendra pas.

Il faut considérer que l’échantillonnage le plus courant est 44.1kHz, soit 44100 échantillons par seconde.
Je choisis personnellement d'utiliser 48kHz par défaut, ce qui conduit à une légère extrapolation des sources à 44.1kHz sans représenter une charge de travail trop importante.

Il est à noter qu'il serait plus juste de choisir un échantillonnage par défaut de 44.1kHz, puisque étant le plus répandu.
Mais, à mon oreille, l'échantillonnage extrapolé à 48kHz produit un son de meilleur qualité.

Par défaut, PulseAudio utilise un échantillonnage de 44.1kHz par défaut et 48kHz en choix alternatif.

Toutefois, nous verrons par la suite que PulseAudio, par défaut, n'autorise en réalité que ces échantillonnages, soit 44.1 soit 48 et resample tout ce qui ne correspond pas.

Il est important également de ne pas choisir un échantillonnage plus important que les capacités de la carte son utilisée.
Cette information peut être obtenue avec les commandes suivantes

cat /proc/asound/card?/codec* | grep -E "Codec|rate"
cat /proc/asound/card?/eld* | grep -E "coding|rates"

resample-method

Ce paramètre permet de choisir l'algorithme à utiliser pour le ré-échantillonnage lorsque c'est nécessaire.

La commande suivante permet de connaître les différents algorithmes disponible:

pulseaudio --dump-resample-methods

Encore une fois, l'objectif étant la qualité audio, nous choisirons l'algorithme le plus performant en terme de qualité audio, le soxr-vhq.
Il est aussi le plus exigeant sur le processeur, mais c'est tout à fait négligeable sur un processeur moderne.

Par défaut, PulseAudio utilise l'algorithme speex-float-1, qui est rapide mais peu précis.

avoid-resampling

Un paramètre essentiel, qui fonctionne de paire avec default-sample-rate.
Configurer avoid-resampling à yes permet à PulseAudio de ne pas ré-échantillonner la source si ce n'est pas nécessaire.

Par pas nécessaire, il faut comprendre qu'avec ce paramètre activé, PulseAudio ne ré-échantillonnera pas les sources dès lors qu'elles sont supérieures ou égales à la valeur de default-sample-rate.

Ce paramètre permet donc de jouer les sons échantillonnés à 96, 192 voir 384kHz sans les détériorer. C'est un paramètre essentiel !

Par défaut, PulseAudio n'utilise pas ce paramètre, donc toutes les sources sont réduite à 48kHz au maximum par défaut.

remixing-use-all-sink-channels

Ce paramètre indique à PulseAudio si il doit remixer les sources pour les faire correspondre au mapping actuel de la sortie audio.
En plus concret, ce paramètre permet de upmixer les sources stéréo en surround, dans le cas d'une sortie 5.1, 7.1 ou plus. Ou au contraire de downmixer une source surround en stéréo le cas échéant.

Dans le cas d'une installation surround, cela revient à détruire l'image stéréo originale de la musique et produire le son sur toutes les enceintes.

La question du mapping des canaux est bien mieux gérée par un ampli Hi-Fi.

Par défaut, PulseAudio a ce paramètre réglé sur yes.

Un cas d'usage de ce paramètre est toutefois le cas de sons d'ambiance stéréo simulés en surround par des algorithmes de type Dolby Surround, DTS Neural:X and DTS Virtual:X.
Cela reste toutefois un cas d'usage très spécifique !

remixing-produce-lfe et remixing-consume-lfe

remixing-produce-lfe est utilisé pour créer un canal LFE (Low Frequency Effects) sur une source qui n'en dispose pas.
En somme, ce paramètre permet de créer un canal pour le caisson de basse à partir d'une source qui n'en disposerais pas.

Il y a peu de cas d'usage de ce paramètre, le caisson de basse étant en général pris en charge par l'ampli Hi-Fi ou disposant de son propre filtre passe-bas.

Le paramètre remixing-consume-lfe effectue l'inverse en remixant le canal LFE dans les autres canaux.
Ce paramètre peut être utile dans le cas d'un défaut de transmission du canal LFE ou l'absence de caisson de basse, tel que décrit dans Downmix 5.1 vers 5.0 avec PulseAudio.

Par défaut, ces 2 paramètres sont désactivés.

high-priority, nice-level, realtime-scheduling et realtime-priority

Ces paramètres, que j'ai personnellement choisi de laisser dans leur valeur par défaut, concerne la priorité d'exécution de PulseAudio.

Utiliser high-priority à yes permet de changer la priorité de PulseAudio en appliquant le niveau de niceness de l'option nice-level.
Cela permet à PulseAudio d'avoir un accès prioritaire sur le processeur par rapport à d'autres processus moins importants.

Quand à realtime-scheduling, il permet à PulseAudio d'utiliser l'ordonnanceur (scheduler) CPU temps réel SCHED_FIFO. Cela permet à PulseAudio de disposer d'un traitement temps réel de ses requêtes par le processeur en outrepassant la pile de requêtes envoyées par les autres processus.
realtime-priority est la priorité des requêtes de PulseAudio dans l'ordonnanceur SCHED_FIFO par rapport aux autres requêtes présentes dans cet ordonnanceur.

Par défaut, PulseAudio est paramétré pour travailler en temps réel avec des valeurs de priorités qui permettent de ne pas empiéter sur les processus vitaux du système.

tsched=0

Cet argument, tsched=0, est omniprésent sur internet dès lors qu'on se plaint de craquements ou de défauts dans le son produit par PulseAudio.
Pourtant le problème peut être plutôt à chercher du côté de l'économie d'énergie, comme expliqué dans Lorsque le son n’est pas utilisé, le HTPC produit d’affreux bruits.

tsched signifie timer-based scheduling, c'est la méthode de buffering utilisé par PulseAudio pour transmettre les échantillons audio à la carte son.
Comme expliqué par Lennart Poettering, le développeur à l'origine de cet algorithme, cette méthode de buffering permet de travailler sur des échantillons de taille variable, en fonction du comportement de la carte son, de la latence observée et du comportement de la source.

Le timer-based scheduling remplace la méthode par interruptions (IRQ), beaucoup moins flexible car basée sur des tailles d'échantillons fixes.

Ajouter tsched=0 sur un module de PulseAudio revient à lui demander de ne pas travailler avec la méthode timer-based scheduling mais d'utiliser à la place la méthode par interruptions.
Raison pour laquelle je déconseille l'usage de cet argument.

Par défaut, PulseAudio utilise le bufferring de type timer-based scheduling.

default-fragments et default-fragment-size-msec

Ces 2 paramètres ne sont utilisés qu'avec la méthode de buffering par interruptions.

default-fragments correspond au nombre de fragments à envoyer à la carte son. default-fragment-size-msec correspond à la taille, en millisecondes, de chaque fragment.

Il est difficile de paramétrer correctement la taille de buffer, car celle-ci se fait en millisecondes, or le même son en 16b/44kHz ne fait pas la même taille que son homologue en 24b/192kHz pour la même durée.
Dès lors, si la valeur par défaut de 100ms fonctionne parfaitement pour une source 44kHz, il produit des craquements pour une source 192kHz.

Réduire le durée du buffer permet d'améliorer le rendu des sources 192kHz, mais produira des défauts pour les sources 44kHz.
Réduire la durée du buffer augmente également le nombre d'interruptions et donc la charge processeur.

Globalement, il est préférable de ne pas utiliser ce mode de buffering et de garder le mode timer-based scheduling utilisé par défaut.
Si toutefois vous souhaitez utiliser ce mode de buffering, il faudra chercher la valeur la plus adéquat pour votre matériel et les sources utilisées.

Attention, contrairement à ce qu'on peut parfois lire, device.buffering.buffer_size et device.buffering.fragment_size ne donne pas la taille de buffer acceptée par la carte son ! Seulement la taille actuelle de buffer utilisée par PulseAudio.

Par défaut, PulseAudio n'utilise pas ces paramètres.
Toutefois, ils sont présent et par défaut réglés sur 4 fragments de 25ms. Soit 100ms.

11

Apr

by Maniack Crudelis

Pourquoi un downmix 5.1 vers 5.0 ?
Plusieurs raisons à cela:

  • Un système audio 5.0, sans caisson de basse, et un ampli qui ne remix pas le canal LFE (.1) dans le mix global.
  • Un élément de la chaine audio qui perd le canal LFE avant l'ampli.

Je me situe dans le 2e cas de figure, avec une panne matérielle affectant l'entrée HDMI de ma barre de son, m'obligeant à passer le signal audio via l'entrée HDMI ARC de ma TV.
Problème toutefois, même avec l'audio en PassThrough sur la TV, celle-ci ne transmet pas le canal LFE du caisson de basse. Résultant en un son plat et fade...

Pour remédier à ce problème le meilleur moyen est d'effectuer un downmix 5.1 vers 5.0 pour remixer le canal LFE dans le mix global.
De cette manière, le signal du canal LFE va transiter sur les autres canaux audio et être ensuite transmis au caisson de basse par le filtre passe-bas de la barre de son.

Si la méthode n'est pas optimale, elle permet au moins de pallier le défaut et de retrouver l'usage du caisson de basse pour les sources 5.1.

Pour y parvenir, nous allons créer un nouveau "sink" pour PulseAudio.

Tout d'abord, il est nécessaire d'identifier le profil auquel rattacher ce nouveau "sink"

pacmd list-sinks | grep name:

Ce qui donne un nom de profil de la forme "alsa_output.pci-0000_01_00.1.hdmi-surround"

Ensuite, nous pouvons ajouter un nouveau sink 5.0
Editer le fichier "/etc/pulse/default.pa"

sudo nano /etc/pulse/default.pa

Et y ajouter

# Add a 5.0 sink to downmix from 5.1 to 5.0 and keep the LFE
load-module module-remap-sink sink_name=Surround50 sink_properties="device.description='Surround 5.0'" remix=yes master=alsa_output.pci-0000_01_00.1.hdmi-surround channels=5 master_channel_map=front-left,front-right,rear-left,rear-right,front-center

Nous disposons à présent d'un sink 5.0, attaché au profile HDMI Surround, mais celui-ci ne permet pas encore de réintégrer le canal LFE. Pour y parvenir, il faut encore éditer le fichier "/etc/pulse/daemon.conf"

sudo nano /etc/pulse/daemon.conf

Et y ajouter

# Remix the LFE channel into the 5.0 global mix
default-sample-channels = 5
enable-remixing = yes
remixing-consume-lfe = yes

On peut à présent redémarrer PulseAudio

pulseaudio -k; sleep 2; pulseaudio --start

Et vérifier la présence du caisson de basse sur un extrait 5.1, comme ceux présents sur le site fraunhofer.

11

Mar

by Maniack Crudelis

Las de devoir changer de source entre mon Kodi (sur un raspberry pi) et le décodeur TV de mon FAI et circonspect quand à l'arrivée inéluctable d'un décodeur Android TV, j'ai finalement décidé de tout réunir dans une seule source, un Home Theater Personal Computer (HTPC).
De cette manière, plus de problème avec le décodeur de mon FAI qui surveille mes activités, m'écoute et change l'accès à ses services au gré de ses partenariats.

A moi un ordinateur performant et évolutif qui sera en mesure de servir tout mes médias et services sans que j'en perde le contrôle.

Sommaire:

Le matériel

Ma configuration initiale est simple et peut être adapté selon les besoins.

  • Pour l'écran, je dispose d'une TV de 55 pouces en 4K.
  • Le son est servi par une barre de son avec caisson de basse Yamaha YAS-207.
  • J'ai finalement migré vers un ensemble 5.1 Cabasse Eole servi par un ampli Denon AVR-X2700H

Le HTPC en lui-même est construit sur plusieurs éléments.

  • Le boîtier

Un SilverStone Milo ML04 de faible encombrement avec suffisamment d'aération pour laisser respirer la configuration. Très important étant donné que l'ensemble va se trouver dans un espace réduit dédié du meuble TV.

Ce boîtier dispose également d'un emplacement pour un lecteur Blu-ray.

  • La carte mère

Une carte mère simple, une ASRock H410M/AC qui dispose d'une sortie HDMI, de Wifi et de Bluetooth.

  • Le processeur

Un Intel Core i5-10400 avec un chipset graphique Intel UHD Graphics 630 intégré pour gérer la sortie vidéo.

En l'état, ce couple processeur/carte mère permet de sortir de la 4k à 30Hz. Théoriquement suffisant pour regarder des films en 24 images par secondes. Mais ces processeurs ne sont pas stables pour de la vidéo 4k.

Très important également, ce processeur a un TDP de 65W seulement, ce qui permet d'éviter de surchauffer. Le refroidissement de l'ensemble étant un point clé. Le HTPC ne doit pas ventiler trop bruyamment.

  • La carte graphique

Le processeur n'étant pas capable de fournir de la 4k sans saccades, j'ai ajouté une carte graphique simple, une MSI GeForce GT 1030 2GH LP OC.

Son atout est le support de l'HDMI 2.0b, le support jusqu'à 4k@60Hz, de manière fluide..., et un refroidissement passif, donc parfaitement silencieuse.

  • Les autres composants
    • 8 Go de RAM Corsair, avec radiateur, pour faire tourner l'ensemble.
    • Une alimentation silencieuse 80PLUS, un meilleur rendement étant synonyme de moins de déperdition de chaleur.
    • Un SSD de 120Go. Pas de bruit mécanique et de peu de chaleur dégagée.
    • Et 2 ventilateur PWM pour refroidir l'ensemble.
      C'est un peu plus cher, mais ça permet à la carte mère de réguler la vitesse des ventilateurs en fonction de la température. Donc moins de bruit quand ce n'est pas nécessaire.
L'ensemble des composants du HTPC
Le HTPC complètement assemblé

Le meilleur pour la fin, une télécommande Rii Mini i25 Wireless, un 3 en 1 clavier/souris/télécommande média.
Indispensable pour utiliser son HTPC depuis le canapé.

Tout l'intérêt c'est que ce genre de télécommande se comporte comme un clavier/souris sans fil avec des touches multimédia. C'est donc compatible avec n'importe quel ordinateur sans besoin de configuration supplémentaire.

Configuration du BIOS

De légères customisations du BIOS vont être nécessaire pour tirer tout le parti de notre HTPC.

  • Ventilateurs en Silent Mode

Premièrement, la vitesse des ventilateurs du châssis, les 2 ventilateurs PWM doivent extraire la chaleur hors de la carcasse, mais en limitant le bruit. Nous allons donc régler ces 2 ventilateurs en Silent Mode.
Ça n'empêchera pas les ventilateurs de suivre la montée en température, simplement ils seront moins enclins à s'agiter si ce n'est pas nécessaire.

Nous allons laisser toutefois le ventilateur du processeur en Standard Mode pour ne pas affecter ses performances.

  • Démarrage sur USB

Nous allons également activer USB Keyboard/Remote Power et Legacy USB port pour permettre la sortie de veille depuis une télécommande.

Il s'avère que Rii Mini i25 Wireless n'est pas capable de réveiller la machine, tandis que le Mini Wireless Keyboard K01+ (de la même marque) en est parfaitement capable.
Un fait bien étrange que je suis incapable d'expliquer...

Dans ce cas de figure, faute d'une télécommande conciliante, je vous conseille une application Wake On Lan à installer sur un smartphone.

  • Réveil sur alarme RTC

Afin de supporter la sortie de veille ou le démarrage sur l'horloge RTC, qui nous servira aux backups. Nous allons configurer RTC Alarm Power On sur By OS.

Installation du système (Kubuntu)

Bien entendu chacun est libre d'installer la distribution et l'interface de son choix, ma préférence va à Kubuntu pour plusieurs raisons

  • J'ai l'habitude de travailler sous Debian avec l'interface KDE !
  • Ubuntu permet d'avoir un support large en cas de problème et est régulièrement mis à jour.
  • Du fait que KDE soit hautement configurable, c'est une interface qui va pouvoir être soumises à de nombreuses modifications pour être pratique à utiliser dans le cadre d'un HTPC.

Notons toutefois que toutes les explications qui suivront tiendrons compte d'une interface de bureau KDE sous Ubuntu.

Je ne vais pas détailler ici l'installation de Kubuntu, qui est particulièrement simple, si nécessaire ubuntu-fr propose une documentation.

Le seul point important lors de l'installation est de veiller à prévoir une partition swap de taille supérieure à la mémoire vive installée dans le HTPC. Sans cela, le HTPC ne sera pas en mesure de se mettre en hibernation lorsqu'il ne sera pas utilisé.
Pour notre cas, le swap sera de 10Go.

Je conseille également d'activer l'ouverture de session automatique, pour plus de confort.

Accès SSH

C'est tout à la fois une étape tout à fait optionnelle et pourtant indispensable de mon point de vue.
Si l'objectif d'un HTPC n'est certainement pas d'être utilisé via SSH, il est indéniable qu'un vrai clavier est irremplaçable pour les opérations de maintenance et même certaines commandes qui vont suivre.

Kubuntu ne dispose pas d'un serveur SSH par défaut, nous allons donc installer le paquet ssh.

sudo apt install ssh

Des configurations supplémentaires sont disponible dans /etc/ssh/ssd_config mais pas indispensable, pour ma part je modifie toujours le port par défaut.

Rien de plus à faire pour pouvoir profiter à tout moment d'un accès SSH indépendant de l'interface graphique du HTPC.

Configuration initiale de l'interface

- Résolution d'écran

La première bonne nouvelle à la fin de l'installation c'est que Ubuntu gère nativement et automatiquement la résolution 4k sans besoin de configurer quoi que soit.
Toutefois, à 30Hz, la désynchronisation avec la fréquence des vidéos se remarque beaucoup plus. Il devient donc nécessaire de connaître la fréquence de rafraîchissement des vidéos pour s'y conformer.

Les sources 4k sont encore rares, pour faciliter la lecture de vidéo sur Firefox ou éviter une charge de travail trop importante en upscaling, nous pourrions décider de rester en 1920×1080 60Hz pour l'usage courant et basculer en 4k seulement quand nécessaire.

Cela a toutefois des conséquences inattendues en raison d'un bug KDE, la configuration DPI de sddm (l'écran de login) va être appliquée au bureau plasma.
Pour faire simple, les icônes et le texte risquent d'être tout petits et illisibles. Et les widgets vont être déplacé à chaque ouverture de session, ce qui est très agaçant...

Pour corriger ce problème, il faut connaître la configuration DPI de la session plasma.

xdpyinfo | grep -B2 resolution

Pour ma part, la session plasma est à 96 dpi.
Puis forcer sddm à utiliser la même configuration.

sudo nano /etc/sddm.conf.d/kde_settings.conf
[X11]
ServerArguments=-dpi 96
EnableHiDPI=true

[Wayland]
EnableHiDPI=true
sudo nano /usr/share/sddm/scripts/Xsetup
xrandr --dpi 96

Si toutefois nous souhaitons garder une résolution de 3840×2160, il nous faudra augmenter l'échelle globale pour que l'interface ne soit pas trop petite.
Toutefois, c'est tentant je sais, mais n'utilisez jamais une échelle qui ne soit pas un nombre entier !!! Pas de 125, 150 ou 175.
Ceci s'appelle du "fractional scaling", c'est encore récent et ça provoquera d'affreux lags sur les vidéos fullscreen.

- Fréquence de rafraîchissement de l'écran

Si l'écran est configuré en 2160@30, soit la résolution 4k disponible en 30Hz. Nous pouvons parfois être confronté à des problèmes de synchronisation entre le taux de rafraîchissement et la fréquence des vidéos, visible en particulier sur les travelling.
Dans ce cas, il peut être préférable d'avoir un taux de rafraîchissement plus proche de celui de la vidéo.

Ce paramètre peut être modifié dans:

Configuration du système > Affichage et Écran > Configuration de l'affichage > Taux de rafraîchissement

Toutefois, et afin de garder davantage de flexibilité, nous allons nous permettre le luxe de changer le taux de rafraîchissement en fonction de nos activités.
Dans le panneau de configuration précédent, nous avons pu constater les taux de rafraîchissement disponible pour notre écran. Avec cet écran et ce chipset graphique, je dispose de 24, 25 ou 30 Hz pour une résolution 4k et jusqu'à 120Hz pour 1080.

Le nombre d'images par seconde dépend de la source.
- 24 FPS correspond au standard du cinéma. De nombreuses séries américaines utilisent également cette fréquence pour le rendu cinéma qu'elle procure.
- 25 FPS est la fréquence des formats PAL et SECAM utilisés à la télévision, notamment française et dans une grande partie du monde.
- 30 FPS est la fréquence du format NTSC pour la télévision, essentiellement américaine et japonaise.

On peut trouver une répartition des formats utilisé de par le monde sur cette carte de Wikipedia.

Pour changer la fréquence de rafraîchissement de l'écran simplement et rapidement, nous allons créer des raccourcis rapide dans la barre d'outil principale en créant un Composant graphique (Widget) Lancement rapide dans lequel nous allons glisser des fichiers desktop.

Pour ce faire, nous allons Créer un nouveau > Lien vers une application.
Dans le champs Commande : nous ajouterons

xrandr --size 3840x2160 --rate 24

ou

xrandr --size 1920x1080 --rate 60

Et ainsi de suite pour chaque taux de rafraîchissement dont nous souhaitons disposer rapidement.

Pour vérifier le taux de rafraîchissement et son bon fonctionnement, nous pourrons nous tourner vers ce site: Framerate Benchmark.

Pour éviter ce désagrément, le plus simple est d'opter pour une résolution 4k@60

- Largeur des barres de défilement

En utilisant une air mouse sans molette de défilement, les barres de défilement tendent à devenir un outil indispensable... Heureusement KDE permet de changer la taille des barres de défilement (les ascenseurs).

Ce paramètre se trouve dans Configuration du système > Apparence des applications
En choisissant un style d'application, il est possible de le configurer.
Parmi les styles par défaut, seul le style Oxygen permet de changer la largeur des barres de défilement.

Toutefois, en ce qui concerne les applications utilisant gtk (tel Firefox), ce paramètre sera ignoré. Pour pallier ce défaut, nous allons modifier les barres de défilement gtk.

nano $HOME/.config/gtk-3.0/gtk.css

Et ajouter à la suite:

.scrollbar.vertical slider,
scrollbar.vertical slider {
min-width: 15px;
}

- Bords de l'écran

Sauf à être particulièrement habile avec une air mouse, je conseille vivement de désactiver les actions en bord d'écran.

Ce paramètre se trouve dans Configuration du système > Comportement de l'espace de travail > Bords de l'écran

- Verrouillage après sortie de veille

Par défaut, kubuntu verrouille la session après la sortie de veille. Ce n'est pas le comportement souhaité.

Ce paramètre se trouve dans Configuration du système > Verrouillage de l'écran > Après le réveil

- Veille et hibernation

Il n'est pas souhaitable que le HTPC reste toujours allumé, dans le même temps nous souhaitons qu'il soit rapidement opérationnel.
Pour cela nous allons utiliser la mise en veille et l'hibernation sur le long terme.

Avant toutefois de paramétrer l'hibernation, il va être nécessaire de l'activer dans ubuntu. (Pour une raison étrange, l'hibernation n'est pas possible par défaut dans ubuntu...)

Les informations qui suivent sont tirées du tuto Comment activer l'hibernation.

Installons tout d'abord le paquet pm-utils pour obtenir la commande d'hibernation.

sudo apt install pm-utils

Nous allons ensuite créer le fichier /etc/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla

sudo nano /etc/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla

Et y ajouter le code suivant

[Réactive hiberner par défaut dans upower]
Identity=unix-user:*
Action=org.freedesktop.upower.hibernate
ResultActive=yes

[Réactive hiberner par défaut dans logind]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.handle-hibernate-key;org.freedesktop.login1;org.freedesktop.login1.hibernate-multiple-sessions;org.freedesktop.login1.hibernate-ignore-inhibit
ResultActive=yes

Et enfin redémarrer le HTPC.

A présent nous pouvons faire usage de l'hibernation dans notre HTPC.

Ce paramètre se trouve dans Configuration du système > Gestion de l'énergie > Économie d'énergie

  • > Suspendre la session

Nous allons choisir une mise en veille automatique après un temps raisonnable d'inactivité.
Cela permettra de ne pas garder le HTPC inutilement allumé si il n'est pas utilisé.

  • > En veille, hiberner après une certaine période d'inactivité

Ceci va permettre de placer le HTPC en hibernation suite à la mise en veille pour ainsi économiser le courant.
La période d'inactivité avant hibernation est de 3 heures par défaut, cette valeur par défaut peut être modifiée dans le fichier /etc/systemd/sleep.conf

Cette "période d'inactivité" doit être comprise comme période de veille du HTPC. Ce délai s'ajoute donc à celui précédent la mise en veille.

  • > Prise en charge des évènements de boutons

Nous allons rester cohérent et demander une mise en hibernation immédiate lors de l'appui sur le bouton power.

- Configuration de la télécommande

KDE permet de changer les raccourcis de pratiquement tout élément de l'interface.

Ces paramètres se trouvent dans Configuration du système > Raccourcis

La télécommande ne disposant pas de touche F4, il nous faudra aller chercher la croix en haut à droite des fenêtres pour espérer les fermer.
Pour pallier cet agaçant défaut, nous allons utiliser un autre raccourci clavier.
J'ai choisi la combinaison Ctrl+Back

Ce raccourci se trouve dans > Raccourcis globaux > Kwin > Fermer une fenêtre

On peut noter également que le bouton d'extinction de la télécommande est en réalité un bouton de mise en veille. Cela ne pose pas de problème puisque la mise en veille suivi de l'hibernation est préférable.
Si nous souhaitions toutefois changer ce raccourci, il se trouve dans > Raccourcis globaux > Gestion de l'énergie

Et puisque qu'à l'étape suivante nous allons configurer des bureaux virtuels et dédier le premier au dashboard principal, nous allons configurer le bouton Home de la télécommande pour qu'il mène directement à ce bureau.

> Raccourcis globaux > Kwin > Passer au bureau 1

De même pour faciliter la navigation entre les bureaux, nous pouvons sacrifier les touches PgUp et PgDn pour passer respectivement au bureau précédent et suivant.

> Raccourcis globaux > Kwin > Passer au bureau précédent
> Raccourcis globaux > Kwin > Passer au bureau suivant

Adaptation de l'interface pour un HTPC

Bien que la télécommande choisie dispose d'un clavier et d'une air mouse, force est de constater qu'il ne s'agit pas d'un ordinateur avec une interface clavier/souris habituelle. Nous souhaitons une interface simple à utiliser avec une télécommande, plus proche de ce qu'on peut attendre d'un HTPC.

Mon choix se porte sur une interface en multi-bureaux avec des bureaux dédiés à chaque activité et un bureau principal servant à la navigation.

- La barre d'outil principale

La barre d'outil principale au bas de l'écran est relativement importante, pour les notifications notamment. Nous pourrions nous en passer éventuellement.
J'ai fais le choix de la garder.

Si on fait le choix de garder cette barre d'outils, il est toutefois préférable d'agrandir sa taille pour avoir une meilleure visibilité.
Pour ce faire, un clic droit sur la barre d'outils permet d'accéder à sa configuration.

> Modifier tableau de bord...

Ensuite, nous allons remplacer le menu principal, le Lanceur d'applications par un menu plus facile à utiliser sans souris.

Un clic droit sur le Lanceur d'application permet de sélectionner Afficher les Alternatives... Nous choisirons Tableau de bord des applications en remplacement.

- Le bureau

Le bureau va se présenter comme le coeur de notre interface de navigation.
Pour commencer, nous allons utiliser une vue principale de type Bureau au lieu de Vue de dossier pour éviter les interférences de divers fichiers dans le dossier.

Ensuite nous allons ajouter un ensemble de Composants graphiques (Widgets) pour constituer l'interface et avoir un monitoring simple sur l'activité du HTPC.

  • Gestionnaire de bureaux

Pour le confort de l'interface, le choix se fait sur 8 bureaux en 4 lignes.

Configuration du système > Comportement de l'espace de travail > Bureaux virtuels

Le widget lui-même sera configuré pour afficher le Nom du bureau et Afficher le bureau lorsqu'il sera sélectionné.
Avec cette configuration, nous disposons d'un moyen simple de changer d'activité en cliquant simplement sur le bureau souhaité.

  • Lancement rapide

Ce widget va nous servir à avoir un accès rapide sur nos services.

Ce faisant, nous pourrons aisément démarrer Kodi ou Netflix depuis le bureau.

  • Surveillance de la température

Thermal Monitor est un widget qui n'est pas installé par défaut, il est toutefois très simple de l'ajouter à KDE en cliquant sur Obtenir de nouveaux composants graphiques.

Ce widget nous permettra de garder un oeil sur la température du HTPC.

  • Tableau de bord des applications

Pour terminer, nous allons ajouter un second Tableau de bord des applications pour avoir un accès rapide à l'aide de la souris si nécessaire.

La configuration de l'interface est à présent terminée et prête pour un usage dédié à un HTPC.

Mon HTPC sur ma TV 4k

- Lancement rapide sur bureau dédié

Le widget de lancement rapide abrite donc nos différents services, mais afin d'éviter de devoir se placer sur le bureau correspondant pour ouvrir les services correspondants nous allons modifier les lanceurs de ces services.

L'objectif est simple, s'assurer que le service n'est pas déjà actif, pour ne pas le dupliquer, démarrer le service sur son bureau puis se placer sur le bureau correspondant.
Le script nous permettra également d'utiliser la résolution et la fréquence de rafraîchissement idéale pour chaque usage.

Tout d'abord, nous allons installer le paquet wmctrl pour changer de bureau en ligne de commande.

sudo apt install wmctrl

Ensuite nous allons créer un script qui sera le hub de tous les démarrages de services.

Quelques explications sur ce script:

  • start_app est la fonction qui se charge du démarrage de l'application, ainsi que de la surveillance de celle-ci.
    Le premier argument est l'application à exécuter.
    Le second la chaine de caractère à surveiller dans la liste des processus pour savoir si l'application est déjà en cours.

  • screen_config permet de choisir, selon l'application, la résolution d'écran à utiliser, 1080 ou 2160 ainsi que la fréquence de rafraîchissement de l'écran à utiliser.
    Ces paramètres pourront néanmoins être modifiés avec les raccourcis créés préalablement.

  • move_to_desktop est la fonction qui va se charger de basculer l'affichage courant sur le bureau voulu.

  • sound_profile permet, selon l'application, de basculer entre le mode surround 5.1 et stéréo.
    Il permet également de définir un délai de latence pour le son.
    C'est aussi une forme de failsafe pour éviter que pulseaudio bascule sur un mode par défaut si l'ampli n'était pas allumé au démarrage.

  • sound_config est utilisé pour basculer entre différentes configuration PulseAudio.
    Cela permet d'avoir des réglages PulseAudio différent selon les applications et de changer à la volée en démarrant un nouveau service.
    La fonction prend en argument le nom du fichier de configuration à utiliser.

  • screensaver_config permet éventuellement d'utiliser xscreensaver pour certaines applications, la musique en particulier ou de le désactiver.
    La fonction prend en argument le nom du fichier de configuration à utiliser. Ou disable pour ne pas utiliser de screensaver.

#!/bin/bash

# Get the path of this script
script_dir="$(dirname "$(realpath "$0")")"

# Take as first argument the name of the service to run

service_to_start=$1
freq_change=1
sound_change=1

move_to_desktop ()
{
    local desktop=$(( $1 - 1 ))
    # Move to the indicated desktop
    wmctrl -s $desktop
}

check_app_is_running ()
{
    local binary="$1"
    ps -aux | grep --word-regexp "$binary" | grep --invert-match grep > /dev/null
}

start_app ()
{
    local app="$1"
    local binary="$2"

    if ! check_app_is_running "$binary"
    then
        echo "Run $app"
        nohup $app > /dev/null 2>&1 &
    else
        echo "$app is already running"
        # Do not change the framerate back if the app is already running.
        freq_change=0
        sound_change=0
    fi
}

start_firefox_profile ()
{
    local profile=$1
    start_app "firefox -P $profile --no-remote" "/usr/lib/firefox/firefox -P $profile"
}

screen_config ()
{
    local size=$1
    local framerate=$2
    if [ "$size" == "FHD" ]
    then
        size=1920x1080
    else # UHD
        size=3840x2160
    fi
    if [ $freq_change -eq 1 ]
    then
        xrandr --size $size --rate $framerate
    fi
}

sound_profile ()
{
    local profile=$1
    local latency=$2
    if [ "$profile" == "surround" ]
    then
        profile=5.1
    else # stereo
        profile=Stereo
    fi

    if [ $sound_change -eq 1 ]
    then
        # Get the (first) available profile
        # Gives something like output:hdmi-surround
        local profile_name=$(pacmd list-cards | grep "[^<]output:" | grep --invert-match "available: no" \
        | grep --max-count=1 "$profile" | awk '{ print $1 }' | cut -d: -f1,2)
        # Get the (first) index of the sound card
        # Gives usually 0
        local card_index=$(pacmd list-cards | grep --max-count=1 index | awk '{ print $2 }')

        # Set the profile to use
        pactl set-card-profile $card_index $profile_name

        # Set the default latency in ms
        "$script_dir/Latency.sh" $latency 1
    fi
}

sound_config () {
    local type="$1"
    # Check the current config
    if [ "$(md5sum /etc/pulse/daemon.conf | awk '{print $1}')" != "$(md5sum $HOME/Ressources/pulse_${type} | awk '{print $1}')" ]
    then
        # Do change the PulseAudio config only if not already in use.
        cp $HOME/Ressources/pulse_${type} /etc/pulse/daemon.conf
        pulseaudio --kill; sleep 2; pulseaudio --start
    fi
}

screensaver_config () {
    local type="$1"
    if [ "$type" == "disable" ]
    then
        xscreensaver-command --exit
    else
        cp $HOME/Ressources/xscreensaver_${type} $HOME/.xscreensaver
        xscreensaver-command --restart
        xscreensaver -nosplash &
    fi
}

## List of services to run with this script

case $service_to_start in
    # Kodi
    Kodi)
        echo "Start Kodi"
        start_app kodi /usr/bin/kodi
        screen_config UHD 24
        move_to_desktop 2
        sound_profile surround 0
        screensaver_config disable
        sound_config Movie
        ; ;

    # Netflix
    Netflix)
        echo "Start Netflix"
        start_firefox_profile Netflix
        screen_config FHD 60
        move_to_desktop 3
        sound_profile surround 0
        screensaver_config disable
        sound_config Movie
        ; ;

    # Molotov TV
    Molotov)
        echo "Start Molotov"
        start_app $HOME/Ressources/molotov.AppImage molotov.AppImage
        screen_config FHD 25
        move_to_desktop 4
        sound_profile surround 0
        screensaver_config disable
        sound_config Movie
        ; ;

    # VLC TV
    VLC_TV)
        echo "Start VLC for TV"
    # Kill VLC which stay stuck...
    killall -SIGKILL vlc
        start_app "/usr/bin/vlc --started-from-file $HOME/Ressources/FreeboxTV.m3u \
--fullscreen --playlist-tree --no-playlist-autostart --no-random --repeat --config $HOME/Ressources/vlc_tvrc" \
"/usr/bin/vlc.*$HOME/Ressources/FreeboxTV.m3u"
        screen_config FHD 25
        move_to_desktop 4
        sound_profile surround 0
        screensaver_config disable
        sound_config Movie
        ; ;

    # Replay TV
    Replay)
        echo "Start Replay TV"
        start_firefox_profile ReplayTV
        screen_config FHD 25
        move_to_desktop 5
        sound_profile surround 0
        screensaver_config disable
        sound_config Movie
        ; ;

    # Youtube
    Youtube)
        echo "Start Youtube"
        start_firefox_profile Youtube
        screen_config FHD 60
        move_to_desktop 6
        sound_profile surround 0
        screensaver_config disable
        sound_config Movie
        ; ;

    # Firefox
    Firefox)
        echo "Start Firefox"
        start_firefox_profile FreeBrowsing
        screen_config FHD 60
        move_to_desktop 7
        sound_profile surround 0
        screensaver_config disable
        sound_config Movie
        ; ;

    # MPD + GUI client
    Music)
        echo "Start MPD client"
        start_app cantata /usr/bin/cantata
        screen_config FHD 60
        move_to_desktop 7
        sound_profile surround 0
        screensaver_config Music
        sound_config Music
        ; ;

    *)
        echo "Service not recognized..."
        ; ;
esac

ATTENTION: Il faut utiliser 2 points-virgules à la suite sans espace. Mais WordPress ne supporte pas la syntaxe...

Pour exploiter facilement ce script, nous allons à présent créer des raccourcis sous forme de fichier desktop.
Pour ce faire, nous allons Créer un nouveau > Lien vers une application.

Dans le champs Commande : nous ajouterons

/bin/bash '/home/$USER/Launcher/Launcher.sh' Kodi

Et ainsi de suite pour chaque service souhaité.

Toutefois, à ce stade l'application ne démarre pas sur le bureau souhaité d'elle même. Pour y parvenir nous allons forcer le placement de l'application à l'aide de la configuration des fenêtres de KDE.

Configuration du système > Gestion des fenêtres > Règles de la fenêtre

Si toutes les règles spécifiques se trouve ici, pour en créer de nouvelles il est préférable, quand cela est possible, de le faire directement depuis la fenêtre concernée pour pré-remplir les champs de détection de la fenêtre concernée.

Clic droit sur l'icône de l'application en haut à gauche de la fenêtre > Actions supplémentaires > Configure Special Window Settings

De très nombreux paramètres sont disponible et dans certains cas le paramètre Plein écran peut être intéressant. Toutefois, nous allons nous intéresser uniquement au paramètre Bureau qui sera réglé sur Appliquer initialement sur le bureau souhaité.

De cette manière nous allons forcer le démarrage de chaque service sur son bureau dédié.

Pour simplifier l'usage, je proposerais chaque fois un fichier .kwinrule à importer.

- Déplacer l'indication de changement de volume qui se trouve en plein milieu de l'écran

Il est utile, mais particulièrement agaçant au milieu de l'image !

Nous pouvons le supprimer complètement:
Configuration du système > Comportement de l'espace de travail > Affiche un retour visuel lors des changements d'état

Ou alors nous pouvons le déplacer et le modifier en suivant les indications de koneko-nyaa sur reddit afin d'obtenir quelque chose comme ça.

Nous allons explorer cette solution en choisissant de placer l'OSD au centre de l'écran en haut, là où il n'y aura pas de sous-titres à gêner.

Pour ce faire, nous allons d'abord modifier l'emplacement de l'OSD dans le fichier osd.qml

sudo nano /usr/share/plasma/look-and-feel/org.kde.breeze.desktop/contents/osd/Osd.qml

Et ajouter après la ligne outputOnly: true du bloc PlasmaCore.Dialog les lignes suivantes:

    flags: Qt.X11BypassWindowManagerHint | Qt.FramelessWindowHint
    x: Math.round((Screen.desktopAvailableWidth - width) / 2)
    y: Math.round(Screen.height/50)

Ensuite, nous allons modifier le look de l'OSD pour le remplacer par quelque chose de plus discret.
Nous changeons de fichier pour osdItem.qml

sudo nano /usr/share/plasma/look-and-feel/org.kde.breeze.desktop/contents/osd/OsdItem.qml

Dans lequel nous allons modifier 4 sections.
Tout d'abord, dans le bloc Item, après la ligne property QtObject rootItem, nous allons supprimer les lignes height et width et les remplacer par:

    property int iconWidth: units.iconSizes.medium
    property int progressBarWidth: Math.round(Screen.width/1000)*100
    height: iconWidth
    width: iconWidth*2 + progressBarWidth + Math.round(Screen.width/1000)*4

Ensuite, dans le bloc PlasmaCore.IconItem, nous allons remplacer height et width par :

        height: parent.height
        width: iconWidth

Puis, dans le bloc PlasmaComponents.ProgressBar, après la ligne id: progressBar, nous ajoutons:

        width: progressBarWidth
        height: parent.height
        x: iconWidth

Il sera également nécessaire de supprimer le bloc anchors

Enfin, pour terminer, dans le bloc PlasmaExtra.Heading, nous pourrons ajouter sous id: label les lignes suivantes:

        height: parent.height
        width: rootItem.showingProgress ? iconWidth + Math.round(Screen.width/1000)*4 : progressBarWidth  + iconWidth
        x: rootItem.showingProgress ? iconWidth + progressBarWidth + 10 : iconWidth

Remplacer les lignes visible, text et maximumLineCount par:

        visible: true
        text: rootItem.showingProgress ? rootItem.osdValue : (rootItem.osdValue ? rootItem.osdValue : "")
        maximumLineCount: 1

Et supprimer le bloc anchors ainsi que les lignes wrapMode et textFormat.

Pour confirmer les changements, un rédémarrage de plasmashell est nécessaire:
Attention, n'executez pas cette dernière commande depuis SSH, plasmashell ne pourra pas démarrer sans display !

killall plasmashell; kstart5 plasmashell

Nous voilà à présent avec un OSD discret et non invasif.

Penser à faire une copie de ces 2 fichiers, les mises à jour pourraient les remplacer sans avertissement.

Les 2 fichiers, osd.qml et osdItem.qml devraient être ainsi:

// /usr/share/plasma/look-and-feel/org.kde.breeze.desktop/contents/osd/Osd.qml

import QtQuick 2.0
import QtQuick.Window 2.2
import org.kde.plasma.core 2.0 as PlasmaCore
import org.kde.plasma.components 2.0 as PlasmaComponents
import org.kde.plasma.extras 2.0 as PlasmaExtra

PlasmaCore.Dialog {
    id: root
    location: PlasmaCore.Types.Floating
    type: PlasmaCore.Dialog.OnScreenDisplay
    outputOnly: true

    flags: Qt.X11BypassWindowManagerHint | Qt.FramelessWindowHint
    x: Math.round((Screen.desktopAvailableWidth - width) / 2)
    y: Math.round(Screen.height/50)

    // OSD Timeout in msecs - how long it will stay on the screen
    property int timeout: 1800
    // This is either a text or a number, if showingProgress is set to true,
    // the number will be used as a value for the progress bar
    property var osdValue
    // Icon name to display
    property string icon
    // Set to true if the value is meant for progress bar,
    // false for displaying the value as normal text
    property bool showingProgress: false

    mainItem: OsdItem {
        rootItem: root
    }
}
// /usr/share/plasma/look-and-feel/org.kde.breeze.desktop/contents/osd/OsdItem.qml

import QtQuick 2.0
import org.kde.plasma.core 2.0 as PlasmaCore
import org.kde.plasma.components 2.0 as PlasmaComponents
import org.kde.plasma.extras 2.0 as PlasmaExtra
import QtQuick.Window 2.2

Item {
    property QtObject rootItem
    property int iconWidth: units.iconSizes.medium
    property int progressBarWidth: Math.round(Screen.width/1000)*100
    height: iconWidth
    width: iconWidth*2 + progressBarWidth + Math.round(Screen.width/1000)*4

    //  /--------------------\
    //  |      spacing       |
    //  | /----------------\ |
    //  | |                | |
    //  | |      icon      | |
    //  | |                | |
    //  | |                | |
    //  | \----------------/ |
    //  |      spacing       |
    //  | [progressbar/text] |
    //  |      spacing       |
    //  \--------------------/

    PlasmaCore.IconItem {
        id: icon
        height: parent.height
        width: iconWidth

        source: rootItem.icon
    }

    PlasmaComponents.ProgressBar {
        id: progressBar
        width: progressBarWidth
        height: parent.height
        x: iconWidth

        visible: rootItem.showingProgress
        minimumValue: 0
        maximumValue: 100

        value: Number(rootItem.osdValue)
    }

    PlasmaExtra.Heading {
        id: label

        height: parent.height
        width: rootItem.showingProgress ? iconWidth + Math.round(Screen.width/1000)*4 : progressBarWidth  + iconWidth
        x: rootItem.showingProgress ? iconWidth + progressBarWidth + 10 : iconWidth
        visible: true
        text: rootItem.showingProgress ? rootItem.osdValue : (rootItem.osdValue ? rootItem.osdValue : "")
        maximumLineCount: 1
        elide: Text.ElideLeft
        minimumPointSize: theme.defaultFont.pointSize
        fontSizeMode: Text.HorizontalFit
    }
}

Configuration audio

Le son est, avec l'image, l'un des points essentiels d'un HTPC, lorsqu'il s'agit de regarder des films en DTS ou Dolby Digital il n'est pas souhaitable d'avoir une qualité mp3 en sortie d'enceintes.
Ce n'est toutefois pas toujours aussi simple qu'il peut le sembler.

- Stéréo ou Surround

Lorsqu'il s'agit de regarder des films, il est bien souvent préférable d'opter pour un son surround, que ce soit 5.1 ou 7.1, pour la simple raison que c'est en général le format d'origine du son pour le cinéma.
En effet, les versions 2.0 ne sont, en général, qu'une réduction stéréo du mix multi-canal d'origine.

Pourtant, il n'est pas toujours simple de bénéficier d'un son 5.1 correct en sortie de son HTPC. Il y a plusieurs cas de figure à considérer:

  • Pas de barre de son ou d'ampli Hi-fi
    Que ce soit les enceintes intégrées de la TV ou de simples enceintes stéréo, il peut être préférable de garder un son stéréo.
    Autrement les enceintes pourraient ignorer les canaux supplémentaires et nous risquerions de perdre une partie des données.

    Dans ce cas de figure, il est préférable que le HTPC se charge lui même du downmix 5.1 vers 2.0 afin d'être sûr de ne rien perdre en route.

  • Barre de son ou ampli Hi-fi en HDMI ARC via la TV
    Lorsque la TV envoi le signal audio via HDMI ARC, il est fort probable que le signal soit tronqué ou downmixé vers 2.0 en raison des capacités de la TV.
    Dans ce cas, il sera nécessaire de passer le son en pass-through.
    Même dans ce cas, certaines TV peut ne pas transmettre le .1, le canal LFE du caisson de basse. Dans ce cas, il peut être utile de passer par un downmix 5.0, voir cet article: Downmix 5.1 vers 5.0 avec PulseAudio.
  • Barre de son ou ampli Hi-fi en 5.1 branché en direct
    La meilleure configuration, une connection directe entre le HTPC et le dispositif audio 5.1, de préférence en HDMI ou une autre connexion numérique à défaut.

    Ce type de configuration est à privilégier car il nous permettra de passer le signal audio directement, sans conversion, entre le HTPC et le récepteur audio 5.1.

Afin de s'assurer du bon fonctionnement de l'installation, en particulier le routage du caisson de basse, il est utile d'avoir un moyen fiable de tester l'audio.

Dans le cas d'une configuration 2.0 avec pass-through, il faudra utiliser une source contenant des canaux audio routés en 5.1, on peut trouver ce genre de contenu sur fraunhofer.

Dans le cas d'une configuration 5.1 sans pass-through, nous pouvons utiliser le test de canaux propre à Linux.
speaker-test --channels 5 --nloops 1 --test wave; speaker-test --channels 6 --speaker 6 --test pink
Cela permettra d'identifier chaque canaux successivement, et en particulier le caisson de basse.
Il est également aisé de placer cette commande dans un raccourci en fichier desktop si nécessaire.

- Audio pass-through

L'audio pass-through est une option disponible sur divers lecteurs multimédia, via pulseaudio pour Linux et sur certaines TV. Cette option permet de faire passer le signal audio au récepteur suivant sans traiter le signal.
Mais qu'est-ce que cela signifie véritablement ?

Pour bien comprendre ce qu'est l'audio pass-through, il faut bien comprendre comment fonctionne la chaine audio.

Lorsque nous regardons une vidéo, le son est encapsulé dans le conteneur multimédia, de la même manière que la vidéo, le son est encodé et compressé avec un codec audio.
Avant de pouvoir être lu sur les enceintes, le son doit passer par 2 étapes:
- Premièrement le son doit être décodé, c'est à dire que le son compressé doit être interprété à l'aide du codec correspondant pour obtenir une version numérique non compressée brute.
- Ensuite, le son décompressé doit être converti de son format numérique à un format analogique qui sera mécaniquement interprété par les enceintes.
C'est le rôle du convertisseur, le DAC.

L'audio pass-through intervient sur la première étape, si un élément de notre installation utilise pass-through, il ne décodera pas le signal audio et enverra le signal dans sa version compressée et encodée au récepteur suivant.
Il faut bien comprendre donc que le premier élément de la chaine qui n'utilise pas pass-through sera celui qui se chargera de décoder l'audio.
Cela signifie 2 choses:
Si on imagine la configuration suivante: HTPC > TV > Ampli Hi-fi
- Si le HTPC n'utilise pas pass-through, il se chargera du décodage et la TV et l'ampli recevront tout deux un signal audio numérique décompressé et décodé de type PCM.
- Si nous souhaitons que l'ampli se charge du décodage audio, le HTPC et la TV devront être configurés pour utiliser pass-through afin de transmettre le signal audio compressé et encapsulé dans son codec jusqu'à l'ampli. Ce dernier pourra alors décoder le signal.

Mais alors pourquoi utiliser ou non pass-through ? Et quel intérêt cela peut présenter ?

Il faut bien comprendre que le décodage du signal de son format encodé au format PCM est une opération informatique sans conversion.
Cela signifie que l'élément de la chaine est soit capable de le faire (il dispose du codec adéquat pour le faire), soit il n'en est pas capable. Il ne peut pas "mal" le faire.

Les seules exceptions à ce qui vient d'être dit sont les suivantes:
- Si votre HTPC est configuré en 2.0, le décodage audio fera également intervenir un dowmix pour réduire le signal à 2 canaux au lieu de 6.
De même pour un signal 7.1 et un HTPC configuré en 5.1
- Les TV ont la facheuse tendance à être configuré en stéréo, quel que soit le récepteur audio raccordé. Ce faisant, le signal est systématiquement downmixé, voir tronqué.

Il est important également de considérer que certains formats peuvent avoir des difficultés à être envoyé en pass-through.
Et également, plus problématique, le pass-through a tendance à monopoliser la carte son, ce qui peut parfois poser des difficultés si plus d'un lecteur mutimédia sont utilisés. En particulier si le lecteur précédent n'a pas libéré la carte son après usage.

La question d'utiliser pass-through dépend donc de votre matériel et de la configuration de votre installation.
Voilà quelques exemples:

  • HTPC performant et capable de supporter le décodage de la vidéo et de l'audio sans saturer le processeur.
    Pas de pass-through sur le HTPC, il décode tout et envoi un signal décompressé près à être converti par les enceintes.
  • HTPC peu performant pour lequel le décodage audio demande trop de ressources.
    On préferera utiliser pass-through et déléguer le décodage à l'ampli pour soulager le HTPC.
  • TV en HDMI ARC, optique ou autre connectique entre le HTPC et l'ampli.
    Le pass-through sur la TV n'est pas forcément fiable !
    Toutefois, si la TV recoit un signal PCM sur 6 canaux, il y a de forte chance qu'elle le réduise à une stéréo sans rien demander...

    Mon conseil en la matière, évitez de passer le signal à travers la TV !

  • Ampli disposant d'une amélioration du signal lors du décodage.
    Certains ampli Hi-fi propose une amélioration du signal lors du décodage, pour en profiter on préfera donc laisser l'ampli se charger du décodage pour bénéficier de ses améliorations.
    On utilisera donc pass-through sur le HTPC.
  • Ampli raccordé en analogique sur le HTPC ou la TV
    C'est une configuration déconseillée, en effet dès lors qu'une connection analogique intervient, cela signifie que la conversion analogique a été effectuée par le HTPC ou la TV.
    Confier la conversion analogique à la TV est sans aucun doute une très mauvaise idée...
    Quand au HTPC, sauf à disposer d'une excellente carte son, il est peu probable qu'il dispose d'un DAC de meilleure qualité que les multiples DAC de l'ampli.

En l'état actuel, PulseAudio 13 sur Ubuntu 20.04, PulseAudio n'est pas capable d'opérer correctement un signal en Pass-Through sans perdre des canaux en surround...
Dans le même temps, PulseAudio ne se contente pas de décoder le signal, il le remixe pour s'adapter au mapping des canaux actuels.
L'usage de enable-remixing = no provoque également la perte de canaux en surround...

Globalement, PulseAudio est une épine dans le pied pour un usage en haute fidélité...

- Le problème des voix inaudibles

La problème le plus commun pour quiconque a déjà regardé un film en 5.1 sur une installation 2.0 ou une barre de son frontale supportant un son surround.
Les voix sont inaudibles...

Ce problème est lié au downmix 5.1 vers 2.0, qu'il soit fait par le HTPC ou la barre de son. En effet, les dialogues sont le plus souvent uniquement sur le canal middle du 5.1, or lors du downmix, les canaux supplémentaires sont additionnés sur gauche et droite, résultant en un niveau sonore beaucoup plus élevé pour tous les effets sonores autre que les dialogues.

En réalité, ce ne sont donc pas les voix qui sont trop faibles, mais bien les autres sons qui sont trop forts car tous rassemblés sur seulement 2 canaux !

Pour remédier à ce problème, une solution simple, à condition de ne pas utiliser pass-through sur le HTPC, est de configurer ce dernier en 5.1 puis de remonter de 2 à 3db le canal middle.
Cela peut être fait à l'aide de l'utilitaire PAVUControl.

- Lorsque le son n'est pas utilisé, le HTPC produit d'affreux bruits

Un son violent, comme un énorme déchirement au milieu du silence alors qu'aucun son n'était joué sur le HTPC.
Pour les habitués, cela ressemble à un appareil débranché d'un ampli encore allumé. Et pour cause, c'est exactement ce qui se passe.

Ce bruit affreux est tout simplement un pic de tension qui se produit lorsqu'un appareil est débranché.

Le problème vient de l'économie d'énergie de la carte son qui, lorsqu'elle n'est pas utilisée, est tout simplement éteinte.
Ce n'est pas un problème avec des enceintes d'ordinateurs, mais avec un système amplifié ça devient un réel problème pour les oreilles ainsi que pour l'ampli qui n'apprécient guère l'agression soudaine.

Pour désactiver l'économie d'énergie, il y a deux choses à faire:

  • Désactiver l'économie d'énergie du côté du driver.
    Pour une carte son intel ça se situe ici:
    /sys/module/snd_hda_intel/parameters/power_save
    Un 0 à la place de 1 suffira à désactiver l'économie d'énergie.
  • Désactiver l'économie d'énergie du côté de pulseaudio
    Dans le fichier de configuration /etc/pulse/default.pa, commenter la ligne load-module module-suspend-on-idle pour désactiver l'économie d'énergie.

Après redémarrage, nous ne devrions plus subir ses aggressions sonores soudaines.

- Décalage entre le son et l'image

Même si le son et l'image arrivent en même temps, le temps de traitement de l'information peut différer et un décalage peut se produire entre l'image et le son.
Ce phénomène particulièrement désagréable peut facilement être corrigé avec Kodi ou VLC, en revanche Netflix, Youtube ou d'autres lecteurs vidéo ne proposent tout simplement aucune solution !

Pulseaudio permet d'appliquer un décalage de latence en millisecondes sur le son pour le retarder. Cela permet de décaler le son, indépendamment du lecteur utilisé pour corriger un son en avance sur l'image.

L'application du décalage de latence (Latency offset) peut se faire depuis l'onglet Advanced de l'utilitaire PAVUControl sur le périphérique de sortie audio utilisé.
Pour un usage rapide il est également possible d'utiliser la commande pactl set-port-latency-offset.

Pour en simplifier l'usage, j'utilise ce script qui permet d'augmenter, de réduire ou de remettre à zéro la latence audio sur pulseaudio.

#!/bin/bash

# Get as first argument the latency in ms
latency=$(( $1 * 1000 ))
force_value=${2:-0}

# Get the (first) index of the sound card
# Gives usually 0
card_index=$(pacmd list-cards | grep --max-count=1 index | awk '{ print $2 }')

# Get the current port
# Gives something like hdmi-output-1
port_name=$(pacmd list | grep "active port" | sed 's/.*<\(.*\)>.*/\1/')

# Get the current latency on this port
current_latency=$(pacmd list | grep --max-count=1 $port_name \
    | grep --extended-regexp --only-matching "latency offset -?[[:digit:]]* usec" | awk '{ print $3 }')

# Modify the latency
# If force_value is set, set the input value directly.
# Otherwise add to the current latency
if [ $force_value -eq 0 ]
then
    latency=$(( $current_latency + $latency ))
fi
# Even though pactl allows it, there's no way to have a negative latency
if [ $latency -lt 0 ]
then
    latency=0
fi


# Set the default latency
pactl set-port-latency-offset $card_index $port_name $latency

Pour exploiter ce script, nous allons créer des raccourcis rapide dans la barre d'outil principale en créant un Composant graphique (Widget) Lancement rapide dans lequel nous allons glisser des fichiers desktop.

Pour ce faire, nous allons Créer un nouveau > Lien vers une application.
Dans le champs Commande : nous ajouterons

Exec=/bin/bash '/home/$USER/Launcher/Latency.sh' 0 1

Pour la remise à zéro de la latence.

Exec=/bin/bash '/home/$USER/Launcher/Latency.sh' 5

Pour augmenter de 5 millisecondes la latence.

Exec=/bin/bash '/home/$USER/Launcher/Latency.sh' -5

Pour réduire de 5 millisecondes la latence.

- Son haute fidelité

Dans le cas d'une barre de son de qualité ou d'un ampli Hi-Fi, le HTPC doit être en mesure de fournir un son parfait, à la hauteur des sources utilisées.

La configuration initiale de PulseAudio, le serveur son, est orienté vers les performances, pas la qualité audio.
Il est donc préférable de reconfigurer PulseAudio pour en tirer le meilleur. Le post Son haute fidélité sur Linux avec PulseAudio détaille les réglages à opérer pour bénéficier d'un son de qualité avec PulseAudio.

Configuration de l'image

- 1080, 2160 et upscaling

Comme expliqué précédemment, Ubuntu gère nativement la résolution 4k. Il nous êtes donc possible de profiter de cette résolution.
Toutefois, un point non abordé est la problématique de l'upscaling.

En effet, si la résolution est fixée à 3840×2160, la lecture de vidéo 4k ne posera aucune difficulté, en revanche, la lecture de vidéo 1080 va demander plus de travail.
Cela pour une raison simple, une vidéo 1080 n'a pas une résolution suffisante pour être affichée correctement sur l'ensemble de l'écran. Elle doit être upscalée pour remplir l'écran.
C'est à dire tout simplement que la vidéo va être agrandie et corrigée pour que l'image ne soit pas pixelisée.

Notre HTPC ne devrait pas avoir de problème à effectuer ce travail puisqu'il est déjà capable de traiter des vidéo 4k. Mais il nous faut garder en tête que c'est une charge de travail supplémentaire sur le GPU et donc une production de chaleur supplémentaire.

Si votre HTPC présente des difficultées et surchauffe alors que vous ne jouez que des vidéos 1080, la question peut raisonnablement se poser de déléguer le travail d'upscaling à la TV qui en général fera un très bon boulot sur cet aspect.

L'utilisation du GPU peut être surveillée avec intel_gpu_top.

La charge d'opérer l'upscaling revient à la machine qui dispose de la résolution 4k. Ce sera donc le HTPC si il est configuré avec une résolution 2160, ou la TV si le HTPC est en 1080.

En revanche, si le HTPC est configuré en 1080 et que vous jouez des vidéos 4k, l'image sera downscalée à 1080 par le HTPC, puis upscalée à nouveau à 2160 par la TV.
L'image finale ne sera toutefois pas l'équivalent de la source 4k, le downscale aura détruit de manière irréversible une partie de l'image...

En cas de doute, un bon moyen de s'assurer de la résolution de l'écran est d'utiliser les Stats for nerds de Youtube, accessible par un clic droit sur n'importe quelle vidéo.
En particulier avec cette vidéo permettant de vérifier la résolution 4k: 4KUHD Scaling Test.

Les informations à surveiller sont alors, Viewport / Frames pour la résolution effectivement affichée à l'écran et Current / Optimal Rez pour la résolution de la source actuelle jouée.

On peut aussi utiliser le raccourci o dans Kodi pour connaître la résolution du média joué, ainsi que z pour la résolution actuellement affichée à l'écran.

- Motion interpolation

Motion interpolation, nommé Auto Motion Plus, Motionflow, AquoMotion, ClearFrame, Smooth Motion ou encore TruMotion ou Clear Motion Drive sont un effet de lissage des mouvements introduit dans les TV récente permettant d'attendre des fréquences de 120Hz.

Le principe de fonctionnement en est relativement simple, un film contient 24 images par secondes, la technique de motion interpolation consiste a créer des images supplémentaires qui vont s'intercaller entre chacune des 24 images pour produire 120 images par secondes.

Cette technique permet de produire des images beaucoup plus fluides, en particulier sur les mouvements rapides en évitant une saccade de l'image.

Pour un match de foot, c'est parfait, le ballon décrira un mouvement rectiligne beaucoup plus fluide.
En revanche, lorsqu'il s'agit d'interpréter et de prévoir le mouvement de nombreux objets, une explosion par exemple, cela devient beaucoup plus difficile et bien moins précis...

En particulier, le motion interpolation créer le fameux effet soap opera, ou effet caméscope. Cette désagréable impression que votre série américaine favorite ou votre film ressemble à Amour gloire et beauté ou Les Feux de l'amour.

L'industrie du cinéma utilise des caméras capturant 24 images par secondes, autant dire clairement qu'extrapoler de nouvelles images inexistantes à l'origine est une insulte au travail cinématographique et encore plus lorsque le rendu final est ainsi altéré.

Certains diront que c'est une question de préférences personnelles, je dirais que si nous souhaitons voir un film, on devrait le voir à 24 images par secondes et dans les conditions les plus proches possible de ce que le réalisateur a souhaité créer.
Il est innaceptable de garder ce mode activé pour regarder un film ou une série de qualité !

La preuve en image: Soap Opera Effect in Slow Motion

Les TV modernes disposent de nombreux réglages d'image, qui sont en général des modifications apportées à l'image source.
Si il est clair que le réglage de motion interpolation devrait toujours être désactivé, soyez également prudent avec le mode Auto Low Latency Mode (Instant Game Response chez LG) qui peut provoquer des scintillements et des sauts d'images.

Et si votre barre de son ou ampli est branché en HDMI ARC, ne pas oublier de désactiver tout les traitements sur l'entrée HDMI concernée, ce n'est pas utile et ça perturbe le signal !

- Mode FilmMaker

Parmis tout les réglages disponibles sur les TV modernes, il en est un qui est une bénédiction au milieu de la décadence.
Le mode FilmMaker est le réglage ultime du cinéfile qui désactive tout les autres, y compris le motion interpolation.

Ce mode permet avant tout de désactiver tout les traitements sur l'image et paramètre la colorimétrie, la balance des blancs et les contrastes pour obtenir une image la plus proche possible d'un rendu cinéma.

Le procédé est toutefois récent, disponible seulement sur les TV à partir de 2020, il est donc fort probable qu'il faille attendre encore un peu avant de disposer de contenus sur notre HTPC contenant les metadata nécessaire pour ajuster le mode FilmMaker.

En attendant, même sans ajustements spécifiques au contenu, le mode FilmMaker permet déjà d'obtenir une image beaucoup plus proche d'une qualité cinéma.

Voir cette image de Bram Stoker's Dracula, de Francis Ford Coppola, avec 3 mode différents.
Ce sont toutefois des photos, qui ne respectent donc pas la véritable image. Mais cela permet d'avoir une idée de la différence.

Mode Standard
Mode Cinema
Mode FilmMaker

Plus d'information sur le mode FilmMaker sur Son-Vidéo.com.

Service: Kodi

L'installation de Kodi est des plus simple, il suffit d'installer le paquet kodi.

sudo apt install kodi

Avant de s'intéresser à la configuration de Kodi, nous allons lui donner matière à travailler en lui donnant accès à une source de médias.
Les médias sont stockés sur un autre support doté d'une plus grande capacité, en l'occurrence un serveur et partagés sur le réseau local via un partage NFS.

Première étape, nous allons ajouter le support NFS.

sudo apt install nfs-common

Ensuite nous créons le dossier qui va accueillir le montage réseau.

sudo mkdir -p /media/media_kodi

Puis nous allons effectuer un premier montage réseau afin de vérifier que le montage fonctionne correctement.

sudo mount --types nfs --read-only 192.168.1.XXX:/media/data/source_media_pour_kodi /media/media_kodi/

Afin de péréniser ce montage NFS, nous allons ajouter cette ligne au fstab.

sudo nano /etc/fstab
192.168.1.XXX:/media/data/source_media_pour_kodi /media/media_kodi/       nfs     auto  0  0

A présent que Kodi est installé et fonctionnel, nous pouvons nous intéresser à sa configuration.
La configuration par défaut est globalement correcte, sauf à des réglages personnels de l'interface et des commandes.
Toutefois il nous faut ajouter la source de médias:

> Médias > Médiathèque > Vidéos > Ajouter une source de vidéos...
Nous allons chercher nos sources de médias et leur donner un nom.
Puis choisir la catégorie du dossier pour que les médias soient à la bonne place dans l'interface de Kodi.

Dans le cas où nous utilisons une résolution 2160@30Hz, le respect de la fréquence d'image de la vidéo devenant importante, il est intéressant de laisser Kodi se charger de l'opération, puisqu'il dispose de l'information.
Kodi est en effet capable d'ajuster le taux de rafraichissement de l'écran.

> Lecteur > Vidéos > Ajuster le taux de rafraîchissement d'affichage

Si ce n'est pas encore suffisant, il est également possible de synchroniser la lecture de la vidéo pour se câler très exactement sur la fréquence de l'écran déjà ajustée.

> Lecteur > Vidéos > Synchroniser la lecture avec l'affichage

- Configuration de fenêtres KDE pour Kodi

Le fichier .kwinrule pour Kodi est le suivant:

[Kodi]
Description=Kodi
desktop=2
desktoprule=2
wmclass=kodi
wmclasscomplete=false
wmclassmatch=1

- Forcer les montages NFS au démarrage

Dans le cas où la connexion réseau prend un peu de temps, il est possible que les montages NFS ne soient pas effectués correctement.
Dans ce cas, au démarrage de Kodi, nous nous confrontons au risque de voir Kodi nettoyer sa base de données de tout les médias innaccessibles et de ne pas pouvoir jouer quoi que ce soit.

Pour remédier à cet inconvénient, le plus simple est de forcer les montages NFS peu après le démarrage.
Une simple tâche cron est suffisante

sudo nano /etc/cron.d/auto_mount
# Force a mount after boot to be sure all NFS directory are mounted
@reboot root sleep 10; mount -a

Service: Netflix

Netflix ne proposant pas d'application native pour Linux, nous allons utiliser Firefox pour obtenir Netflix.
Le principal défaut ici est que Netflix sur Firefox ne permet pas de profiter du flux 4K. Espérons que cela soit corrigé avec le temps...

Il faut noter toutefois que Netflix diffuse en 24, 25 ou 30 FPS selon les sources. Ce qui oblige à changer régulièrement de fréquence de rafraîchissement si le maximum disponible est de 30Hz.

Pour connaitre le fréquence d'une vidéo Netflix, le raccourci Ctrl+Alt+Shift+D donne toutes les infos techniques, dont le frame rate.

- Profil Firefox

Afin de paramétrer Firefox pour un usage optimal avec Netflix, nous allons utiliser un profil dédié.

firefox --ProfileManager

Puis nous créons un profile nommé Netflix. Le nom importe peu en réalité, tant qu'il correspond au nom de profil dans le script Launcher.sh

Pour démarrer Firefox avec ce profil:

firefox -P Netflix --no-remote

A présent que nous avons un profil dédié, nous allons le configurer de manière adéquat.

- DRM

Netflix utilise des DRM, il faut donc autoriser Firefox à les lire.

Activer le paramètre
> Préférences > Général> Lire le contenu protégé par des DRM

- Faciliter la navigation sans molette

Naviguer dans la page peut s'avérer agaçant sans une molette, et même si nous ne pourrons pas faire complèment l'impasse sur la souris, nous pouvons faciliter le défilement avec les touches haut/bas.

Désactiver les paramètres
> Préférences > Général> Utiliser le défilement automatique
> Préférences > Général> Toujours utiliser les touches de navigation pour se déplacer à l'intérieur d'une page

Également, pour plus de comfort, activer les paramètres suivants
> Préférences > Général> Utiliser le défilement doux
> Préférences > Général> Contrôler la lecture des médias via le clavier, un casque ou l'interface virtuelle

- Netflix en page d'accueil

Puisque ce profil est dédié à Netflix, le navigateur devrait s'ouvrir directement sur la page du service.

> Préférences > Accueil > Page d'accueil et nouvelles fenêtres
Sélectionner Adresses web personalisées... et dans le champs indiquer https://www.netflix.com/fr/

- Modules complémentaires pour Firefox

  • Window Titler
    Pour commencer, afin de pouvoir identifier la fenêtre Firefox à l'aide de la configuration des fenêtres de KDE (qui pour rappel nous permettra de placer la fenêtre sur le bureau choisi) nous allons installer l'extension Window Titler.

    Dans les préférences de l'extension, nous choissirons les tags [ et ] et le Profile title Netflix. Ainsi le titre de la fenêtre commencera toujours par [Netflix].

  • Auto Fullscreen
    Ce plugin va nous permettre de forcer firefox en plein écran dés son démarrage.
  • Netflix 1080p
    Comme son nom le suggère, ce plugin permet de profiter de Netflix en Full HD sur Firefox.

- Optimisation de Firefox

Netflix est plutôt exigeant avec Firefox, il peut donc être utile d'optimiser ce profile Firefox pour en tirer le meilleur parti.

Tout d'abord, nous allons désactiver la télémétrie.

> Préférences > Vie privée et sécurité > Collecte de données par Firefox et utilisation

Puis nous allons nous assurer que le cache est régulièrement purgé.

> Préférences > Vie privée et sécurité > Historique
- Utiliser les paramètres personnalisés pour l'historique
- Vider l'historique lors de la fermeture de Firefox
- - Supprimer cache et historique

Enfin, nous allons voir la configuration profonde de Firefox dans about:config et changer les valeurs suivantes:

Désactiver le mode de lecture:

reader.parse-on-load.enabled    false

Désactiver pocket:

extensions.pocket.enabled    false

Augmenter le buffering multimedia:
Tout d'abord la taille du cache, puis la durée du buffer.

media.cache_size    1024000
media.cache_readhead_limit    600
media.cache_resume_threshold    300

- Désactivation de l'accélération matérielle

Selon le matériel et les drivers, il se peut que l'accélération matérielle par Firefox soit d'avantage un problème qu'une aide.

Si nécessaire, l'accélération matérielle se désactive ici:

> Préférences > Général > Performances
Désactiver Utiliser les paramètres de performance recommandés
Puis désactiver Utiliser l'accélération graphique matérielle si disponible

- Résoudre les problèmes de screen tearing

Le screen tearing est un décalage horizontal de l'image qui se produit le plus souvent sur les travelling.
Firefox est particulièrement affecté par ce phénomène, et plusieurs solutions sont proposées autour de la configuration des "layers" dans about:config.

Toutefois, dans mon cas et utilisant une carte graphique NVidia, la solution se trouve dans nvidia-settings, le panneau de configuration de la carte graphique.
Dans X Server Display Configuration, puis Advanced..., il suffit d'activer Force Composition Pipeline et sauvegarder les changements en quittant.
Cela va forcer la carte graphique à travailler à la place du processeur pour certaines opérations, ce qui devrait être suffisant pour résoudre tout problèmes de screen tearing.

- Configuration de fenêtres KDE pour Netflix

Le fichier .kwinrule pour Netflix est le suivant:

[Netflix Firefox]
Description=Netflix Firefox
desktop=3
desktoprule=2
title=[Netflix]\s
titlematch=2
types=1
windowrole=browser
windowrolematch=1
wmclass=navigator firefox
wmclasscomplete=true
wmclassmatch=1

- Les raccourcis Netflix

Netflix met à disposition quelques raccourcis pratiques dont voici la liste officielle.
Nous retiendrons surtout que pour passer les introductions, c'est la touche S !

Service: Live TV

Lorsqu'il s'agit de live TV le plus évident est de passer par des logiciels comme TVheadend ou MythTV et un tuner TV. Je n'en dispose toutefois pas, et la mise en place de l'IPTV avec ces 2 logiciels s'est soldé par un échec retentissant... J'ai donc choisi d'autres solutions.

Parmis les autres solutions non retenues il y avait aussi:

  • Hypnotix
    Très prometteur, mais un projet encore jeune auquel il manque de très nombreuses fonctionnalités pour être exploitable.
  • FreetuxTV
    Plus ancien et éprouvé, FreetuxTV ne dispose toutefois pas d'une interface adéquate à l'usage recherché.

- VLC

Pour un visionnage simple de la TV depuis une source IPTV, notre choix va s'arrêter sur VLC, comme souvent l'outil idéal lorsqu'il est question de vidéo.
VLC nous offre les fonctionnalitées suivantes sur les flux TV

  • Play/pause
    (Impossible toutefois de naviguer dans le flux. Le flux reste en retard sur le direct tant que la chaine n'est pas changée.)
  • Changement de chaine simple, sans usage de la souris.
  • Choix de la langue du flux TV.
  • Choix du sous-titre du flux TV.
  • Raccourcis configurables.

L'absence d'une véritable fonction de timeshifting est dommage, et doit probablement pouvoir être mise en place.
Je n'ai malheureusement pas encore trouvé la solution pour y rémedier.

Pour avoir accès aux flux TV via internet, l'IPTV, nous allons devoir nous tourner vers des playlists m3u contenant les adresses des flux TV.
Attention toutefois, la majeure partie des listes m3u pour l'IPTV qui peuvent être trouvées sur internet sont illégales.

Ce dépot github fourni des listes m3u légales pour différents pays, dont la France.
Toutefois, le moyen le plus sûr d'obtenir une liste m3u bien fournie de chaines TV en toute légalité est de se tourner vers son fournisseur d'accès.
Pour ma part c'est Free, qui est à ce jour sans aucun doute le FAI le plus accommodant sur ce point.

Free fourni à ses abonnés la liste http://mafreebox.freebox.fr/freeboxtv/playlist.m3u

Pour accéder aux chaines des groupes TF1 (TF1, TMC, TFX, TF1 Séries Films et LCI) et M6 (M6, W9 et 6ter) il vous faudra connecter l'antenne au décodeur TV Free et faire une recherche de chaine. Autrement les chaines ne seront pas disponibles en IPTV...

Cette liste Free représente près de 700 chaines, dont de nombreux doublons en raison des flux de différentes qualité et des chaines payantes innaccessible sans abonnement supplémentaire.
Ce faisant, il est plus que conseillé de créer un fichier m3u personnalisé avec les chaines souhaitées et la qualité souhaitée pour chacune d'elle.
Nous aurons ainsi une liste de chaines limitées aux seules chaines usuellement visionnées.

Cela fait, nous allons créer un fichier de configuration VLC spécifique à cet usage.
Il sera ainsi possible de configurer cette instance de VLC indépendamment de l'instance commune.

cp -a $HOME/.config/vlc/vlcrc $HOME/vlcTVrc

A présent, il nous suffit de démarrer VLC en spécifiant les options souhaitées au démarrage.

/usr/bin/vlc ./PlaylistTV.m3u --fullscreen --playlist-tree --no-playlist-autostart --no-random --repeat --config $HOME/vlcTVrc
  • -fullscreen
    Démarre immédiatement en plein écran.
  • -playlist-tree
    Affiche la playlist au démarrage.
  • -no-playlist-autostart
    Ne démarre pas automatiquement la lecture, nous démarrerions autrement toujours sur le premier flux de la liste.
  • -no-random
    Désactive le mode aléatoire, pour pouvoir zapper facilement d'un flux au suivant ou au précédent.
  • -repeat
    Répète le media en cours, pour éviter de changer de flux de manière intempestive.
  • -config $HOME/vlcTVrc
    Utilise un fichier de configuration alternatif.

- Fixer les sauts d'images

VLC peut souffrir de quelques sauts d'images réguliers. Si tel est le cas, il peut être utile de changer la configuration de la sortie vidéo.

> Outils > Préférences > Vidéo > Output
Sortie vidéo "Sortie vidéo X11 (XCB)" donne de bons résultats.

> Outils > Préférences > Vidéo > Deinterlacing
Régler sur Oui et choisir le mode Yadif (2x).

- Configuration de fenêtres KDE pour VLC

Le fichier .kwinrule pour VLC est le suivant:

[VLC TV]
Description=VLC TV
desktop=4
desktoprule=2
title=Lecteur multimédia VLC
titlematch=1
types=1
windowrole=vlc-main
windowrolematch=1
wmclass=vlc
wmclasscomplete=false
wmclassmatch=1

- Molotov TV

Molotov TV est un fournisseur IPTV français qui propose gratuitement un accès à 36 chaines avec le contrôle du direct ainsi qu'un accès au Replay.

Il est nécessaire toutefois de créer un compte sur la plateforme, même pour l'accès gratuit.

Molotov propose également de nombreux packs payants pour obtenir d'avantage de contenu.

La plateforme propose un fichier AppImage, qui ne nécessite donc aucune installation.
Après téléchargement, il faut toutefois le rendre executable. C'est tout ce que nous avons à faire pour cette application.

Molotov est intéressant à l'usage et permet un véritable contrôle du direct ainsi qu'un accès aux différents Replay des chaines.

Toutefois, l'application est peu adapté à l'usage avec une télécommande et n'a de cesse d'insister pour un compte premium ou autre abonnements.
On ne pouvait en attendre moins d'un tel service...

- Configuration de fenêtres KDE pour Molotov TV

Le fichier .kwinrule pour Molotov TV est le suivant:

[Molotov]
Description=Molotov
desktop=4
desktoprule=2
title=Molotov
titlematch=1
wmclass=molotov
wmclasscomplete=false
wmclassmatch=2

Service: Replay TV

Comme vu précédemment, Molotov TV est une solution pour avoir accès aux Replay de nombreuses chaines depuis un seul et même endroit.

Si toutefois, nous ne souhaitons pas passer par cette application et sa création de compte obligatoire, il nous est possible de simplement utiliser Firefox et nous rendre sur les sites de chaque chaines souhaitées.

- Profil Firefox

Comme pour Netflix, nous allons créer un profil dédié à l'usage de Firefox pour les Replay TV.

firefox --ProfileManager

Puis nous créons un profile nommé ReplayTV. Encore une fois, le nom doit simplement correspondre à celui indiqué dans le script Launcher.sh

Pour démarrer Firefox avec ce profil:

firefox -P ReplayTV --no-remote

A présent que nous avons un profil dédié, nous allons le configurer de manière adéquat.

- Faciliter la navigation sans molette

Nous facilitons le défilement avec les touches haut/bas.

Désactiver les paramètres
> Préférences > Général> Utiliser le défilement automatique
> Préférences > Général> Toujours utiliser les touches de navigation pour se déplacer à l'intérieur d'une page

Également, pour plus de comfort, activer les paramètres suivants
> Préférences > Général> Utiliser le défilement doux
> Préférences > Général> Contrôler la lecture des médias via le clavier, un casque ou l'interface virtuelle

- Page d'accueil Firefox par défaut

Plutôt que d'ouvrir chaque fois sur un site d'une chaine, il est préférable d'avoir une page permettant un accès rapide aux différents sites.
La page d'accueil par défaut de Firefox fait très bien ce travail.

> Préférences > Accueil > Page d'accueil et nouvelles fenêtres
Sélectionner Page d'accueil de Firefox (par défaut)

Puis juste en dessous, nous allons paramétrer cette page d'accueil.

Sites les plus visités
1 ligne, ou d'avantage si la place manque.

Éléments-clés
4 lignes et nous gardons uniquement Marques pages. Cela nous permettra de mettre de côté facilement les émissions à voir.

- Modules complémentaires pour Firefox

  • Window Titler
    Afin de pouvoir identifier la fenêtre Firefox à l'aide de la configuration des fenêtres de KDE (qui pour rappel nous permettra de placer la fenêtre sur le bureau choisi) nous allons installer l'extension Window Titler.

    Dans les préférences de l'extension, nous choissirons les tags [ et ] et le Profile title ReplayTV. Ainsi le titre de la fenêtre commencera toujours par [ReplayTV].

- Optimisation de Firefox

Il n'est pas nécessaire de dégraisser Firefox de la même manière que pour Netflix, qui est beaucoup plus exigeant.
Toutefois, augmenter la taille du cache vidéo est toujours utile.

Dans la configuration de Firefox, about:config, changer les valeurs suivantes:

Augmenter le buffering multimédia:
Toute d'abord la taille du cache, puis la durée du buffer.

media.cache_size    1024000
media.cache_readhead_limit    600
media.cache_resume_threshold    300

- Désactivation de l'accélération matérielle

Ainsi qu'expliqué avec Netflix, Firefox s'en sort parfois bien mieux sans l'accélération matérielle. Nous pouvons donc la désactiver ici:

> Préférences > Général > Performances
Désactiver Utiliser les paramètres de performance recommandés
Puis désactiver Utiliser l'accélération graphique matérielle si disponible

- Configuration de la page d'accueil de Firefox

La page d'accueil de Firefox est pleine de services indésirables, Facebook, Amazon et autre Google...
La première chose à faire est de s'en débarrasser !

En haut à droite de chaque vignette, un petit menu est disponible. Il nous permettra de Retirer les indésirables.

Cela fait, nous pourrons ajouter un Nouveau Site populaire pour chaque service de Replay que nous souhaitons avoir.
L'ajout manuel va automatiquement épingler ces sites. Ils resteront donc en place.

- Configuration de fenêtres KDE pour le Replay TV sur Firefox

Le fichier .kwinrule pour ReplayTV est le suivant:

[ReplayTV Firefox]
Description=ReplayTV Firefox
desktop=5
desktoprule=2
title=[ReplayTV]\s
titlematch=2
types=1
windowrole=browser
windowrolematch=1
wmclass=navigator firefox
wmclasscomplete=true
wmclassmatch=1

Service: Youtube

Je n'aime pas Youtube...
Mais je ne peux nier la richesse de sa collection de vidéos, qui n'a pas d'égales.
Heureusement, pour le moment du moins, il n'est pas nécessaire d'avoir un compte Google pour regarder le contenu de Youtube.

- Profil Firefox

Comme pour Netflix, nous allons créer un profil dédié à l'usage de Firefox pour Youtube

firefox --ProfileManager

Puis nous créons un profile nommé Youtube. Encore et toujours, le nom doit simplement correspondre à celui indiqué dans le script Launcher.sh

Pour démarrer Firefox avec ce profil:

firefox -P Youtube --no-remote

A présent que nous avons un profil dédié, nous allons le configurer de manière adéquat.

- Faciliter la navigation sans molette

Nous facilitons le défilement avec les touches haut/bas.

Désactiver les paramètres
> Préférences > Général> Utiliser le défilement automatique
> Préférences > Général> Toujours utiliser les touches de navigation pour se déplacer à l'intérieur d'une page

Également, pour plus de comfort, activer les paramètres suivants
> Préférences > Général> Utiliser le défilement doux
> Préférences > Général> Contrôler la lecture des médias via le clavier, un casque ou l'interface virtuelle

- Page d'accueil Firefox par défaut

Pour s'épargner la page d'accueil de Youtube, toujours rempli de vidéos sans le moindre intérêt, nous allons garder la page d'accueil par défaut de Firefox.

> Préférences > Accueil > Page d'accueil et nouvelles fenêtres
Sélectionner Page d'accueil de Firefox (par défaut)

Puis juste en dessous, nous allons paramétrer cette page d'accueil.

Sites les plus visités
1 ligne.

Éléments-clés
4 lignes et nous gardons uniquement Marques pages.
De cette manière, nous allons pouvoir mettre de côté les vidéos à voir et les chaines dignes d'intérêt que nous souhaitons suivre.

- Modules complémentaires pour Firefox

  • Window Titler
    Afin de pouvoir identifier la fenêtre Firefox à l'aide de la configuration des fenêtres de KDE (qui pour rappel nous permettra de placer la fenêtre sur le bureau choisi) nous allons installer l'extension Window Titler.

    Dans les préférences de l'extension, nous choissirons les tags [ et ] et le Profile title Youtube. Ainsi le titre de la fenêtre commencera toujours par [Youtube].

  • Enhancer for Youtube
    Ce plugin très utile va permettre de configurer différents aspects de Youtube et de garder un meilleur contrôle sur le comportement de l'interface.

  • Privacy Badger
    Indispensable sur un service Google, des filtres pour limiter les fuites d'informations sur nos activités.
    Je n'en ai pas parlé pour les autres profils, car c'est un choix personnel.
    Toutefois, sur l'ensemble des profils, sauf Netflix qui n'utilise pas de trackers, j'utilise une collection d'indispensables en plus de Privacy Badger:

- Optimisation de Firefox

Il n'est pas nécessaire de dégraisser Firefox de la même manière que pour Netflix, qui est beaucoup plus exigeant.
Toutefois, augmenter la taille du cache vidéo est toujours utile.

Dans la configuration de Firefox, about:config, changer les valeurs suivantes:

Augmenter le buffering multimédia:
Toute d'abord la taille du cache, puis la durée du buffer.

media.cache_size    1024000
media.cache_readhead_limit    600
media.cache_resume_threshold    300

- Désactivation de l'accélération matérielle

Ainsi qu'expliqué avec Netflix, Firefox s'en sort parfois bien mieux sans l'accélération matérielle. Nous pouvons donc la désactiver ici:

> Préférences > Général > Performances
Désactiver Utiliser les paramètres de performance recommandés
Puis désactiver Utiliser l'accélération graphique matérielle si disponible

- Configuration de la page d'accueil de Firefox

De la même manière que pour le profil ReplayTV, il peut être utile de nettoyer les indésirables, puis d'épingler Youtube et éventuellement les chaines principales suivies.

- Configuration de fenêtres KDE pour Youtube

Le fichier .kwinrule pour Youtube est le suivant:

[Youtube Firefox]
Description=Youtube Firefox
desktop=6
desktoprule=2
title=[Youtube]\s
titlematch=2
types=1
windowrole=browser
windowrolematch=1
wmclass=navigator firefox
wmclasscomplete=true
wmclassmatch=1

Service: Firefox tout usage

Puisque chacun des profils Firefox précédent sont spécifiquement configurés pour nos différents usages, il est utile d'avoir un profil pour d'autres activités.

- Profil Firefox

Comme pour Netflix, nous allons créer un profil dédié aux autres usages.

firefox --ProfileManager

Puis soit nous créons un profile dédié, soit nous utilisons le profil default

Pour démarrer Firefox avec ce profil:

firefox -P default --no-remote

- Faciliter la navigation sans molette

Nous facilitons le défilement avec les touches haut/bas.

Désactiver les paramètres
> Préférences > Général> Utiliser le défilement automatique
> Préférences > Général> Toujours utiliser les touches de navigation pour se déplacer à l'intérieur d'une page

Également, pour plus de comfort, activer les paramètres suivants
> Préférences > Général> Utiliser le défilement doux
> Préférences > Général> Contrôler la lecture des médias via le clavier, un casque ou l'interface virtuelle

- Modules complémentaires pour Firefox

  • Window Titler
    Afin de pouvoir identifier la fenêtre Firefox à l'aide de la configuration des fenêtres de KDE (qui pour rappel nous permettra de placer la fenêtre sur le bureau choisi) nous allons installer l'extension Window Titler.

    Dans les préférences de l'extension, nous choissirons les tags [ et ] et le Profile title Free Browsing. Ainsi le titre de la fenêtre commencera toujours par [Free Browsing].

- Optimisation de Firefox

Nous pouvons raisonnablement imaginer que ce profil servira également à regarder des vidéos. Nous augmentons donc la taille du cache vidéo.

Dans la configuration de Firefox, about:config, changer les valeurs suivantes:

Augmenter le buffering multimédia:
Toute d'abord la taille du cache, puis la durée du buffer.

media.cache_size    1024000
media.cache_readhead_limit    600
media.cache_resume_threshold    300

- Désactivation de l'accélération matérielle

Ainsi qu'expliqué avec Netflix, Firefox s'en sort parfois bien mieux sans l'accélération matérielle. Nous pouvons donc la désactiver ici:

> Préférences > Général > Performances
Désactiver Utiliser les paramètres de performance recommandés
Puis désactiver Utiliser l'accélération graphique matérielle si disponible

- Configuration de fenêtres KDE pour Firefox

Le fichier .kwinrule pour Firefox est le suivant:

[Firefox]
Description=Firefox
desktop=7
desktoprule=2
title=[Free Browsing]\s
titlematch=2
types=1
windowrole=browser
windowrolematch=1
wmclass=navigator firefox
wmclasscomplete=true
wmclassmatch=1

Service: MPD

Puisque le HTPC est à présent équipé d'enceintes de qualité et que PulseAudio est configuré pour en tirer le meilleur parti, il serait dommage de ne pas en profiter pour écouter mes musiques.

L'installation de MPD est très simple

sudo apt install mpd

Toutefois il ne sera pas fonctionnel dans un premier temps...

  • Source audio

Tout d'abord, nous allons lui fournir une source de médias, à l'instar de Kodi ce sera un partage NFS.

Nous allons donc lui dédier un nouveau dossier pour le montage NFS.

sudo mkdir -p /media/media_mpd

Puis nous allons tester le montage réseau.

sudo mount --types nfs --read-only 192.168.1.XXX:/media/data/source_media_pour_mpd /media/media_mpd/

Afin de péréniser ce montage NFS, nous ajouterons cette ligne au fstab.

sudo nano /etc/fstab
192.168.1.XXX:/media/data/source_media_pour_mpd /media/media_mpd/       nfs     auto  0  0

- Configuration de MPD

La configuration de MPD se trouve dans /etc/mpd.conf

Tout d'abord, il nous faut indiquer à MPD où trouver ses sources. Par défaut il regarde dans /var/lib/mpd/music, nous allons changer cela

music_directory         "/media/media_mpd"

La configuration par défaut permet uniquement de connecter des clients sur la même machine, si l'usage local n'est pas à exclure, nous souhaitons également pouvoir connecter des clients distants.
Pour cela, nous allons ajouter une seconde ligne bind_to_address en plus de localhost, qui permettra une écoute sur l'adresse local du HTPC.

bind_to_address "192.168.1.XXX"

Et pour des questions de confort d'écoute, j'active ReplayGain en mode auto.

replaygain                     "auto"

Nous pouvons à présent redémarrer MPD et connecter un client, local ou distant.

sudo systemctl restart mpd

Et découvrir avec désarroi que MPD refuse de jouer quoi que ce soit...
Il s'avère que si MPD fonctionne parfaitement avec ALSA, il n'en est pas de même avec PulseAudio...

- MPD et PulseAudio

Tout d'abord, MPD n'est pas configuré pour utiliser PulseAudio, il faut le lui dire dans sa configuration.

Pour commencer, commentons la section audio_output pour ALSA

#audio_output {
#  type        "alsa"
#  name        "My ALSA Device"
#  device      "hw:0,0"    # optional
#  mixer_type      "hardware"      # optional
#  mixer_device    "default"   # optional
#  mixer_control   "PCM"       # optional
#  mixer_index "0"     # optional
#}

Puis nous décommentons la section pour PulseAudio, un peu plus bas.

audio_output {
    type        "pulse"
    name        "My Pulse Output"
    mixer_type      "software"
#  server      "remote_server"     # optional
#  sink        "remote_server_sink"    # optional
}

Toutefois, PulseAudio travaille séparément pour chaque utilisateur, lors du démarrage de la session il est donc démarré pour l'usage de l'utilisateur connecté.
Or MPD démarre par défaut sur l'utilisateur mpd et donc essaye de démarrer son propre serveur PulseAudio, ce qui n'est pas permis dans la configuration par défaut. En résulte un échec de MPD de jouer un quelconque son...

La première chose à faire est donc de faire travailler MPD avec notre utilisateur.
Cela se fait très simplement en modifiant sa configuration.

user                            "Your_user_name"

Cela étant, les fichiers de MPD étant situés dans /var/lib/mpd, il appartient donc soit de changer le propriétaire de ce dossier

sudo chown Your_user_name: -R /var/lib/mpd

Soit, et c'est la solution que je préfère, déplacer ce dossier en espace utilisateur.

sudo cp -a /var/lib/mpd /home/Your_user_name/mpd
sudo chown Your_user_name: -R /home/Your_user_name/mpd

Le cas échéant il faudra en revanche modifier la configuration de MPD pour qu'il trouve son dossier à la bonne place.

playlist_directory              "/home/Your_user_name/mpd/playlists"
db_file                         "/home/Your_user_name/mpd/tag_cache"
log_file                        "/home/Your_user_name/mpd/mpd.log"
pid_file                        "/home/Your_user_name/mpd/pid"
state_file                      "/home/Your_user_name/mpd/state"
sticker_file                    "/home/Your_user_name/mpd/sticker.sql"

Malheureusement, après redémarrage de MPD, celui-ci n'est toujours pas capable de jouer un quelconque son... Car il ne sait pas où trouver PulseAudio.
Pour lui indiquer où trouver PulseAudio, nous allons renseigner la valeur XDG_RUNTIME_DIR dans le fichier /etc/default/mpd

echo -e "\nXDG_RUNTIME_DIR=/run/user/1000" | sudo tee -a /etc/default/mpd

1000 correspond à l'UID usuel de votre utilisateur principal, vous pouvez toutefois vérifier cette valeur avec la commande id -u user

A présent, après redémarrage, MPD devrait être capable de jouer la musique en utilisant PulseAudio et ainsi utiliser les enceintes du HTPC.

- Suspendre la mise en veille tant que la musique est jouée

Toutefois, suite à la configuration effectuée sur le HTPC, celui-ci se mettra de lui-même en veille si il est inactif.
Or, jouer de la musique en arrière plan n'est pas considéré comme une activité... Donc le HTPC se mettra en veille tandis que MPD joue de la musique.
Ce n'est pas le comportement souhaité, donc nous allons simuler une activité tant que de la musique est jouée pour éviter la mise en veille.

Pour y parvenir, nous allons surveiller l'activité de PulseAudio et en particulier les entrées audio de celui-ci, indicateur d'une source audio active envoyant un flux à traiter à PulseAudio.

pacmd list-sink-inputs | grep state:

Cette commande renverra "state: RUNNING" si une source quelconque est active, mais restera silencieuse si aucun son n'est produit. C'est donc un moyen fiable de savoir si le HTPC joue de la musique ou un autre son.

Pour simuler une activité sur l'ordinateur, nous utiliserons l'utilitaire xdotool, qui permet de simuler des touches du clavier ou des mouvements de souris.

sudo apt install xdotool

A présent, il nous suffit d'ajouter le test de l'audio ainsi qu'une simulation de touche de clavier dans une tâche cron.

sudo nano /etc/cron.d/do_not_sleep_audio
*/10 * * * *    Your_user_name    XDG_RUNTIME_DIR=/run/user/1000 pacmd list-sink-inputs | grep --quiet state: && DISPLAY=:0 xdotool key F15

xdotool étant un outil interagissant avec Xorg, il a besoin de pouvoir communiquer avec ce dernier, c'est pourquoi tout d'abord, la tâche cron doit être exécutée avec le même utilisateur que la session en cours.
Ensuite, il faut indiquer à xdotool le DISPLAY Xorg sur lequel il doit agir. En général le DISPLAY est 0, mais pour le vérifier on peut simplement exécuter echo $DISPLAY depuis l'écran connecté.

Enfin, pour ne pas perturber le visionnage de film ou tout autre activité, j'ai choisi la touche F15, qui n'existe pas physiquement et n'a aucun effet.

- Configuration de fenêtres KDE pour MPD

MPD est une application serveur sans interface.
Mais s'agissant d'un HTPC, il peut être intéressant d'avoir un client graphique local pour interagir avec MPD.
Le site de MPD propose une liste de clients.
Pour ma part j'ai choisi Cantata.

Le fichier .kwinrule pour le client de MPD est le suivant:

[MPD_client]
Description=Cantata
desktop=7
desktoprule=7
wmclass=cantata
wmclasscomplete=false
wmclassmatch=1

Backup automatique

Car nous n'avons pas envie de tout refaire en cas de problème, un backup est indispensable.
Il existe toute sortes de solutions pour un backup efficace, je vais choisir une solution personnelle que j'utilise régulièrement. Archivist.

Les détails de la configuration sont spécifiques au logiciel utilisé.
Ce qui importe c'est de sauvegarder au moins la configuration utilisateur et les configurations des applications. Donc principalement le dossier /home/$USER
Nous pouvons également sauvegarder les configurations supplémentaires dans le système qui ne se trouvent pas dans $HOME.

Toutefois, quelque soit le choix du logiciel d'archivage, il reste un problème de taille. Comment être sûr que le HTPC sera allumé au moment où il devra faire un backup ?
Le meilleur moyen d'en être sûr est de le forcer à se réveiller au bon moment.

- Réveil du HTPC pour le backup

Pour réveiller un ordinateur en veille, en hibernation ou complètement éteint, nous allons utiliser l'alarme RTC.

echo "$(date "+%s" -d "+ 5 minutes")" | sudo tee /sys/class/rtc/rtc0/wakealarm

Cette commande réveillera l'ordinateur 5 minutes plus tard.
Nous allons nous servir de cette commande pour réveiller notre HTPC à temps pour ses backups réguliers.

rtcwake peut également être utilisé, mais il ne permet pas de programmer un réveil sans être affecté par un réveil manuel.
En effet, dans l'exemple précédent, si la machine est réveillée puis remise en veille avant le délai de 5 minutes, rtcwake ne la réveillera pas.

Nous verrons toutefois par la suite que même cette méthode n'est pas infaillible.

- Planification du backup

Pour planifier les backups, nous allons simplement utiliser cron.
Un fichier backup dans /etc/cron.d fera le travail.

Le backup serait donc exécuté, par exemple, tout les 3 jours à 4h du matin.

Toutefois, afin d'être sûr que l'ordinateur soit démarré, nous devons également programmer un réveil régulier avec RTC juste avant que le backup ne soit démarré.

Ainsi, RTC reprogrammerait un réveil tout les 3 jours pour 3 jours plus tard 5 minutes avant l'exécution suivante de la tâche cron.

Toutefois, cron ne calcul pas les jours en ajoutant simplement 3 jours à la date actuelle, il détermine un planning en démarrant toujours au 1er de chaque mois.
Ceci nous oblige donc à compter de la même manière pour que RTC réveille l'ordinateur au bon moment.

- Empêcher la mise en veille durant le backup

Notre backup est presque prêt à être mis en route, un seul point délicat subsiste. Si le backup est trop long à s'exécuter, notre HTPC pourrait se remettre en veille avant la fin du backup.
Pour éviter cela, nous allons utiliser systemctl mask sleep.target pour suspendre la mise en veille le temps du backup.

Toutes ces complications nous amènent à construire un script qui sera en charge de toutes les opérations pour automatiser notre backup:

#!/bin/bash

# frequency of the backup, number of days between each.
# ! This have to match the cron task !
days_frequency=3
hour="03:55am"

# Get the path of this script
script_dir="$(dirname $(realpath $0))"

get_next_backup_execution ()
{
    # Get the current day
    current_day=$(date '+%d')

    # Get the last day of the month
    last_day_of_month=$(date -d "-$(date +%d) days +1month" +%d)

    # Get the number of past executions for the current month
    past_exec=$((($current_day-1) / $days_frequency + 1))
    # Get the date of the last execution
    last_exec=$(( $days_frequency*($past_exec-1)+1 ))
    # Get the date of the next execution
    next_exec=$(( ($last_exec+$days_frequency) ))
    # Set the next execution to 1st if it goes on next month
    if [ $next_exec -gt $last_day_of_month ]; then next_exec=1; fi
    # Get the number of days before the next execution
    plus_days=$(( $next_exec - $current_day))
    # Fix the number of days if it goes on next month
    if [ $plus_days -lt 0 ]; then plus_days=$(($plus_days + $last_day_of_month)); fi

    # Return the value for rtcwake in number of days to the next wakeup
    echo "$plus_days"
}

# Remove any previous wake alarm
sudo rtcwake --mode disable
# Set the wake alarm with RTC
echo "$(date "+%s" -d "$hour + $(get_next_backup_execution) days")" | sudo tee /sys/class/rtc/rtc0/wakealarm > "$script_dir/wakealarm"

# Prevent automatic suspend while working on the backup
sudo systemctl mask sleep.target

# Do backup the system
sudo "$script_dir/archivist/archivist.sh"

# Authorize automatic suspend
sudo systemctl unmask sleep.target

# To read the next planned execution, use that command
# date +"%d-%m-%Y %H:%M:%S" -d @$(cat wakealarm)

days_frequency représente donc la fréquence de backup, ici tout les 3 jours.

hour représente l'heure de réveil de l'ordinateur pour effectuer le backup. De préférence au moins 5 minutes avant le backup lui-même.

get_next_backup_execution est la fonction qui va se charger de calculer la date de la prochaine exécution, en calculant de la même manière que cron.

Finalement, systemctl mask sleep.target est utilisé pour mettre en pause la mise en veille, le temps du backup.
Puis tout est remis en ordre et l'ordinateur pourra retourner en veille.

Il reste toutefois un seul problème, même en renseignant directement /sys/class/rtc/rtc0/wakealarm, rtc peut perdre la date du prochain réveil lors des incessants réveils et redémarrages que peut subir le HTPC dans son usage habituel.
Pour pallier ce problème, nous allons utiliser la copie faites dans le fichier local wakealarm pour forcer la valeur de /sys/class/rtc/rtc0/wakealarm à chaque démarrage.

Tout cela peut maintenant être placé dans une tâche cron simple.

sudo nano /etc/cron.d/backup
# Reinject wakealarm at each boot
@reboot root sleep 60;cat /home/USER/Backup/wakealarm > /sys/class/rtc/rtc0/wakealarm
# Execute the backup. This have to match the backup script !
0 4 */3 * * root /home/USER/Backup/Backup.sh | tee -a /home/USER/Backup/backup.log 2>&1

Pour démarrer l'automatisation, ou la relancer si nécessaire, une première exécution du script est nécessaire.

sudo /home/USER/Backup/Backup.sh