Outils pour utilisateurs

Outils du site


MPD@raspberry + MPD@ordiportable

Histoire de carte SD read-only, de database MPD et de locations variées des fichiers audio

Constat de départ:

La carte SD du raspberry, il faut l'économiser. On a le choix:

* On place la database de mpd sur un disque dur externe directement relié à Raspberry. Inconvénient: mpd accède alors au disque dur externe, même quand on n'a pas besoin de fichiers présents sur le disque dur externe. Or, il faut aussi économiser les disque durs externes. En fait, je trouve dans ce cas que c'est une drôle d'idée d'utiliser un disque dur externe comme palliatif à la carte SD sur un raspberry. D'autres préconiseront l'usage de clés USB. Dit autrement, un raspberry ne possède aucun moyen de stockage approprié, hormis des systèmes de fichiers en lecture seule (qui ont leur limite). Les moyens de stockage fiables étant les disque durs classiques (via l'USB si l'on admet que cet usage puisse être occasionnel) et les SSD.

* Une idée saugrenue consiste à déporter la partie “database” de mpd sur le PC portable. On pourrait faire ça avec un mount (sshfs) depuis le raspberry, mais on peut aussi utiliser un plugin prévu pour partager cette database avec une autre instance de MPD, comme précisé ici.

Notons que rafraichir la database peut dans ce cas-ci être effectué aussi bien en ayant son client MPD connecté au Raspberry que sur l'instance MPD de l'ordi portable.

Avantages:

  • Tant qu'on ne sollicite pas de MP3 présents sur le disque dur externe, celui-ci ne se réveille pas.
  • A la base, l'intérêt de ce plugin c'est de rendre plus rapide la génération de la base de données pour les fichiers locaux. Le Raspberry accède ensuite à ces fichiers via NFS/SSHFS. Or ici la majorité de nos fichiers seront sur le disque dur externe branché sur le raspberry (et non pas sur le réseau) donc l'intérêt de la manip est comme qui dirait biaisée.

Inconvénient:

  • Il faut avoir 2 démons MPD lancés.
  • Il faut faire correspondre l'arborescence (noms de dossiers etc) entre le serveur MPD du Rasbperry, et le serveur MDP de l'ordi portable. Si nos fichiers musicaux sont éparpillés, ça signifie devoir faire des mount dans tous les sens (du Rasp vers le Notebook, du Notebook vers le Rasp, etc…). Un peu chiant, ou alors j'ai mal compris la mise en oeuvre…

Donc après avoir testé cette idée, l'inconvénient ci-dessus m'a invité à faire rebrousse-chemin. En même temps ça doit pas être si ingérable à coup de liens symboliques bien placés.

* Une autre solution, c'est de placer les fichiers qui sont régulièrement réécrits par MPD (dont la database) sur l'ordi portable. En gros, ça se fait via un mount classique, et c'est transparent. Ca me paraît pour le coup suffisamment simple pour être faisable. A tenter.

Le point important de cette solution, c'est donc d'avoir un auto-mount effectué sur le Raspberry, qui permet un accès au système de fichier de l'ordi portable. On va voir ça plus bas avec SystemD.

SystemD

Dans cette histoire, SystemD peut servir à un paquet de trucs:

  • Gérer les montages automatiques sshfs
  • … et c'est tout. Bon, de base il sert évidemment à démarrer les démons mpd et tout le reste du système. Mais ça, on n'a pas à l'écrire nous-mêmes.
  • Ah non, important: gérer les montages automatiques du disque dur externe, et espérer faire une mise en veille correcte ?

Ecrire une unit pour un montage

Montage Musique Portable Fab

Voilà à quoi ça ressemble pour le moment:

/etc/systemd/system/mnt-notebookfab-musique.mount
[Unit]

Description = Montage du répertoire Musique du Portable de Fab

[Mount]

What = fab@cacacomp:/home/fab/musique

Where = /mnt/notebookfab/musique

Type = fuse.sshfs

Options=noauto,user,allow_other

[Install]

WantedBy = multi-user.target

Automontage Musique Portable Fab

/etc/systemd/system/mnt-notebookfab-musique.automount
[Unit]

Description = Automontage de la Musique sur le Portable de Fab

[Automount]

Where = /mnt/notebookfab/musique

[Install]

WantedBy = multi-user.target

Activation de l'unit automontage

systemctl enable mnt-notebookfab-musique.automount

Et ça fonctionne :D

Montages dans /etc/fstab avec SystemD

C'est beau d'écrire des Unit, mais finalement il semblerait que la méthode recommendée reste le fstab (à confirmer).

En plus, je ne sais pas comment on gère les UUID avec les units.

Raspberry - Montage de l'USB

Dans /etc/fstab,

UUID=651df4bd-3b57-4552-9465-183fe5230b7b      /mnt/usb/gros   ext4    noauto,nofail,x-systemd.automount,x-systemd.device-timeout=10        0       2

A confirmer, le noauto a été ajouté car ça me laissait le disque dur dans un état inutilisable. Le rasp est bien accessible via SSH, mais la led du disque dur clignote sans cesse, et je ne peux ni effectuer de mount ni de umount sur le périphérique. Faire un ls /mnt/usb/gros laisse le système en attente (CTRL+C pour interrompre). Et si je redémarre le Raspberry en ayant cette led qui clignote, il va mettre des plombes à booter !

Pour le reste, voir:

ALSA, MPD, Carte son USB externe et Raspbian Jessie

En écoutant des streams radios, des coupures … trop gênantes et régulières pour être tolérables … il peut se passer plusieurs minutes sans gênes. Ca dépends, des fois il est en forme pendant un bon moment, d'autres fois il saccade régulièrement.

Pas de conso anormale du CPU.

Je n'ai pas constaté de messages dans les logs pour chacune de ces coupures, par contre de temps en temps apparaît:

raspberry delay: estimated 336, actual 0
[56971.971266] delay: estimated 288, actual 0
[57245.471127] delay: estimated 336, actual 0
[57355.811327] delay: estimated 384, actual 48
[57426.751584] delay: estimated 384, actual 48
[57430.923425] delay: estimated 144, actual 0
[58949.591350] delay: estimated 384, actual 48
[59600.285099] delay: estimated 384, actual 0
[248351.908008] delay: estimated 336, actual 0
[248409.702147] delay: estimated 336, actual 0
[250203.462872] delay: estimated 384, actual 0
[252203.528980] delay: estimated 192, actual 0
[252692.118122] delay: estimated 336, actual 0
[253002.180787] delay: estimated 336, actual 0
[254709.726283] delay: estimated 384, actual 48
[255060.214077] delay: estimated 336, actual 0
[257602.520471] delay: estimated 144, actual 0
[260358.037534] delay: estimated 144, actual 0
[260436.455811] delay: estimated 336, actual 0
[262200.188280] delay: estimated 336, actual 0
[262829.442975] delay: estimated 384, actual 48
[263932.237585] delay: estimated 144, actual 0
[263968.405742] delay: estimated 384, actual 0
[264008.409896] delay: estimated 384, actual 0
[266233.355563] delay: estimated 336, actual 0
[266423.667068] delay: estimated 384, actual 48
[266933.322189] delay: estimated 192, actual 0
[311784.717267] delay: estimated 192, actual 48
[317262.981289] delay: estimated 384, actual 0
[322230.386965] delay: estimated 384, actual 48
[329195.423571] delay: estimated 288, actual 0
[332071.770868] delay: estimated 144, actual 0

Ce topic parle du fait que MPD remplisse les logs du Raspberry, ça n'est pas le cas chez moi. Une solution proposée est de passer:

options snd-usb-audio nrpacks=1

… en argument de chargement du module de la carte son. Tirée d'ici, cette solution vise en fait à permettre une latence faible sous Jack, donc pas ce qu'on attend.

Pas forcément lié, on voit dans les logs:

[    8.365856] usb-audio: Fast Track Pro switching to config #2
[    8.392005] snd-usb-audio: probe of 1-1.3:1.0 failed with error -5
[    8.404271] usb-audio: Fast Track Pro config OK
[    8.501458] usbcore: registered new interface driver snd-usb-audio

Cette page mentionne un problème lié à l'usage du disque, du réseau, et des interruptions qui provoqueraient les drops de l'audio: http://www.raspyfi.com/raspberry-pi-usb-audio-fix/

Une mise à jour du firmware, dans une certaine branche/version est proposée. Pas testée.

Version actuelle du firmware:

# /opt/vc/bin/vcgencmd version
Sep  8 2014 19:02:48 
Copyright (c) 2012 Broadcom
version 3f2f2607186be72e4945cfa8edc77872dfc73195 (clean) (release)

Vérification du samplerate utilisé par la carte son:

# cat /proc/asound/card0/pcm0p/sub0/hw_params
access: MMAP_INTERLEAVED
format: S16_LE
subformat: STD
channels: 2
rate: 48000 (48000/1)
period_size: 1024
buffer_size: 16384

Le 14/12, petite mise à jour du firmware, branche standard.

# /opt/vc/bin/vcgencmd version
Dec 13 2014 15:36:40 
Copyright (c) 2012 Broadcom
version ba46211b55252156d2f1e507a7aa71bd18ec0482 (clean) (release)

Comme c'est mignon, après redémarrage, tentative de lecture de plusieurs fichiers et streams, et aucune coupure pour le moment !

MPD et les disques de stockage externes/amovibles

ce qui suit est écrit non sans cynisme…

Et si on s'emmerdait pas à considérer les répertoires contenant les fichiers musicaux comme pouvant être momentanément indisponibles ? Oh oui ! Quelle bonne idée MPD !

Dit plus clairement: MPD s'en fout de savoir si votre musique est stockée sur un disque dur USB externe. Cela a pour conséquence que si parfois vous utilisez MPD sans avoir branché l'une des sources, elle sera zappée de la database, et vous devrez la réanalyser dès que vous rebrancherez le support…

MPD pourrait améliorer cette situation,

  • En permettant d'indiquer plusieurs répertoires contenant la musique (et en précisant la nature de cette source pour chaque répertoire)
  • En découpant sa base de données en fonction des différents répertoires.

Ca paraît pas compliqué, mais… c'est tellement mieux quand c'est austère !

3 voies/solutions à creuser:

  1. Réanalyser les fichiers audio, c'est pénible mais pas infaisable
  2. Si on veut on peut lancer plusieurs instances de MPD, dont une qui se lancerait suite au montage du disque dur externe. Problème: conflit d'ALSA entre les instances MPD + nécessité de reconnecter le client à la bonne instance.
  3. On peut aussi rêver qu'à terme les applications (genre MPD) deviennent plus intégrées avec SystemD, et vu que SystemD fait tout y compris le café…

Voir par ici pour un topic sur cette question.

Annexe : Enregistrer le flux que MPD joue

#!/bin/bash
url=$(mpc -h rasp -f %file% | grep http)
dadate=$(date +%F__%H-%M)
name=$(echo $url | cut -d '/' -f 3 | cut -d ':' -f 1)
cvlc "$url" --sout "file/ogg:enregistrement"__"$name"__"$dadate.ogg"
article/linux/mpd-raspberry-alsa.txt · Dernière modification: 2015/03/18 18:27 par fab