Configuring the Beaglebone Black to run Squeezelite
Getting the Beaglebone Black was only supposed to be a fun lesson in following a set of Linux instructions for audio playback, and assessing the merits of embedded systems with low power requirements. The results were convincing enough to share for the first blog, and this next set of instructions is an alternative configuration that will appeal to those who are finding MPD and network mounts to be too complex. With the Squeezebox Ecosystem, the NAS/PC/Mac runs Logitech Media Server and the Beaglebone Black is the client/renderer that runs Squeezelite, and is connected to the USB DAC. If all the hardware is connected according to the “Geek Speak” article, then it’s a simple case of installing the software.
Installing Logitech Media Server (LMS):
My Media - Welcome to mysqueezebox.com!
Some NAS like Synology have management software with the option to install LMS as an App. Run the software, and under Settings add your shared music library to the LMS Media Folder (browsing the folders makes this easy). Scanning the media files initially can be a rather lengthy process for big libraries, but the cached database is stored on the server’s side (instead of the Beaglebone), which is a lot more convenient on startup.
Installing Squeezelite on the Beaglebone Black:
If the instructions for installing MPD in the previous article were completed, then installing the squeezelite libraries won’t be necessary. Otherwise:
sudo apt-get install libasound2-dev libflac-dev libmad0-dev libvorbis-dev libvo-aacenc-dev libfaad-dev libmpg123-dev
wget http://squeezelite.googlecode.com/files/squeezelite-armv6hf
sudo mv squeezelite-armv6hf /usr/bin
cd /usr/bin
sudo chmod u+x squeezelite-armv6hf
./squeezelite-armv6hf –o hw:CARD=1,DEV=0
Now look for the Player in LMS under the Player tab and start browsing your music. For remote apps, Logitech’s own Squeezebox Controller App is free, but iPeng is well worth the premium for a more responsive and intuitive experience, especially those with huge libraries.
Squeezelite Startup
This will start up squeezelite on boot, to give the Beaglebone a 'Toaster' operation. The original script is from a Raspberry Pi thread: Raspberry Pi • View topic - Squeezelite up and running on Raspian Wheezy Hard Float
To create the startup script:
sudo nano /etc/init.d/squeezelite
Cut and paste this entry into /etc/init.d squeezelite
#! /bin/sh ### BEGIN INIT INFO # Provides: Squeezelite # Required-Start: # Required-Stop: # Should-Start: # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Squeezelite # Description: Light weight streaming audio player for Logitech's Squeezebox audio server # See: [url="http://code.google.com/p/squeezelite/"]squeezelite - lightweight headless squeezebox emulator - Google Project Hosting[/url] # and: [url="http://forums.slimdevices.com/showthread.php?97046-Announce-Squeezelite-a-small-headless-squeezeplay-emulator-for-linux-%28alsa-only%29"]Announce: Squeezelite - a small headless squeezeplay emulator for linux (alsa only)[/url] ### END INIT INFO # Uninstall Instructions : update-rc.d squeezelitehf remove # PATH should only include /usr/* if it runs after the mountnfs.sh script PATH=/sbin:/usr/sbin:/bin:/usr/bin DESC="Squeezebox client" NAME=squeezelite-armv6hf DAEMON=/usr/bin/$NAME PIDFILE=/var/run/$NAME.pid SCRIPTNAME=/etc/init.d/squeezelite # ========================================================= # CHANGE THESE VALUES IF NEEDED # the name for the squeezelite player (-n option): SL_NAME="Squeezelite" # Set the soundcard SL_SOUNDCARD="hw:CARD=1,DEV=0" # Uncomment the next line (remove hash) if you want to change the mac address (-m option): #SL_MAC_ADDRESS="00:00:00:00:00:01" # Note: when left commented squeezelite will use the mac address of your ethernet card or # wifi adapter, which is what you want. # If you change it to something different, it will give problems is you use mysqueezebox.com . # Uncomment the next line (remove hash) if you want to point squeezelite # at the IP address of your squeezebox server (-s option). And change the IP address of course.. #SB_SERVER_IP="192.168.2.4" # Note: if this is not set, Squeezelite will use auto discovery to find # the LMS server, which works fine too. # Uncomment the next line (remove hash) if you want to set ALSA parameters (-a option, set to buffer size 80): #SL_ALSA_PARAMS="80" # Uncomment the next TWO lines to turn on logging (-f and -d option): #SL_LOGFILE=/var/log/squeezeslite.log #SL_LOGLEVEL="all=debug" # ========================================================= # Exit if the package is not installed [ -x "$DAEMON" ] || exit 0 # Read configuration variable file if it is present [ -r /etc/default/$NAME ] && . /etc/default/$NAME # Load the VERBOSE setting and other rcS variables . /lib/init/vars.sh # Define LSB log_* functions. # Depend on lsb-base (>= 3.2-14) to ensure that this file is present # and status_of_proc is working. . /lib/lsb/init-functions # # Function that starts the daemon/service # do_start() { # Return # 0 if daemon has been started # 1 if daemon was already running # 2 if daemon could not be started start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null || return 1 DAEMON_ARGS="" # add souncard setting if set if [ ! -z "$SL_SOUNDCARD" ]; then DAEMON_ARGS="${DAEMON_ARGS} -o ${SL_SOUNDCARD}" fi # add squeezelite name if set if [ ! -z "$SL_NAME" ]; then DAEMON_ARGS="${DAEMON_ARGS} -n ${SL_NAME}" fi # add mac address if set if [ ! -z "$SL_MAC_ADDRESS" ]; then DAEMON_ARGS="${DAEMON_ARGS} -m ${SL_MAC_ADDRESS}" fi # add squeezebox server ip address if set if [ ! -z "$SB_SERVER_IP" ]; then DAEMON_ARGS="${DAEMON_ARGS} -s ${SB_SERVER_IP}" fi # set ALSA parameters if set if [ ! -z "$SL_ALSA_PARAMS" ]; then DAEMON_ARGS="${DAEMON_ARGS} -a ${SL_ALSA_PARAMS}" fi # add logging if set if [ ! -z "$SL_LOGFILE" ]; then if [ -f ${SL_LOGFILE} ]; then rm ${SL_LOGFILE} fi DAEMON_ARGS="${DAEMON_ARGS} -f ${SL_LOGFILE}" fi # add log level setting if set if [ ! -z "$SL_LOGLEVEL" ]; then DAEMON_ARGS="${DAEMON_ARGS} -d ${SL_LOGLEVEL}" fi start-stop-daemon --start --quiet --make-pidfile --pidfile $PIDFILE --background --exec $DAEMON -- $DAEMON_ARGS || return 2 } # # Function that stops the daemon/service # do_stop() { # Return # 0 if daemon has been stopped # 1 if daemon was already stopped # 2 if daemon could not be stopped # other if a failure occurred start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --exec $DAEMON RETVAL="$?" [ "$RETVAL" = 2 ] && return 2 # Wait for children to finish too if this is a daemon that forks # and if the daemon is only ever run from this initscript. # If the above conditions are not satisfied then add some other code # that waits for the process to drop all resources that could be # needed by services started subsequently. A last resort is to # sleep for some time. start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON [ "$?" = 2 ] && return 2 # Many daemons don't delete their pidfiles when they exit. rm -f $PIDFILE return "$RETVAL" } # # Function that updates squeezelite # do_update() { wget -P /tmp [url]http://squeezelite.googlecode.com/files/squeezelite-armv6hf[/url] sudo cp /usr/bin/squeezelite-armv6hf /tmp/squeezelite-armv6hf.old sudo mv /tmp/squeezelite-armv6hf /usr/bin sudo chmod u+x /usr/bin/squeezelite-armv6hf } # # Function that sends a SIGHUP to the daemon/service # do_reload() { # # If the daemon can reload its configuration without # restarting (for example, when it is sent a SIGHUP), # then implement that here. # start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME return 0 } case "$1" in start) [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" do_start case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; stop) [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" do_stop case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; update) log_daemon_msg "Update Squeezelite to latest version" do_stop do_update do_start ;; status) status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $? ;; #reload|force-reload) # # If do_reload() is not implemented then leave this commented out # and leave 'force-reload' as an alias for 'restart'. # #log_daemon_msg "Reloading $DESC" "$NAME" #do_reload #log_end_msg $? #;; restart|force-reload) # # If the "reload" option is implemented then remove the # 'force-reload' alias # log_daemon_msg "Restarting $DESC" "$NAME" do_stop case "$?" in 0|1) do_start case "$?" in 0) log_end_msg 0 ;; 1) log_end_msg 1 ;; # Old process is still running *) log_end_msg 1 ;; # Failed to start esac ;; *) # Failed to stop log_end_msg 1 ;; esac ;; *) #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2 echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2 exit 3 ;; esac :
Save and close the script. To make squeezelite executeable:
chmod +X /etc/init.d/squeezelite
Test it.
sudo ./squeezelite restart
To check if squeezelite is running:
ps -A |grep squeeze
This adds the script to boot.
insserv squeezelite
20 Comments
Recommended Comments