Flyounet : (Digital|Real)? life

Une sorte de journal quotidien, mais en vachement plus espacé dans le temps

Comment se faire un squeezePi simplement

Rédigé le . Édité le .

Nombreux sont ceux qui ne jurent que par Sonos (certainement car ils ont les moyens). J'ai pour ma part une préférence pour son ancêtre : LMS (Logitech Media Server). Un soft en perl qui tourne sur un serveur (dans mon cas sur un Synology). Son avantage est que n'importe quelle machine peut devenir cliente, et donc jouer de la musique (même en multi-room). Dans mon cas, j'ai des Raspberry PI (oui les plus vieux) en client. Dans la suite je montre comment faire.

Comment faire un squeezePi ?

But de la documentation

Ça fait quelques années que ça tourne à la maison. Et j'ai un collègue qui voulait s'y essayer, alors voilà une petit doc qui devrait l'aider.

Un squeezePi, c'est un Raspberry Pi sur lequel on ajoute un petit binaire pour faire de lui une SqueezeBox like.
Les SqueezeBox était des enceintes portables et capables de se connecter au LMS serveur opur jouer de la musique. Il y en a eu quelques unes de vendues (pas beaucoup sinon Logitech aurait continuer)...

Je vous ai dit aussi qu'on pouvait faire du TTS vers les SqueezeBox et que c'était supporté aussi dans Jeedom ?

Où télécharger le binaire que j'utilise pour mon squeezePi ?

Euh, je vais mettre le fichier squeezelite-armv6hf-v1.7 --> (son sha1sum est bae8d22434000dd89528e25acfb139ad4153b946).

Comment installer le binaire :

On le copie dans le $HOME directory du user pi (ou de tout autre user que l'on préfère, pas root par contre) et on lui met les droits 750 ou 700 (c'est plus que suffisant).

Comment on le lance le bouzin ?

Moi j'utilise un script (voir plus bas), que je lance toutes les 5 minutes via la crontab :

pi@raspberrypi ~ $ crontab -l
# m h  dom mon dow   command
*/5 * * * * /home/pi/squizeLaunch.sh

Comme ça si le process se casse la gueule, il est relancé toute les 5 minutes. Ou si le pi redémarre, c'est pareil ça se relancera.

La configuration

Pour que le script fonctionne il a besoin de savoir plein de choses :

  • la carte son
  • le nom qu'on va donner au player (optionnel)
  • le type de player (optionnel)
  • l'adresse mac (optionnel)

Connaitre sa carte son :

On utilise la commande aplay -L qui liste ce qu'il faut. Par example chez moi (ça marche) :

# Première chose à faire trouver ta carte son :
pi@raspberrypi ~ $ aplay -L
...lignes supprimées...
default:CARD=DAC
    HiFimeDIY DAC, USB Audio
    Default Audio Device
sysdefault:CARD=DAC
    HiFimeDIY DAC, USB Audio
    Default Audio Device
front:CARD=DAC,DEV=0
    HiFimeDIY DAC, USB Audio
    Front speakers
...lignes supprimées...

Dans mon cas ma carte sera la front HiFime
Donc il faudra que je retienne : front:CARD=DAC,DEV=0̀

Connaître l'adresse mac :

En réalité on s'en fout (mais grave). Moi je lui mets ce qu'il me passe par la tête. Du moment qu'elle est valide. Même un truc genre ce:d8:1c:5a:15:0f (bon tu remplaces le f de fin par un N et ça te donne le nom de celui pour qui j'écris la doc).

Donner un nom :

Plusieurs choix s'offrent à toi :

  • Bite
  • Poil
  • Couille

Dans mon cas, tu verras que je l'ai appelé RPi-SaM, ce qui peut se traduire par Raspberry Pi de la Salle à Manger.

Le script

#!/bin/bash
#set -xv
# On force le mixer vers 84 pour avoir du son
amixer -d -c1 cset numid=5,iface=MIXER,name='PCM Playback Volume' 102,102

# On change le Player name
monexec=0
if [ ! -f /tmp/ras.pid -o -z "$(cat /tmp/ras.pid)" ]; then
  monexec=1
elif [ "$(ps h -p "$(cat /tmp/ras.pid)" -o comm)" != 'squeezelite-arm' ]; then
  rm -f /tmp/ras.pid
  monexec=1
fi
if [ ${monexec} -eq 1 ]; then
  killall -9 squeezelite-armv6hf-v1.7 2>/dev/null
  /home/pi/squeezelite-armv6hf-v1.7 -o front:CARD=DAC,DEV=0 -a 80 -P /tmp/ras.pid -n "RPi-SaM" -M "SqueezeLite-v1.7" -m "ba:ba:da:da:00:01" &
fi

Et maintenant que tu as vu mes paramètres, tu remplaces par les tiens.
Tu copies le contenu dans un fichier (le mien s'appelle /home/pi/squizeLaunch.sh), tu changes les values que tu veux changer et tu laisses celles que tu veux pas changer). Tu changes les droits pour 750 ou 700. Et si la crontab est déjà en place, tu attends 5 minutes et bim ! T'as du son.

Bonus

Le sha1sum du binaire pour verifier avant executer...

pi@raspberrypi ~ $ sha1sum /home/pi/squeezelite-armv6hf-v1.7
bae8d22434000dd89528e25acfb139ad4153b946  /home/pi/squeezelite-armv6hf-v1.7

L'aide pour comprendre les paramètres dans le script

pi@raspberrypi ~ $ /home/pi/squeezelite-armv6hf-v1.7 -?
Squeezelite v1.7, Copyright 2012-2015 Adrian Smith. See -t for license terms
Usage: /home/pi/squeezelite-armv6hf-v1.7 [options]
  -s <server>[:<port>]        Connect to specified server, otherwise uses autodiscovery to find server
  -o <output device>        Specify output device, default "default", - = output to stdout
  -l                         List output devices
  -a <b>:<p>:<f>:<m>        Specify ALSA params to open output device, b = buffer time in ms or size in bytes, p = period count or size in bytes, f sample format (16|24|24\_3|32), m = use mmap (0|1)
  -a <f>                Specify sample format (16|24|32) of output file when using -o - to output samples to stdout (interleaved little endian only)
  -b <stream>:<output>        Specify internal Stream and Output buffer sizes in Kbytes
  -c <codec1>,<codec2>        Restrict codecs to those specified, otherwise load all available codecs; known codecs: flac,pcm,mp3,ogg,aac,dsd (mad,mpg for specific mp3 codec)
  -d <log>=<level>        Set logging level, logs: all|slimproto|stream|decode|output, level: info|debug|sdebug
  -e <codec1>,<codec2>        Explicitly exclude native support of one or more codecs; known codecs: flac,pcm,mp3,ogg,aac,dsd (mad,mpg for specific mp3 codec)
  -f <logfile>                Write debug to logfile
  -m <mac addr>                Set mac address, format: ab:cd:ef:12:34:56
  -M <modelname>        Set the squeezelite player model name sent to the server (default: SqueezeLite)
  -n <name>                Set the player name
  -N <filename>                Store player name in filename to allow server defined name changes to be shared between servers (not supported with -n)
  -p <priority>                Set real time priority of output thread (1-99)
  -P <filename>                Store the process id (PID) in filename
  -r <rates>[:<delay>]        Sample rates supported, allows output to be off when squeezelite is started; rates = <maxrate>|<minrate>-<maxrate>|<rate1>,<rate2>,<rate3>; delay = optional delay switching rates in ms
  -R -u [params]        Resample, params = <recipe>:<flags>:<attenuation>:<precision>:<passband_end>:<stopband_start>:<phase_response>,
                           recipe = (v|h|m|l|q)(L|I|M)(s) [E|X], E = exception - resample only if native rate not supported, X = async - resample to max rate for device, otherwise to max sync rate
                           flags = num in hex,
                           attenuation = attenuation in dB to apply (default is -1db if not explicitly set),
                           precision = number of bits precision (NB. HQ = 20. VHQ = 28),
                           passband_end = number in percent (0dB pt. bandwidth to preserve. nyquist = 100%),
                           stopband_start = number in percent (Aliasing/imaging control. > passband\_end),
                           phase_response = 0-100 (0 = minimum / 50 = linear / 100 = maximum)
  -D [delay]                Output device supports DSD over PCM (DoP), delay = optional delay switching between PCM and DoP in ms
  -z                         Daemonize
  -t                         License terms
  -?                         Display this help text

Build options: LINUX ALSA EVENTFD RESAMPLE DSD

Aucun rapport mais qui peut servir

Mon PI est vieux et fatigué, et il a le réseau tout décrépi. Du coup il lui arrive de ne plus le sentir le réseau. Et je me retrouve dans ces cas bien embêté sans musique, alors je vérifie toutes le 3 minutes que le réseau est up sinon, je reboot :

Dans ta crontab celle de root ce coup ci :

*/3 * * * * /root/alive.sh >>/root/testing 2>&1

 Le script :

Pas grand chose à faire dans ce script hormis ajouter le nom (ou l'IP) de votre gateway interne dans la variable _hostToTest. En général, il suffit d'un petit ip route | awk '$1 ~ /default/ {print $3}' pour la trouver.

root@raspberrypi:~# cat /root/alive.sh
#!/bin/bash
#set -xv

_file="${HOME}/alive/alive.log"
_hostToTest="laGatewayÀTester"
_nbTests=5
_ping=0

_restart () {
        # On force le mixer vers 0 pour pas avoir du son
        amixer -d -c1 cset numid=5,iface=MIXER,name='PCM Playback Volume' 0,0 &>/dev/null &
        printf "$(date '+%Y-%m-%d %H:%M:%S') --> REBOOT !!! ALERT NO NETWORK !!!\n"
}

_file="${_file}.$(date '+%Y%m%d')"
[[ -d "${_file%/*}" ]] || mkdir -p "${_file%/*}"

while true; do
        ping -n -c 1 -W 3 -q "${_hostToTest}" &>/dev/null && (( _ping++ ))
        [[ ${counter:=1} -ge ${_nbTests} ]] && {
#                [[ ${_ping:=0} -eq 0 ]] && { _restart >> "${_file}"; shutdown -Fr now; exit 1; }
                [[ ${_ping:=0} -eq 0 ]] && { _restart >> "${_file}"; /sbin/reboot -f ; exit 1; }
                echo "$(date '+%Y-%m-%d %H:%M:%S') --> Nb Pings OK : ${_ping}/${_nbTests}" >> "${_file}"
                exit 0
        }
        (( counter++ ))
        sleep 1
done