Blog Haypo

Aller au contenu | Aller au menu | Aller à la recherche

dimanche 27 décembre 2009

Cette grosse plaie de PulseAudio

PulseAudio est un serveur sonore visant à simplifier la lecture de son sur le bureau. Il remplace le vieux Esound (ESD). Il permet d'envoyer le son sur les hauts parleurs d'un autre ordinateur, d'utiliser plusieurs cartes son, prend en charge les oreilettes bluetooth, gère la consommation d'énergie, etc. Sur le papier, ça semble super : relire Why you should care about PulseAudio (and how to start doing it) pour s'en convaincre. Par contre, en pratique c'est une grosse plaie : PulseAudio rajoute une couche entre les applications et ALSA qui consomme du temps processeur, de la mémoire, et (dans mon cas) dégrade la qualité du son (rajoute des petits pics sonores).

Problèmes liés à PulseAudio sur un Eee PC (Fedora 11)

En particulier, sur mon Eee PC (1101 HA) équipé de Fedora 11 : mplayer est incapable de lire une vidéo (le film Sympathy for Lady Vengeance) bien que mon processeur graphique (la célèbre puce Poulsbo) accélère grandement le décodage de l'image. Dans les logs noyaux (/var/log/messages), j'ai pu voir que PulseAudio tente de rattraper la situation :

Nov 15 23:07:57 maggie pulseaudio[6894]: alsa-sink.c: Increasing minimal latency to 1,00 ms
Nov 15 23:16:27 maggie pulseaudio[6894]: alsa-sink.c: Increasing minimal latency to 2,00 ms
Nov 15 23:16:50 maggie pulseaudio[6894]: alsa-sink.c: Increasing minimal latency to 4,00 ms
Nov 15 23:20:43 maggie pulseaudio[6894]: alsa-sink.c: Increasing minimal latency to 8,00 ms
Nov 15 23:20:48 maggie pulseaudio[6894]: alsa-sink.c: Increasing minimal latency to 16,00 ms
Nov 15 23:21:19 maggie pulseaudio[6894]: alsa-sink.c: Increasing minimal latency to 26,00 ms
Nov 15 23:22:03 maggie pulseaudio[6894]: alsa-sink.c: Increasing wakeup watermark to 15,99 ms
Nov 15 23:37:22 maggie pulseaudio[6894]: alsa-sink.c: Increasing minimal latency to 36,00 ms
Nov 15 23:37:37 maggie pulseaudio[6894]: alsa-sink.c: Increasing wakeup watermark to 25,99 ms
Nov 15 23:43:03 maggie pulseaudio[6894]: alsa-sink.c: Increasing minimal latency to 46,00 ms

Toutes à 5 à 10 minutes, le son finit par sauter et mplayer se fige. J'ai trouvé un contournement : revenir un peu en arrière puis aller un peu en avant (touches gauche puis droite).

Solution : passer directement par ALSA

Après trois coupures dans mon film (c'est-à-dire après un quart d'heure), j'ai fini par me décider à le couper et à chercher à résoudre ce problème énervant. J'ai vu que Mplayer utilisait PulseAudio. J'ai alors essayé l'option « -ao alsa » (-ao : Audio Output), mais mplayer utilisait quand même PulseAudio. Bizarre.

En regardant la configuration ALSA, j'ai vu dans le fichier /etc/alsa/pulse-default.conf :

# Let's make it the default!
pcm.!default {
    type pulse
    ...
}

Donc PulseAudio est configuré pour être le pilote par défaut. J'ai supprimé ce fichier et j'ai redémarré la machine (vu que PulseAudio a trituré ALSA, j'ai préféré tout réinitialiser).

Après le redémarrage, j'ai relancé mon film et j'ai pu le voir jusqu'au bout sans la moindre coupure !

Utilisation du processeur

  • mplayer -ao pulse : le processus pulseaudio utilise 20% du CPU, et au total 20 à 25% du CPU est utilisé
  • mplayer -ao alsa : le processus pulseaudio n'est plus solicité (et n'est donc plus visible dans top), et au total 5 à 10% du CPU est utilisé

Réglage du volume

Avec PulseAudio, alsamixer (et autres mixeurs de sons) n'affiche qu'une seule sortie. Il faut utiliser « alsamixer -c 0 » pour que je puisse avoir accès à toutes les sorties. En particulier, ça me permet de régler le volume du casque, chose nécessaire car le volume est insuffisant.

Problèmes liés à PulseAudio qu'ont d'autres utilisateurs

Lors de la migration à PulseAudio, pas mal d'applications ne fonctionnaient plus (le son en tout cas). Flash et Skype supportent aujourd'hui PulseAudio (Flash 10+ et Skype 2.1+), par contre Audacity ne le supporte toujours pas. Les jeux utilisant la bibliothèque SDL (ex: l'excellent xmoto) ont également des problèmes. Correction : SDL 1.2.12 a un pilote natif pour PulseAudio.

Complaintes :

Le démon PulseAudio a besoin de tourner en priorité temps réel (SCHED_FIFO). Or il faut être root pour cela. Une faille de sécurité dans PulseAudio a déjà servi pour exploiter des failles du noyau Linux (2.6.30, 2.6.31, 2.6.32), notamment via la boîte à outils de Brad Spengler.

Conclusion

Sympathy for Lady Vengeance est un excellent film ! Il fait parti de trilogie sur la vengeance du sud-coréen Park Chan-wook. La fin est bien gore, j'adore :-)

Pour PulseAudio, c'est plutôt mauvais signe étant donné qu'il est activé par défaut sur Ubuntu, Fedora et Mandriva. Bien que j'ai du mal à voir l'intérêt de PulseAudio, il doit bien en avoir un pour que les distributions bureaux majeures l'activent par défaut. Par contre, il serait bon de donner le choix de désactiver complètement PulseAudio le temps que le code soit stabilisé.

dimanche 6 décembre 2009

Nettoyage de clavier

Pour nettoyer un clavier, la méthode la plus simple est de secouer le clavier à l'envers :

(Alternate method: convince them to pretend it's an Etch-a-Sketch and try to erase it.)

Ça marche pas trop mal, mais quand le clavier est maltraité pendant plusieurs années, il en faut un peu plus. J'ai complètement démonté mon clavier pour tenter de débloquer la touche S qui s'était coincée durant le nettoyage. La quinzaine de vis de la coque en plastique était cachées derrière des bouts de caoutchouc (sûrement un message pour me dire « non, ne le fait pas ! »). Et à l'intérieur il y a encore un grand nombre de vis.

J'ai trouvé une grosse touffe de cheveux et une poignée de miettes (miam !). Malheureusement, vu l'état du clavier, je me suis dit qu'il serait plus rapide d'en racheter un autre ...

En même temps, pas mal de des lettres étaient effacées, ce qui ne facilitait pas la frappe à une main (ex : avec un bébé dans les bras). Peut être que ça va enfin me motiver à apprendre à utiliser mon clavier bépo !

vendredi 4 décembre 2009

Compiler PyPy trunk en activant le compilateur à la volée (JIT)

PyPy est une interprète Python écrit en Python. Il implémente Python 2.5 et offre quelques fonctionnalités supplémentaires. Je m'intéresse surtout au compilateur à la volée, car il laisse espérer une vitesse d'exécution des programmes Python bien meilleure. Lire ces benchmarks du blog PyPy pour se faire une idée :

Prérequis

  • Linux
  • Processeur 32 bits (le compilateur à la volée ne gère pas encore le 64 bits)
  • 2 Go de mémoire (1,5 Go semblent suffisant selon ce que j'ai lu)
  • Une bonne heure pour la compilation

Téléchargement

svn co http://codespeak.net/svn/pypy/trunk/ pypy-trunk

Installer les dépendances

Sous Debian / Ubuntu :

sudo apt-get install libffi-dev libbz2-dev libexpat1-dev libexpat1-dev

La compilation proprement dite

cd pypy-trunk/pypy/translate/goal
python translate.py -Ojit

Prévoir 60 minutes sur un CPU Intel @ 3 GHz et 2 Go de mémoire. Pour faire patienter, PyPy dessine de jolies fractales : C

Le résultat est le programme testing-1 (environ 18 Mo) dans le dossier /tmp/usession-trunk-0/testing_1/. Je vous conseille de le déplacer le fichier testing-1 à la racine du projet PyPy sous le nom pypy-c-jit.

C'est prêt !

Voilà, vous avez un PyPy prêt à l'emploi. Vous pouvez jouer avec l'option --jit :

$ ./pypy-c-jit --help
usage: /home/haypo/prog/SVN/pypy-trunk/pypy-c-jit [options]

options:
 (...)
 --jit debug=N              low-level JIT parameter (default 2)
 --jit hash_bits=N          low-level JIT parameter (default 14)
 --jit inlining=N           low-level JIT parameter (default False)
 --jit optimizer=N          low-level JIT parameter (default 1)
 --jit threshold=N          low-level JIT parameter (default 1000)
 --jit trace_eagerness=N    low-level JIT parameter (default 200)
 --jit trace_limit=N        low-level JIT parameter (default 10000)

Un sprint PyPy est prévu fin janvier 2010 (dans un chalet en Suisse) pour finaliser la version 1.2 qui devrait donc sortir peu après (je l'espère).

Unladen Swallow

J'attend aussi beaucoup d'Unladen Swallow qui a pris une autre voie. C'est un fork de CPython 2.6 qui utilise LLVM pour la boucle d'évaluation du bytecode Python. LLVM intègre notamment un compilateur à la volée. Contrairement à PyPy qui redéveloppe tout depuis zéro dans leur coin, LLVM est un projet très populaire utilisé par Apple pour ses effets graphiques, dans les pilotes 3D Xorg récents (Gallium), pour compiler des programmes en C, etc. Non pas que les développeurs de PyPy soient moins bons, j'ai plus confiance dans un projet (LLVM) utilisé par un grand nombre des personnes pour des usages très différents. C'est un gage de pérénité, et LLVM semble plus actif.

D'ailleurs, PyPy avait un backend LLVM pendant un temps, mais ils l'ont abandonné. Il me semble que la raison avancée par les auteurs de PyPy était que LLVM n'était pas adapté à Python, langage trop dynamique.

Unladen Swallow a aussi l'avantage d'être 100% compatible avec CPython... vu que c'est un fork de CPython, notamment au niveau des modules tiers écrits en C (utilisant l'API C de Python) comme PyQt ou numpy.

jeudi 3 décembre 2009

Installer Fedora 11 et 12 depuis une clé USB

Ce bref article explique le minimum pour installer Fedora 12 sur un Eee PC blanc à partir d'une clé USB (vu qu'un Eee PC blanc ne dispose pas de lecteur de CD-Rom). Mais vu les galères que j'ai eu avec Fedora 12 et Poulsbo, j'ai fini par installer Fedora 11. Cet article explique donc aussi une procédure pour installer Fedora 11 à partir d'une clé USB. Les deux installations se basent sur la méthode « Netinstall » qui utilise un petit média pour le boot, puis télécharge les paquets depuis Internet.

Prérequis

  1. Un Eee PC blanc modèle 1101HA, chipset Poulsbo, sinon ça marche pas (mais non je déconne !)
  2. Une clé USB d'au moins 200 Mo que vous pouvez formatter (perdre toutes les données écrites sur la clé)
    • N'importe quel média de stockage USB devrait faire l'affaire. Évitez tout de même de formatter la partition FAT de votre appareil photo numérique : une clé USB 4 Go coûte 8€ en supermarché (voir moins) !
  3. Choisir un miroir Fedora près de chez vous
    • ATTENTION : si vous choisissez un miroir FTP, assurez-vous qu'il supporte le téléchargement partiel (commande FTP "REST") : Fedora 12 l'exige (j'ai ouvert un rapport de bug pour Fedora 12 Beta, mais il n'a pas pu être corrigé avant la version 12 finale)
  4. Une bonne heure devant vous

Création puis boot de la clé USB

  1. Télécharger Fedora-12-Beta-i386-netinst.iso depuis votre miroir ou depuis le site principal
  2. Taper la commande dd if=Fedora-12-Beta-i386-netinst.iso of=/dev/sdX où sdX est le périphérique de votre clé USB. Vérifiez trois fois que sdX est bien votre clé USB, avec fdisk ou cfdisk par exemple, sous peine de perdre tous les données de votre disque dur !
  3. Au démarrage de l'Eee PC blanc, taper la touche Echappe sans arrêt pour afficher le menu de sélection du média sur lequel booter (disque dur, clé USB, ...) : choisir USB:
  4. Le menu de boot Fedora s'affiche : choisir Install or upgrade

Installation Fedora

  1. Choix de la langue : French
  2. Choix du clavier : fr-latin9
  3. Choix du média d'installation : ne pas choisir /dev/sdXY, faire précédent (sûrement une blague des développeurs de Fedora pour empêcher les débutants d'installer Fedora), puis :
    1. Choisir la méthode "URL"
    2. Interface réseau : prendre eth0 (carte ethernet)
    3. [x] Activer le support IPv4 (*) Dynamic IP configuration (DHCP)
    4. Pour l'URL, chercher dans votre miroir Fedora le chemin vers le dossier "os" de l'architecture et de la version de votre choix : (...)/releases/test/12-Beta/Fedora/i386/os/. Exemple avec le miroir Free :
ftp://ftp.free.fr/mirrors/fedora.redhat.com/fedora/linux/releases/test/12-Beta/Fedora/i386/os/
  1. À partir de là, c'est l'installeur Fedora classique qui est bien foutu et explique bien ce qu'il y a à faire. Si vous êtes perdus, consultez la documentation Fedora (en anglais pour le moment)

Note : le miroir Free ne gère que FTP et ne supporte pas le téléchargement partiel. Il n'est donc pas utilisable pour installer Fedora !

Échecs successifs

Comme j'ai pas de bol, j'ai du m'y reprendre à dix fois (au moins) pour arriver à installer Fedora 12...

  • Je n'arrivais pas à booter sur la clé USB : j'ai mis du temps à deviner qu'il fallait utiliser la touche Echappe au boot. J'avais tenté de changer la configuration du BIOS : j'ai mis le média "Removable device" en premier, mais ça ne fonctionne pas pour l'USB !?
  • J'ai tenté de lire le contenu de l'image ISO, en extraire install.img, et écrire install.img sur la clé USB (dd if=install.img of=/dev/sdX)... Mais ça ne fonctionne pas, ce n'est pas la bonne méthode. Conseil : ne pas lire de vieux billets de blogs.
  • À l'installation, j'ai choisi le média /dev/sda1 comme source d'installion. Or pour une Netinstall, il faut faire précédent et choisir "URL"... La vieille feinte de l'ours !
  • J'ai pris le miroir Free, or le serveur FTP de Free ne supporte pas l'extension "téléchargement partiel" (commande FTP "REST"). Du coup, l'installeur graphique a échoué lors qu'il a téléchargé le 1er paquet RPM...

Créer une clé USB bootable pour installer Fedora 11

Créer une clé USB bootable pour Fedora 11 n'est pas possible depuis Debian (pas facilement). Il vaut mieux avoir une Fedora sous la main pour créer la clé USB.

  1. Télécharger Fedora-11-i386-netinst.iso
  2. Sous Fedora, installer les paquets livecd-tools et syslinux (sudo yum install livecd-tools syslinux)
  3. Créer une partition ext3 (/dev/sdXY) de 300 Mo sur la clé USB (ex: avec gparted)
  4. Marquer la partition /dev/sdXY bootable. Exemple avec parted :
$ sudo parted /dev/sdX
(parted) toggle Y boot
(parted) quit
  1. Enfin, taper la commande : sudo livecd-iso-to-disk Fedora-11-i386-netinst.iso /dev/sdXY

Note : Remplacez X et Y par le nom et le numéro de partition de votre choix.

--

Lire aussi Installer Ubuntu Ibex depuis un disque dur USB externe.