Thierry Dumont 4 giorni fa
commit
9f8a56a424
3 ha cambiato i file con 751 aggiunte e 0 eliminazioni
  1. 310 0
      README.md
  2. 424 0
      mpd.conf
  3. 17 0
      radio.m3u

+ 310 - 0
README.md

@@ -0,0 +1,310 @@
+# Freebox et machines virtuelles  : un serveur de son de qualité audiophile
+
+Les notes ci-dessous s'appliquent principalement à la création d'un
+serveur **mpd** sur une machine virtuelle Debian, dans une Freebox
+Ultra, mais elles s'appliquent aussi à la création d'un  serveur
+sur une machine physique, par exemple un Raspberry, parfaitement
+adapté. L'installation sur la machine virtuelle est un peu plus
+complexe.
+
+Les freebox ultra permettent l'installation de machines virtuelles
+linux et l'ajout, nécessaire ici, d'un disque NVMe. La box fait tourner
+un processeur ARM, et ce sont donc des versions ARM des systèmes linux
+qu'on peut installer comme VM. On part ici d'une VM Debian stable
+(bookworm au moment où ces lignes ont été écrites). Des VMs toutes
+prêtes peuvent être installées en quelques secondes depuis l'interface
+de la box.
+
+Insistons: un NVMe est nécessaire. Ici, on a mis un NVMe de 1 To.
+
+## Préambule : motivations
+
+L'auteur possède une grande quantité de CDs audio ; il achète aussi des
+fichiers audio (chez Qobuz) de qualité largement supérieure aux CDs
+audio. Les CDs sont convertis en fichiers de format (voir plus bas)
+.flac, qui est 
+aussi le format des fichiers achetés.
+
+L'installation audio comporte un convertisseur digital-analogique (DAC)
+qu'on peut attaquer par un câble USB.
+
+On copiera les fichiers audio sur une machine (virtuelle) qui accédera
+au DAC par le serveur **mpd**, logiciel -libre bien sûr- présent sur
+toutes les distributions Linux raisonnables?
+
+Le but est d'être "bit perfect", c'est à dire qu'aucune information ne
+doit être perdue entre les fichiers et le DAC (qualité audiophile). On
+rappelle que le format flac est un format de compression sans perte.
+
+## La machine virtuelle
+
+La box est dotée d'un NVMe (1 To).
+
+Depuis le menu d'administration de la box (ultra) cliquer "machines
+virtuelles" et lancer la création.
+
+* J'installe une Debian stable
+* Je l'appelle _server_
+* Je lui donne suffisamment de disque (300go)
+* Je copie ma clé ssh "pub".
+* J'active l'usb.
+* L'utilisateur s'appelle 'moi"
+
+En un instant la machine est créée.
+
+Repérer l'adresse ip de la machine (le menu l'indique)
+
+On peut alors faire 
+
+`ssh moi@192...` (l'adresse ip de la machine). Ce n'est pas très
+pratique, mais on va améliorer ça.
+
+Une fois connecté, on peut faire `sudo` sans donner de mot de passe.
+
+_Je propose de donner un mot de passe à l'utilisateur ("moi" ici):_
+
+```` 
+sudo -i
+
+passwd moi
+
+```` 
+
+_etc. Cela permet de se connecter à la machine depuis l'interface de la
+Freebox, sans passer par ssh: utile en cas de problème avec le firewall._
+
+### Installation des packages nécessaires
+
+La machine arrive avec très peu de choses installées. on fait:
+
+```` 
+sudo -i
+apt update
+apt full-upgrade
+```` 
+puis on installe les paquets
+
+```` 
+apt install mpd  avahi-utils avahi-daemon  ufw net-tools rsync alsa-utils usbutils 
+apt clean && apt autopurge 
+
+```` 
+* **mpd** bien sûr
+* **avahi-utils avahi-daemon** pour identifier la machine par son nom
+  sur le réseau local.
+* **ufw** pour modifier le firewall (je ne suis pas bon dans ce domaine
+  et ufw simplifie les choses)
+  
+* le reste est plus ou moins utile (mais ça ne fait pas de
+  mal). **rsync** servira.
+  
+### Configuration
+
+1. **ufw**
+
+````
+ufw allow proto tcp to any port 6600
+ufw allow proto udp to any port 6600
+
+````
+
+Nécessaire pour mpd
+
+````
+ufw allow 5353
+ufw allow 53791
+
+````
+
+Nécessaire pour Avahi.
+
+2. **Démarrer Avahi** 
+
+````
+systemctl enable avahi-daemon.service
+systemctl start avahi-daemon.service
+
+````
+
+Ensuite depuis votre machine _client_ (celle sur laquelle vous
+travaillez) vous devez pouvoir faire:
+
+````
+ssh moi@server.local
+
+````
+
+si bien sûr la machine virtuelle s'appelle server, ce qui est quand même
+mieux que de donner l'adresse ip. 
+
+3. **Démarrer mpd**
+
+````
+systemctl enable mpd.service
+
+systemctl start mpd.service
+
+````
+
+Sur votre machine _client_ installez un client mpd: je suggère
+**cantata**.
+
+Dans les préférence de cantata, il y a possibilité de découvrir
+automatiquement le serveur mpd (glace à Avahi !). Si ça fonctionne,
+c'est bien, sinon mettez le nom de la machine virtuelle (ici server.local) ou
+son adresse ip  et le port 6600.
+
+Bien sûr à ce stade mpd n'est pas configuré, mais cantata doit
+reconnaitre le serveur. Sinon, vous avez probablement un problème avec
+le firewall (redémarrer ufw peut être utile).
+
+## Configurer mpd
+
+### Sortie
+
+On utilise alsa. Voici le fragment correspondant de /etc/mpd.conf :
+
+````
+audio_output {
+        type            "alsa"
+        name            "My ALSA Device"
+##      device          "hw:0,0"        # optional
+#
+...
+}
+````
+On verra plus loin qu'il faudra peut-être modifier la ligne "#
+device".
+
+Évidemment, à chaque mofification de /etc/mpdconf, il faut redémarrer
+le serveur mpd:
+
+````
+systemctl restart mpd.server
+````
+
+### Considérations audiophiles
+
+On veut que le serveur mpd n'altère en rien le signal (être bit
+perfect).
+
+Par défaut, mpd n'est pas très bien configuré (`/etc/mpd.conf`):
+
+1- On doit supprimer ce qui permet de gérer le volume sonore: si mpd
+le fait, il va dégrader le signal. C'est à l'ampli audio de
+faire ça.
+
+2- mpd peut interpoler entre les valeurs numériques: ce n'est
+pas à lui de faire ça mais au DAC. Le faire dans mpd est au mieux sans
+intérêt mais plus probablement nocif : mpd projetés probablement  par
+interpolation 
+polynomiale, ce qui a de fortes chances de produire des oscillations
+lors des transitions rapides (les attaques sont particulièrement
+constitutives de la perception sonore : les perturber est très
+nocif). C'est connu sous le nom de phénomène de Gibbs. Les DACs ont
+développé des ruses de sioux pour s'en débarrasser : il faut donc leur
+laisser faire le travail, sauf peut-être avec un DAC médiocre. 
+
+
+## En route !
+
+Depuis le client (cantata ou autre), on rappelle qu'il il faut
+indiquer le nom de la 
+machine qui fait tourner mpd. Il arrive que Avahi propose directement
+la machine et le port; sinon,ici, la machine est __server.local__ et le
+port _6600_.
+
+Normalement, le client (cantata) doit pouvoir se connecter au serveur.
+
+Bien... il reste :
+
+1. à fournir de la musique au serveur
+
+2. à vérifier qu'un son sort et qu'il est de bonne qualité.
+
+### La musique :
+
+Quelque part (sur ma machine principale, sur un NAS, etc..) mes
+fichiers .flac sont dans un répertoire. On peut rendre ce répertoire
+accessible à la machine virtuelle ou le recopier dans la machine
+virtuelle : c'est là que rsync sera utile.
+
+On peut aussi stocker les fichiers musicaux sur le disque NVMe de la
+box, en dehors de la machine virtuelle : lors de l'installation de la
+VM on peut activer un partage du disque sur la VM. Ça permet d'y
+accéder de partout sur le réseau local. 
+
+Dans /etc/mpd.conf, indiquer le chemin vers le répertoire de la
+musique., Puis redémarrer mpd : 
+
+
+````
+systemctl restart mpd.service
+
+
+````
+
+Dans Cantata, on doit maintenant voir le répertoire des
+enregistrements .flac.
+
+### Les radios
+
+Il faut les décrire dans un ou plusieurs fichiers stockés à
+l'emplacement indiqué par "playlist_directory" dans /etc/mpd.conf
+
+On peut utiliser le format m3u. Un exemple de fichier est donné
+
+La liste des radios doit apparaitre dans le client (cantata).
+
+### Autres sources
+
+Il est possible d'ajouter d'autres sources réseau: voir le fichier
+/etc/mpd.conf. 
+
+### Petite catastrophe, temporaire
+
+1. Les CDs audio sont en 16 bits, 44 khz.
+
+2. La radio (enfin celle que j'écoute) est en qualité 16 bits, 48 khz
+(mais ce n'est pas du flac !)
+
+3. Mes enregistrements de qualité supérieure sont en 24 bits, 96 khz.
+
+La radio passe impeccablement, les enregistrements en 24 bits, 96 khz
+aussi, mais ceux en 16 bits, 44 khz produisent _d'affreux crachotements._
+
+Après avoir consulté le support de mpd, aucune solution n'a été
+trouvée. Mais le 9 aout 2023, Debian Trixie est devenue la version
+stable de Debian. Une mise à jour de la VM (Bookworm) vers Trixie a résolu le
+problème, qui devrait donc disparaitre à l'avenir.
+
+
+### Problème éventuel : pas de son
+
+Il faut bien sûr que votre DAC soint connecté à la prise usb de la
+box, que l'usb soit activé (ça se règle sur l'interface de la
+freebox), et que le DAC soit en marche !
+
+On peut deviner l'identifiant de la carte son (= le DAC) en regardant
+le fichier /proc.asound/cards. On peuutiliser la commande aplay -l sur
+le serveur.
+
+Il faut alors modifier la ligne "device dans
+
+````
+audio_output {
+        type            "alsa"
+        name            "My ALSA Device"
+##      device          "hw:0,0"        # optional
+#
+...
+}
+````
+qui deviendra quelque chose comme :
+
+````
+
+     device          "hw:1,0"
+...
+
+et relancer mpd sur le serveur. On s'en sort facilement.

+ 424 - 0
mpd.conf

@@ -0,0 +1,424 @@
+# An example configuration file for MPD.
+# Read the user manual for documentation: http://www.musicpd.org/doc/user/
+# or /usr/share/doc/mpd/html/user.html
+
+# Additional config can be done in /etc/mpd/mpd_local.conf (cf. include_optional)
+
+# Files and directories #######################################################
+#
+# This setting controls the top directory which MPD will search to discover the
+# available audio files and add them to the daemon's online database. This
+# setting defaults to the XDG directory, otherwise the music directory will be
+# be disabled and audio files will only be accepted over ipc socket (using
+# file:// protocol) or streaming files over an accepted protocol.
+#
+music_directory		"/mnt/Disque-1/Musiques/Musique/"
+#
+# This setting sets the MPD internal playlist directory. The purpose of this
+# directory is storage for playlists created by MPD. The server will use
+# playlist files not created by the server but only if they are in the MPD
+# format. This setting defaults to playlist saving being disabled.
+#
+playlist_directory		"/var/lib/mpd/playlists"
+#
+# This setting sets the location of the MPD database. This file is used to
+# load the database at server start up and store the database while the
+# server is not up. This setting defaults to disabled which will allow
+# MPD to accept files over ipc socket (using file:// protocol) or streaming
+# files over an accepted protocol.
+#
+db_file			"/var/lib/mpd/tag_cache"
+
+# These settings are the locations for the daemon log files for the daemon.
+#
+# The special value "syslog" makes MPD use the local syslog daemon. This
+# setting defaults to logging to syslog.
+#
+# If you use systemd, do not configure a log_file.  With systemd, MPD
+# defaults to the systemd journal, which is fine.
+#
+#log_file			"/var/log/mpd/mpd.log"
+
+# This setting sets the location of the file which stores the process ID
+# for use of mpd --kill and some init scripts. This setting is disabled by
+# default and the pid file will not be stored.
+#
+# If you use systemd, do not configure a pid_file.
+#
+#pid_file			"/run/mpd/pid"
+
+# This setting sets the location of the file which contains information about
+# most variables to get MPD back into the same general shape it was in before
+# it was brought down. This setting is disabled by default and the server
+# state will be reset on server start up.
+#
+state_file			"/var/lib/mpd/state"
+#
+# The location of the sticker database.  This is a database which
+# manages dynamic information attached to songs.
+#
+sticker_file                   "/var/lib/mpd/sticker.sql"
+#
+###############################################################################
+
+
+# General music daemon options ################################################
+#
+# This setting specifies the user that MPD will run as. MPD should never run as
+# root and you may use this setting to make MPD change its user ID after
+# initialization. This setting is disabled by default and MPD is run as the
+# current user.
+#
+user				"mpd"
+#
+# This setting specifies the group that MPD will run as. If not specified
+# primary group of user specified with "user" setting will be used (if set).
+# This is useful if MPD needs to be a member of group such as "audio" to
+# have permission to use sound card.
+#
+#group				"nogroup"
+#
+# This setting sets the address for the daemon to listen on. Careful attention
+# should be paid if this is assigned to anything other than the default, any.
+# This setting can deny access to control of the daemon. Not effective if
+# systemd socket activation is in use.
+#
+# For network
+bind_to_address			"localhost"
+#
+# And for Unix Socket
+#bind_to_address		"/run/mpd/socket"
+#
+# This setting is the TCP port that is desired for the daemon to get assigned
+# to.
+#
+#port				"6600"
+#
+# Suppress all messages below the given threshold.  Use "verbose" for
+# troubleshooting. Available setting arguments are "notice", "info", "verbose",
+# "warning" and "error".
+#
+#log_level			"notice"
+#
+# Setting "restore_paused" to "yes" puts MPD into pause mode instead
+# of starting playback after startup.
+#
+#restore_paused "no"
+#
+# This setting enables MPD to create playlists in a format usable by other
+# music players.
+#
+#save_absolute_paths_in_playlists	"no"
+#
+# This setting defines a list of tag types that will be extracted during the
+# audio file discovery process. The complete list of possible values can be
+# found in the user manual.
+#metadata_to_use	"artist,album,title,track,name,genre,date,composer,performer,disc"
+#
+# This example just enables the "comment" tag without disabling all
+# the other supported tags:
+#metadata_to_use "+comment"
+#
+# This setting enables automatic update of MPD's database when files in
+# music_directory are changed.
+#
+auto_update	"no"
+#
+# Limit the depth of the directories being watched, 0 means only watch
+# the music directory itself.  There is no limit by default.
+#
+#auto_update_depth "3"
+#
+###############################################################################
+
+
+# Symbolic link behavior ######################################################
+#
+# If this setting is set to "yes", MPD will discover audio files by following
+# symbolic links outside of the configured music_directory.
+#
+#follow_outside_symlinks	"yes"
+#
+# If this setting is set to "yes", MPD will discover audio files by following
+# symbolic links inside of the configured music_directory.
+#
+#follow_inside_symlinks		"yes"
+#
+###############################################################################
+
+
+# Zeroconf / Avahi Service Discovery ##########################################
+#
+# If this setting is set to "yes", service information will be published with
+# Zeroconf / Avahi.
+#
+#zeroconf_enabled		"yes"
+#
+# The argument to this setting will be the Zeroconf / Avahi unique name for
+# this MPD server on the network. %h will be replaced with the hostname.
+#
+#zeroconf_name			"Music Player @ %h"
+#
+###############################################################################
+
+
+# Permissions #################################################################
+#
+# If this setting is set, MPD will require password authorization. The password
+# setting can be specified multiple times for different password profiles.
+#
+#password                        "password@read,add,control,admin"
+#
+# This setting specifies the permissions a user has who has not yet logged in.
+#
+#default_permissions             "read,add,control,admin"
+#
+###############################################################################
+
+
+# Database #######################################################################
+#
+# An example of a database section instead of the old 'db_file' setting.
+# It enables mounting other storages into the music directory.
+#
+#database {
+#       plugin "simple"
+#       path "/var/lib/mpd/tag_cache"
+#       cache_directory "/var/lib/mpd/cache"
+#}
+#
+# An example of database config for a satellite setup
+#
+#music_directory "nfs://fileserver.local/srv/mp3"
+#database {
+#       plugin "proxy"
+#       host "other.mpd.host"
+#       port "6600"
+#}
+
+# Input #######################################################################
+#
+input {
+        plugin "curl"
+#       proxy "proxy.isp.com:8080"
+#       proxy_user "user"
+#       proxy_password "password"
+}
+
+# Decoder #####################################################################
+#
+
+decoder {
+        plugin                  "hybrid_dsd"
+        enabled                 "no"
+#       gapless                 "no"
+}
+decoder {
+        plugin        "wildmidi"
+        enabled       "no"
+        #config_file "/etc/timidity/timidity.cfg"
+}
+
+#
+###############################################################################
+
+# Audio Output ################################################################
+#
+# MPD supports various audio output types, as well as playing through multiple
+# audio outputs at the same time, through multiple audio_output settings
+# blocks. Setting this block is optional, though the server will only attempt
+# autodetection for one sound card.
+#
+# An example of an ALSA output:
+#
+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
+}
+#
+# An example of an OSS output:
+#
+#audio_output {
+#	type		"oss"
+#	name		"My OSS Device"
+##	device		"/dev/dsp"	# optional
+##	mixer_type      "hardware"	# optional
+##	mixer_device	"/dev/mixer"	# optional
+##	mixer_control	"PCM"		# optional
+#}
+#
+# An example of a shout output (for streaming to Icecast):
+#
+#audio_output {
+#	type		"shout"
+#	encoder		"vorbis"		# optional
+#	name		"My Shout Stream"
+#	host		"localhost"
+#	port		"8000"
+#	mount		"/mpd.ogg"
+#	password	"hackme"
+#	quality		"5.0"
+#	bitrate		"128"
+#	format		"44100:16:1"
+##	protocol	"icecast2"		# optional
+##	user		"source"		# optional
+##	description	"My Stream Description"	# optional
+##	url		"http://example.com"	# optional
+##	genre		"jazz"			# optional
+##	public		"no"			# optional
+##	timeout		"2"			# optional
+##	mixer_type      "software"		# optional
+#}
+#
+# An example of a recorder output:
+#
+#audio_output {
+#	type		"recorder"
+#	name		"My recorder"
+#	encoder		"vorbis"		# optional, vorbis or lame
+#	path		"/var/lib/mpd/recorder/mpd.ogg"
+##	quality		"5.0"			# do not define if bitrate is defined
+#	bitrate		"128"			# do not define if quality is defined
+#	format		"44100:16:1"
+#}
+#
+# An example of a httpd output (built-in HTTP streaming server):
+#
+#audio_output {
+#	type		"httpd"
+#	name		"My HTTP Stream"
+#	encoder		"vorbis"		# optional, vorbis or lame
+#	port		"8000"
+#	bind_to_address	"0.0.0.0"		# optional, IPv4 or IPv6
+##	quality		"5.0"			# do not define if bitrate is defined
+#	bitrate		"128"			# do not define if quality is defined
+#	format		"44100:16:1"
+#	max_clients	"0"			# optional 0=no limit
+#}
+#
+# An example of a pulseaudio output (streaming to a remote pulseaudio server)
+# Please see README.Debian if you want mpd to play through the pulseaudio
+# daemon started as part of your graphical desktop session!
+#
+#audio_output {
+#	type		"pulse"
+#	name		"My Pulse Output"
+##	server		"remote_server"		# optional
+##	sink		"remote_server_sink"	# optional
+##	media_role	"media_role"		#optional
+#}
+#
+# An example of a winmm output (Windows multimedia API).
+#
+#audio_output {
+#	type		"winmm"
+#	name		"My WinMM output"
+##	device		"Digital Audio (S/PDIF) (High Definition Audio Device)" # optional
+#		or
+##	device		"0"		# optional
+##	mixer_type	"hardware"	# optional
+#}
+#
+# An example of an openal output.
+#
+#audio_output {
+#	type		"openal"
+#	name		"My OpenAL output"
+##	device		"Digital Audio (S/PDIF) (High Definition Audio Device)" # optional
+#}
+#
+# An example of an sndio output.
+#
+#audio_output {
+#	type		"sndio"
+#	name		"sndio output"
+#	mixer_type	"hardware"
+#}
+#
+# An example of an OS X output:
+#
+#audio_output {
+#	type		"osx"
+#	name		"My OS X Device"
+##	device		"Built-in Output"	# optional
+##	channel_map      "-1,-1,0,1"	# optional
+#}
+#
+## Example "pipe" output:
+#
+#audio_output {
+#	type		"pipe"
+#	name		"my pipe"
+#	command		"aplay -f cd 2>/dev/null"
+## Or if you're want to use AudioCompress
+#	command		"AudioCompress -m | aplay -f cd 2>/dev/null"
+## Or to send raw PCM stream through PCM:
+#	command		"nc example.org 8765"
+#	format		"44100:16:2"
+#}
+#
+## An example of a null output (for no audio output):
+#
+#audio_output {
+#	type		"null"
+#	name		"My Null Output"
+#	mixer_type      "none"			# optional
+#}
+#
+###############################################################################
+
+
+# Normalization automatic volume adjustments ##################################
+#
+# This setting specifies the type of ReplayGain to use. This setting can have
+# the argument "off", "album", "track" or "auto". "auto" is a special mode that
+# chooses between "track" and "album" depending on the current state of
+# random playback. If random playback is enabled then "track" mode is used.
+# See <https://wiki.hydrogenaud.io/index.php?title=Replaygain> for
+# more details about ReplayGain.
+# This setting is off by default.
+#
+replaygain			"off"
+#
+# This setting sets the pre-amp used for files that have ReplayGain tags. By
+# default this setting is disabled.
+#
+#replaygain_preamp		"0"
+#
+# This setting sets the pre-amp used for files that do NOT have ReplayGain tags.
+# By default this setting is disabled.
+#
+#replaygain_missing_preamp	"0"
+#
+# This setting enables or disables ReplayGain limiting.
+# MPD calculates actual amplification based on the ReplayGain tags
+# and replaygain_preamp / replaygain_missing_preamp setting.
+# If replaygain_limit is enabled MPD will never amplify audio signal
+# above its original level. If replaygain_limit is disabled such amplification
+# might occur. By default this setting is enabled.
+#
+#replaygain_limit		"yes"
+#
+# This setting enables on-the-fly normalization volume adjustment. This will
+# result in the volume of all playing audio to be adjusted so the output has
+# equal "loudness". This setting is disabled by default.
+#
+#volume_normalization		"no"
+#
+###############################################################################
+
+# Character Encoding ##########################################################
+#
+# If file or directory names do not display correctly for your locale then you
+# may need to modify this setting.
+#
+filesystem_charset		"UTF-8"
+#
+###############################################################################
+
+include_optional "mpd_local.conf"

+ 17 - 0
radio.m3u

@@ -0,0 +1,17 @@
+#EXTM3U
+#EXTINF:0,France Musiques
+#http://direct.francemusique.fr/live/francemusique-midfi.mp3
+#EXTINF:0, France-Musiques-aac
+#http://direct.franceinter.fr/live/francemusique-hifi.aac
+#EXTINF:0,France Musiques-hifi-aac-icecast-192kbps
+http://icecast.radiofrance.fr/francemusique-hifi.aac
+#EXTINF:0 France Musique concerts Radio France
+http://icecast.radiofrance.fr/francemusiqueconcertsradiofrance-hifi.aac
+#EXTINF:0 France Musique Contemporaine
+http://icecast.radiofrance.fr/francemusiquelacontemporaine-hifi.aac
+#EXTINF:0,France Culture
+http://icecast.radiofrance.fr/franceculture-hifi.aac
+#EXTINF:0,France Inter
+http://icecast.radiofrance.fr/franceinter-hifi.aac
+#EXTINF:0,France Info
+http://icecast.radiofrance.fr/franceinfo-hifi.aac