Difference between revisions of "Squeezeslave on the core"

From LinuxMCE
Jump to: navigation, search
(Installing)
(Select Device)
 
(23 intermediate revisions by 7 users not shown)
Line 1: Line 1:
 
[[Category: Tutorials]]
 
[[Category: Tutorials]]
 +
[[Category:Audio]]
 
{| align="right"
 
{| align="right"
 
   | __TOC__
 
   | __TOC__
 
   |}
 
   |}
 +
==Whats does it do?==
 +
Squeezeslave basically makes it possible to add additional 'virtual' Squeezeboxes to your Core or MD's just by adding additional sound-cards. Each Squeezeslave/Sound-card combo uses about 4-5% CPU on an ATOM/Ion based MD. We have tested an ATOM/Ion based MD running 3 x Squeezeslave/Sound-Card combo's while playing a ripped DVD from the Core without any problems at all. Using Squeezeslave/Sound-Card combo's makes it possible to have several independent audio outputs from your Core or from an MD allowing you to use the 2nd Zone of your Surround Amp for example to provide audio to an adjoining room eg a bathroom or maybe a kitchen. All of this expands the options you have when designing your system, gives you enormous additional flexibility to locate additional audio sources where you need them, and reduces the energy footprint of your system at the same time (in comparison to adding additional physical Squeezeboxes).
 +
 
==Squeezeslave Setup==
 
==Squeezeslave Setup==
Here's how to setup squeezeslave to run on the core.  It's fairly straight forward.  One small issue is that because squeezeslave uses the OSS interface, you will need a separate sound card for each instance of squeezeslave you want to run.
+
Here's how to setup squeezeslave to run on your core or in fact any of your MD's.  It's fairly straight forward but currently requires manual config/install of each Squeezeslave - I'm working on making this something you can just configure from Web Admin simply and quickly.  One small issue is that because squeezeslave uses the OSS interface, you will need a separate sound card for each instance of squeezeslave you want to run.
===Download Source===
+
 
First download a version of [http://sourceforge.net/project/showfiles.php?group_id=105169 Squeezeslave].  I'm running the latest version as it fixed some playback bugs I was having, but any version that works with you're setup should be fine.  
+
==Hardware Supported==
 +
The Startech Virtual 7.1 USB Audio Adapter (model No. ICUSBAUD107) works fine. This tiny USB Stick style adapter works perfectly under 7.10, 9.10 & 10.04. No installation...just plug it in and its ready a few secs later. Only stereo out jack and Mic input jack.
 +
 
 +
Many other brands of USB Audio adapter will probably work too. Please add your experiences with other working hardware here too.
 +
 
 +
Under LinuxMCE 0810 it may be necessary to downgrade Alsa in order for the device to appear (in 'aplay -l' or 'squeezeslave -L'). Be aware that downgrading alsa will remove audio over hdmi capabilities on the affected computer.
 +
 
 +
===Setting Up Squeezeslave on your Core or MD's===
 +
If you want to setup Squeezeslave on your Core then either open Konsole session from the KDE Desktop or ssh in from another machine and sudo yourself. If you want to set up Squeezeslave on an MD then ssh into your Core and then use;
 +
 
 +
ssh moonNNN (**where NNN is the ID number of the MD you want to ssh into.)
 +
 
 +
You can find the ID of your MD from the Web Admin page at Wizard->Devices->Media Directors and the ID is the number with a '#' in front of it at the top of each MD section. Now follow the instructions below for each MD you want to add Squeezeslave too.
 +
 
 +
===Needed Dependencies===
 +
System libraries needed are subversion and libasound2-dev
 +
  sudo apt-get install subversion
 +
  sudo apt-get install libasound2-dev
 +
Since squeezeslave is only updating the display versions of their makefiles also needed for building
 +
  sudo apt-get install libncurses5-dev
 +
  sudo apt-get install liblircclient-dev
 +
 
 +
===Squeezeslave is available in the debs===
 +
Easiest for anybody will be
 +
  sudo apt-get install squeezeslave
 +
This will install squeezeslave in the right directory for you to use. If you want to build it yourself follow the next steps.
 +
 
 +
===Typical build===
 +
  svn checkout http://squeezeslave.googlecode.com/svn/squeezeslave/trunk/squeezeslave
 +
  cd squeezeslave
 +
  make -f makefile.linux26-alsa-display realclean
 +
  make -f makefile.linux26-alsa-display
 +
 
 +
===Or Download Source / look at the squeezeslave wiki===
 +
Download a version of [http://sourceforge.net/project/showfiles.php?group_id=105169 Squeezeslave].  I'm running the latest version which was 0.9-173
 +
 
 +
Look at the slimdevices wiki for the latest options and install instructions http://wiki.slimdevices.com/index.php/SqueezeSlave
 +
 
 
===Installing===  
 
===Installing===  
*You'll want to put it somewhere in your path.
+
*You'll want to put it somewhere in your path. (This is already done if you did the apt-get install method)
**Example: /usr/local/bin
+
*There will be a file in the /bin directory called squeezeslave (there might be something added to this to represent the version you build, just rename the file to squeezeslave and copy to your wanted directory
 +
*Example: /usr/bin
 
====Modify /etc/rc.local====
 
====Modify /etc/rc.local====
Next add the following to /etc/rc.local (this is my setup for two)
+
Next add the following to /etc/rc.local
   /usr/local/bin/squeezeslave -m 00:00:00:00:00:01 -o 0 -s -r &
+
 
   /usr/local/bin/squeezeslave -m 00:00:00:00:00:02 -o 1 -s -r &
+
If your setting up Squeezeslave on your Core then use;
 +
   /usr/bin/squeezeslave -o4 -m00:00:00:00:00:01 -r5 -M/var/log/squeezeslave.log
 +
 
 +
If your setting up Squeezeslave on one of your MD's then use;
 +
   /usr/bin/squeezeslave -o4 192.168.80.1 -m00:00:00:00:00:01 -r5 -M/var/log/squeezeslave.log
 +
 
 +
* the IP address should be the IP address of your Core (**Only needed if your running Squeezeslave on MD's**).
 +
* the MAC address can be whatever you want, it just needs to be the same as the device created in linux mce
 +
* the -o option specifies which output device ie /dev/dsp1 (check with "squeezeslave -L" for available devices then use '-oN' where 'N' is the number next to your output device)
 +
See example output using 'squeezeslave -L' below;
 +
 
 +
<pre>Output devices:
 +
  0: (ALSA) SB Live! Value [CT4832]: ADC Capture/Standard PCM Playback (hw:0,0) (11/46)
 +
  2: (ALSA) SB Live! Value [CT4832]: Multichannel Capture/PT Playback (hw:0,2) (10/42)
 +
  3: (ALSA) SB Live! Value [CT4832]: Multichannel Playback (hw:0,3) (10/42)
 +
  4: (ALSA) USB Audio Device: USB Audio (hw:1,0) (10/42)
 +
  5: (ALSA) front (11/46)
 +
  6: (ALSA) rear (11/46)
 +
  7: (ALSA) center_lfe (11/46)
 +
  8: (ALSA) surround40 (11/46)
 +
  9: (ALSA) surround41 (11/46)
 +
10: (ALSA) surround50 (11/46)
 +
11: (ALSA) surround51 (11/46)
 +
12: (ALSA) iec958 (10/42)
 +
13: (ALSA) spdif (10/42)
 +
14: (ALSA) spdif_playback (11/46)
 +
15: (ALSA) asym_spdif (11/46)
 +
17: (ALSA) asym_analog (42/46)
 +
18: (ALSA) usb_analog (42/46)
 +
19: (ALSA) dmix (42/42)
 +
*20: (ALSA) default (42/46)</pre>
 +
 
 +
 
 +
I am using the No.18 device in the output above and therefore would use '-o18' switch when using the squeezeslave command.
  
* the MAC address can be whatever you want
 
* the -o option specifies which OSS output device ie /dev/dsp1
 
* the -s option tells squeezeslave to wait for a signal to quit rather than control-C
 
 
* the -r option tells squeezeslave to keep retrying to connect to the server, useful if the server is not running yet.
 
* the -r option tells squeezeslave to keep retrying to connect to the server, useful if the server is not running yet.
 +
* the -M option makes it run as a Daemon and creates log
 +
 +
====Fixing sample rate issues====
 +
Squeezeslave only likes the 44.1 kHz sample rate. Anything lower will sounds like the Smurfs, anything higher will sound "slow". This is fixed by converting the source stream to something squeezeslave can cope with.
 +
 +
You need to edit the <i>/etc/squeezeboxserver/convert.conf</i> file so it has these lines in it:
 +
 +
  mp3 flc squeezeslave *
 +
  [sox] -q -t mp3 $FILE$ -t flac -C 0 -r 44100 -
 +
  aac flc squeezeslave *
 +
  [faad] -q -w -f 1 $FILE$ | [flac] -cs --totally-silent --compression-level-0 --ignore-chunk-sizes - | [sox] -q -t flac - -t flac -C 0 -b 16 -r 44100 -
 +
 +
The aac to flc conversion could be shorter, but sox has a problem with '-t wav' with the output of faad and outputs an empty stream, and flac won't actually resample the stream when the --sample-rate=44100 parameter is given to it.
 +
 +
More conversions might be necessary as new stations are found to be problematic, but the strategy is the same: Convert to 'flac', resample to 44100 Hz.
 +
 +
You'll have to restart Squeezebox Server (Logitech Media Server) for the change to take effect.
  
 
===Setting Up Alsamixer===
 
===Setting Up Alsamixer===
Line 26: Line 115:
 
===Setting Up LinuxMCE===
 
===Setting Up LinuxMCE===
  
Next step, manually add the squeezeslave to linuxmce as a squeezebox using the mac address you gave it.
+
Next step, manually add the squeezeslave to linuxmce as a squeezebox using the mac address you gave it. The squeezebox player can be assigned to a room/entertainment area without an MD, in fact this would be a typical installation.
  
 
====Select Device====
 
====Select Device====
* Select '''Device->A/V Equipment'''
+
* Select '''Wizard->Devices->A/V Equipment''' and press 'Add device' on the bottom of the page.
* Select SqueezeBox Player from the dropdown options
+
* In the Device Template dropdown select 'SqueezeBox Player' (template #58) and press 'Pick device template'.
* Assign it to a room and entertainment area.
+
* Assign it to a room in the left dropdown box (-select room-, make sure you select a room that does not yet have a MD in it!), put the MAC of the squeezeslave in the MAC entry field and press update.  
 
* Regen your orbiters and reload the router.
 
* Regen your orbiters and reload the router.
  
== LMCE init script ==
+
Restart the core to make sure it's starting automatically, to run it manually just run the line made in the rc.local
Copy attached script text into a file named /etc/init.d/squeezeslave
+
  
=== Startup Script ===
+
  /usr/bin/squeezeslave -o5 -m 00:00:00:00:00:01 -r5 -M/var/log/squeezeslave.log
<pre>
+
#! /bin/sh
+
### BEGIN INIT INFO
+
# Provides:          squeezeslave
+
# Required-Start:    $local_fs $remote_fs
+
# Required-Stop:     $local_fs $remote_fs
+
# Default-Start:     2 3 4 5
+
# Default-Stop:     S 0 1 6
+
# Short-Description: Initscript for squeezeslave
+
# Description:       This init script make it possible to start squeezeslave as a daemon
+
#                    It is placed in /etc/init.d.
+
### END INIT INFO
+
  
# Author: Magnus Nilsson <magnus@karabas.nu>
+
* Check with ps if it is running:
#
+
  ps aux | grep squeezeslave
 +
**Example output:
 +
root    11502  0.0  0.8  51484  8812 ?        SLl  Apr07  0:33 /usr/bin/squeezeslave -05 -m00:00:00:00:00:02 -r5 -M/var/log/squeezeslave
  
 +
That should do it.
  
# PATH should only include /usr/* if it runs after the mountnfs.sh script
 
PATH=/usr/sbin:/usr/bin:/sbin:/bin
 
DESC="Squeezeslave dameon"
 
NAME=squeezeslave
 
DAEMON=/root/squeezeslave-0.7.1/$NAME
 
DAEMON_ARGS="-o 1 -m 00:04:20:00:00:01 -r -s 192.168.80.1"
 
PIDFILE=/var/run/$NAME.pid
 
SCRIPTNAME=/etc/init.d/$NAME
 
  
# Exit if the package is not installed
+
use /usr/bin/squeezeslave -L for available audio devices
[ -x "$DAEMON" ] || exit 0
+
  
# Read configuration variable file if it is present
+
use /usr/bin/squeezeslave -h for a list of options (see below)
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
+
  
# Load the VERBOSE setting and other rcS variables
+
<pre>/usr/bin/squeezeslave -h
[ -f /etc/default/rcS ] && . /etc/default/rcS
+
squeezeslave 0.9-143
 +
compile flags: linux portaudio:1485 debug signals daemon
  
# Define LSB log_* functions.
+
Squeezeslave is licensed free of charge. There is NO WARRANTY for
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
+
the program. This program is provided "as is" without warranty of
. /lib/lsb/init-functions
+
any kind, either expressed or implied, including, but not limited
 +
to, the implied warranties of merchantability and fitness for a
 +
particular purpose.  The entire risk as to the quality and
 +
performance of the program is with you. Should the program prove
 +
defective, you assume the cost of all necessary servicing, repair
 +
or correction.
  
#
+
Copyright (c) 2004-2007 Richard Titmuss,
# Function that starts the daemon/service
+
              2008-2010 Duane Paddock.
#
+
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 -b --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
+
                || return 1
+
        start-stop-daemon --start -b --quiet --pidfile $PIDFILE --exec $DAEMON -- \
+
                $DAEMON_ARGS \
+
                || return 2
+
        # Add code here, if necessary, that waits for the process to be ready
+
        # to handle requests from services started subsequently which depend
+
        # on this one. As a last resort, sleep for some time.
+
}
+
  
#
+
squeezeslave [options] [<server address>]
# Function that stops the daemon/service
+
The Squeezebox Server address defaults to 127.0.0.1.
#
+
Options:
do_stop()
+
-h, --help:                Prints this message.
{
+
-a,                        Sets the amplitude of a high-frequency tone
        # Return
+
--predelay_amplitude <val>: produced during the predelay (see --predelay).
        #  0 if daemon has been stopped
+
                            The frequency is set at the source's sampling
        #  1 if daemon was already stopped
+
                            rate/2 and the amplitude is in absolute value.
        #  2 if daemon could not be stopped
+
                            For 16-bit sources, the max is 32767, but values
        #  other if a failure occurred
+
                            below 10 are likely to work.  The goal is to
        start-stop-daemon --stop --quiet --retry=TERM/3/KILL/5 --pidfile $PIDFILE --name $NAME
+
                            produce an inaudible signal that will cause DACs
        RETVAL="$?"
+
                            to wake-up and lock before actual samples are
        [ "$RETVAL" = 2 ] && return 2
+
                            played out.  If the DAC locks using only silence,
        # Wait for children to finish too if this is a daemon that forks
+
                            do not use this option (it will default to 0).
        # and if the daemon is only ever run from this initscript.
+
-k, --keepalive <sec>:      Controls how frequently squeezeslave sends a
        # If the above conditions are not satisfied then add some other code
+
                            alive signal to SqueezeCenter.  6.5.x servers
        # that waits for the process to drop all resources that could be
+
                            need this to avoid dropping the player's
        # needed by services started subsequentlyA last resort is to
+
                            connection.  By default, the implementation
        # sleep for some time.
+
                            chooses the right value: 10s for a >=6.5.x server
        start-stop-daemon --stop --quiet --oknodo --retry=0/3/KILL/5 --exec $DAEMON
+
                            and 0s for a <6.5.x server, which means no
        [ "$?" = 2 ] && return 2
+
                            keepalive.
        # Many daemons don't delete their pidfiles when they exit.
+
-M, --daemonize <logfile>  Run squeezeslave as a daemon.
        rm -f $PIDFILE
+
                            Messages written to specified file.
        return "$RETVAL"
+
                            Not supported with lirc and display modes.
}
+
-L, --list                  List available audio devices and exit.
 +
-m, --mac <mac_address>:    Sets the mac address for this instance.
 +
                            Use the colon-separated notation.
 +
                            The default is 00:00:00:00:00:01.
 +
                            SqueezeCenter uses this value to distinguish
 +
                            multiple instances, allowing per-player settings.
 +
-o, --output <device_id>:  Sets the output device id.
 +
                            The default id is 0.
 +
                            The output device ids can be found with -L.
 +
-P, --port <portnumber>:    Sets the SqueezeCenter port number.
 +
                            The default port is 3483.
 +
-p, --predelay <msec>:      Sets a delay before any playback is started.  This
 +
                            is useful if the DAC used for output is slow to
 +
                            wake-up/lock, causing the first few samples to be
 +
                            dropped.
 +
--retry                    Causes the program to retry connecting to
 +
                            SqueezeCenter until it succeeds or is stopped using
 +
                            SIGTERM or keyboard entry (see -s/--signal).
 +
                            If the connection to SqueezeCenter is lost, the
 +
                            program will poll it until it restarts--retry
 +
                            enables retry with a 5 second delay between
 +
                            attempts.
 +
-r <sec>                    For a different retry interval use -r and the
 +
                            desired interval in seconds. (ie. -r10)
 +
                            A value is required for this option.
 +
-s, --signal:              Ignored. Always uses SIGTERM to exit.
 +
-V, --version:              Prints the squeezeslave version.
 +
-v, --volume <sw|off>:      Enables/disables volume changes done by
 +
                            SqueezeCenter during its operation, such as when
 +
                            changing the volume through the web interface or
 +
                            when applying replay gain.  Defaults to sw.
 +
                                  sw:  volume changes performed in software.
 +
                                  off: volume changes ignored.
 +
-Y, --debuglog <logfile>:  Redirect debug output from stderr to <logfile>.
 +
-d, --debug <trace_name>:  Turns on debug tracing for the specified level.
 +
                            The option can be used multiple times to enable
 +
                            multiple levels.
 +
                            Available levels:
 +
                                  all
 +
                                  slimproto
 +
                                  slimaudio
 +
                                  slimaudio_buffer
 +
                                  slimaudio_buffer_v
 +
                                  slimaudio_decoder
 +
                                  slimaudio_decoder_r
 +
                                  slimaudio_decoder_v
 +
                                  slimaudio_http
 +
                                  slimaudio_http_v
 +
                                  slimaudio_output
 +
                                  slimaudio_output_v</pre>
  
#
+
==Troubleshooting==
# 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
+
If you use a USB audio card and squeezeslave gives you an error, try the following
  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
+
        ;;
+
  #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|restart|force-reload}" >&2
+
        exit 3
+
        ;;
+
esac
+
  
:
+
First of all make sure you are running the latest version.
  
</pre>
+
Edit your /etc/asound.conf and add the following
  
===Make script executable===
+
<pre>pcm.usb_analog {
sudo chmod +x /etc/init.d/squeezeslave
+
        type asym
===Modify Parameters===
+
        playback.pcm "plug:dmix:1"
Modify parameters in the beginning of the file to suite your needs.  
+
        capture.pcm "plughw:1"
* MAC address
+
}</pre>
* slimserver host
+
* binary location
+
* soundcard device.
+
  
Below is the parameters you should change:
+
After this restart alsa
  
NAME=squeezeslave
+
  /etc/init.d/alsa-utils restart
DAEMON=/root/squeezeslave-0.7.1/$NAME
+
DAEMON_ARGS="-o 1 -m 00:04:20:00:00:01 -r -s 192.168.80.1"
+
  
===Setup to Run at Start Up===
+
check your alsamixer to make sure pcm is unmuted and on a good level
* Run from shell:
+
  
  sudo default-rd.d /etc/init.d/squeezeslave default 50
+
Try squeezeslave again
 +
== Information from other places ==
 +
The slimdevices forum has a nice [http://forums.slimdevices.com/showthread.php?86253-Poor-Man-s-Multiroom-Audio post] on how to setup multiple Squeezeslave zones with a single soundcard.
  
* You should now be able to start/stop squeezeslave from shell.
+
In case the above link does not work anymore, there is a [http://deb.linuxmce.org/PoorMansMultiroomAudio.pdf PDF] output of said forum entry available.
+
sudo /etc/init.d/squeezeslave start
+
 
+
* Check with ps if it is running:
+
  ps aux | grep squeezeslave
+
**Example output:
+
root      9007  0.0  0.3  64116  5436 ?        Sl  Jun18  0:03 /root/squeezeslave-0.7.1/squeezeslave -o 1 -m    00:04:20:00:00:01 -r -s 192.168.80.1
+
 
+
*To stop:
+
 
+
sudo /etc/init.d/squeezeslave stop
+
 
+
* Restart your core and check if everything start as it should, including squeezeslave.
+
 
+
That should do it.
+

Latest revision as of 16:44, 16 January 2013

Whats does it do?

Squeezeslave basically makes it possible to add additional 'virtual' Squeezeboxes to your Core or MD's just by adding additional sound-cards. Each Squeezeslave/Sound-card combo uses about 4-5% CPU on an ATOM/Ion based MD. We have tested an ATOM/Ion based MD running 3 x Squeezeslave/Sound-Card combo's while playing a ripped DVD from the Core without any problems at all. Using Squeezeslave/Sound-Card combo's makes it possible to have several independent audio outputs from your Core or from an MD allowing you to use the 2nd Zone of your Surround Amp for example to provide audio to an adjoining room eg a bathroom or maybe a kitchen. All of this expands the options you have when designing your system, gives you enormous additional flexibility to locate additional audio sources where you need them, and reduces the energy footprint of your system at the same time (in comparison to adding additional physical Squeezeboxes).

Squeezeslave Setup

Here's how to setup squeezeslave to run on your core or in fact any of your MD's. It's fairly straight forward but currently requires manual config/install of each Squeezeslave - I'm working on making this something you can just configure from Web Admin simply and quickly. One small issue is that because squeezeslave uses the OSS interface, you will need a separate sound card for each instance of squeezeslave you want to run.

Hardware Supported

The Startech Virtual 7.1 USB Audio Adapter (model No. ICUSBAUD107) works fine. This tiny USB Stick style adapter works perfectly under 7.10, 9.10 & 10.04. No installation...just plug it in and its ready a few secs later. Only stereo out jack and Mic input jack.

Many other brands of USB Audio adapter will probably work too. Please add your experiences with other working hardware here too.

Under LinuxMCE 0810 it may be necessary to downgrade Alsa in order for the device to appear (in 'aplay -l' or 'squeezeslave -L'). Be aware that downgrading alsa will remove audio over hdmi capabilities on the affected computer.

Setting Up Squeezeslave on your Core or MD's

If you want to setup Squeezeslave on your Core then either open Konsole session from the KDE Desktop or ssh in from another machine and sudo yourself. If you want to set up Squeezeslave on an MD then ssh into your Core and then use;

ssh moonNNN (**where NNN is the ID number of the MD you want to ssh into.)

You can find the ID of your MD from the Web Admin page at Wizard->Devices->Media Directors and the ID is the number with a '#' in front of it at the top of each MD section. Now follow the instructions below for each MD you want to add Squeezeslave too.

Needed Dependencies

System libraries needed are subversion and libasound2-dev

 sudo apt-get install subversion
 sudo apt-get install libasound2-dev

Since squeezeslave is only updating the display versions of their makefiles also needed for building

 sudo apt-get install libncurses5-dev
 sudo apt-get install liblircclient-dev

Squeezeslave is available in the debs

Easiest for anybody will be

 sudo apt-get install squeezeslave

This will install squeezeslave in the right directory for you to use. If you want to build it yourself follow the next steps.

Typical build

 svn checkout http://squeezeslave.googlecode.com/svn/squeezeslave/trunk/squeezeslave
 cd squeezeslave
 make -f makefile.linux26-alsa-display realclean
 make -f makefile.linux26-alsa-display

Or Download Source / look at the squeezeslave wiki

Download a version of Squeezeslave. I'm running the latest version which was 0.9-173

Look at the slimdevices wiki for the latest options and install instructions http://wiki.slimdevices.com/index.php/SqueezeSlave

Installing

  • You'll want to put it somewhere in your path. (This is already done if you did the apt-get install method)
  • There will be a file in the /bin directory called squeezeslave (there might be something added to this to represent the version you build, just rename the file to squeezeslave and copy to your wanted directory
  • Example: /usr/bin

Modify /etc/rc.local

Next add the following to /etc/rc.local

If your setting up Squeezeslave on your Core then use;

 /usr/bin/squeezeslave -o4 -m00:00:00:00:00:01 -r5 -M/var/log/squeezeslave.log

If your setting up Squeezeslave on one of your MD's then use;

 /usr/bin/squeezeslave -o4 192.168.80.1 -m00:00:00:00:00:01 -r5 -M/var/log/squeezeslave.log
  • the IP address should be the IP address of your Core (**Only needed if your running Squeezeslave on MD's**).
  • the MAC address can be whatever you want, it just needs to be the same as the device created in linux mce
  • the -o option specifies which output device ie /dev/dsp1 (check with "squeezeslave -L" for available devices then use '-oN' where 'N' is the number next to your output device)

See example output using 'squeezeslave -L' below;

Output devices:
  0: (ALSA) SB Live! Value [CT4832]: ADC Capture/Standard PCM Playback (hw:0,0) (11/46)
  2: (ALSA) SB Live! Value [CT4832]: Multichannel Capture/PT Playback (hw:0,2) (10/42)
  3: (ALSA) SB Live! Value [CT4832]: Multichannel Playback (hw:0,3) (10/42)
  4: (ALSA) USB Audio Device: USB Audio (hw:1,0) (10/42)
  5: (ALSA) front (11/46)
  6: (ALSA) rear (11/46)
  7: (ALSA) center_lfe (11/46)
  8: (ALSA) surround40 (11/46)
  9: (ALSA) surround41 (11/46)
 10: (ALSA) surround50 (11/46)
 11: (ALSA) surround51 (11/46)
 12: (ALSA) iec958 (10/42)
 13: (ALSA) spdif (10/42)
 14: (ALSA) spdif_playback (11/46)
 15: (ALSA) asym_spdif (11/46)
 17: (ALSA) asym_analog (42/46)
 18: (ALSA) usb_analog (42/46)
 19: (ALSA) dmix (42/42)
*20: (ALSA) default (42/46)


I am using the No.18 device in the output above and therefore would use '-o18' switch when using the squeezeslave command.

  • the -r option tells squeezeslave to keep retrying to connect to the server, useful if the server is not running yet.
  • the -M option makes it run as a Daemon and creates log

Fixing sample rate issues

Squeezeslave only likes the 44.1 kHz sample rate. Anything lower will sounds like the Smurfs, anything higher will sound "slow". This is fixed by converting the source stream to something squeezeslave can cope with.

You need to edit the /etc/squeezeboxserver/convert.conf file so it has these lines in it:

 mp3 flc squeezeslave *
 	[sox] -q -t mp3 $FILE$ -t flac -C 0 -r 44100 -
 aac flc squeezeslave *
 	[faad] -q -w -f 1 $FILE$ | [flac] -cs --totally-silent --compression-level-0 --ignore-chunk-sizes - | [sox] -q -t flac - -t flac -C 0 -b 16 -r 44100 -

The aac to flc conversion could be shorter, but sox has a problem with '-t wav' with the output of faad and outputs an empty stream, and flac won't actually resample the stream when the --sample-rate=44100 parameter is given to it.

More conversions might be necessary as new stations are found to be problematic, but the strategy is the same: Convert to 'flac', resample to 44100 Hz.

You'll have to restart Squeezebox Server (Logitech Media Server) for the change to take effect.

Setting Up Alsamixer

Next make sure all the volume levels in the mixer (alsamixer) are set correctly

 alsamixer

Make sure that the settings are as desired and save (Esc button)

Setting Up LinuxMCE

Next step, manually add the squeezeslave to linuxmce as a squeezebox using the mac address you gave it. The squeezebox player can be assigned to a room/entertainment area without an MD, in fact this would be a typical installation.

Select Device

  • Select Wizard->Devices->A/V Equipment and press 'Add device' on the bottom of the page.
  • In the Device Template dropdown select 'SqueezeBox Player' (template #58) and press 'Pick device template'.
  • Assign it to a room in the left dropdown box (-select room-, make sure you select a room that does not yet have a MD in it!), put the MAC of the squeezeslave in the MAC entry field and press update.
  • Regen your orbiters and reload the router.

Restart the core to make sure it's starting automatically, to run it manually just run the line made in the rc.local

 /usr/bin/squeezeslave -o5 -m 00:00:00:00:00:01 -r5 -M/var/log/squeezeslave.log
  • Check with ps if it is running:
 ps aux | grep squeezeslave
    • Example output:
root     11502  0.0  0.8  51484  8812 ?        SLl  Apr07   0:33 /usr/bin/squeezeslave -05 -m00:00:00:00:00:02 -r5 -M/var/log/squeezeslave

That should do it.


use /usr/bin/squeezeslave -L for available audio devices

use /usr/bin/squeezeslave -h for a list of options (see below)

/usr/bin/squeezeslave -h
squeezeslave 0.9-143
compile flags: linux portaudio:1485 debug signals daemon

Squeezeslave is licensed free of charge. There is NO WARRANTY for
the program. This program is provided "as is" without warranty of
any kind, either expressed or implied, including, but not limited
to, the implied warranties of merchantability and fitness for a
particular purpose.  The entire risk as to the quality and
performance of the program is with you.  Should the program prove
defective, you assume the cost of all necessary servicing, repair
or correction.

Copyright (c) 2004-2007 Richard Titmuss,
              2008-2010 Duane Paddock.

squeezeslave [options] [<server address>]
The Squeezebox Server address defaults to 127.0.0.1.
Options:
-h, --help:                 Prints this message.
-a,                         Sets the amplitude of a high-frequency tone
--predelay_amplitude <val>: produced during the predelay (see --predelay).
                            The frequency is set at the source's sampling
                            rate/2 and the amplitude is in absolute value.
                            For 16-bit sources, the max is 32767, but values
                            below 10 are likely to work.  The goal is to
                            produce an inaudible signal that will cause DACs
                            to wake-up and lock before actual samples are
                            played out.  If the DAC locks using only silence,
                            do not use this option (it will default to 0).
-k, --keepalive <sec>:      Controls how frequently squeezeslave sends a
                            alive signal to SqueezeCenter.  6.5.x servers
                            need this to avoid dropping the player's
                            connection.  By default, the implementation
                            chooses the right value: 10s for a >=6.5.x server
                            and 0s for a <6.5.x server, which means no
                            keepalive.
-M, --daemonize <logfile>   Run squeezeslave as a daemon.
                            Messages written to specified file.
                            Not supported with lirc and display modes.
-L, --list                  List available audio devices and exit.
-m, --mac <mac_address>:    Sets the mac address for this instance.
                            Use the colon-separated notation.
                            The default is 00:00:00:00:00:01.
                            SqueezeCenter uses this value to distinguish
                            multiple instances, allowing per-player settings.
-o, --output <device_id>:   Sets the output device id.
                            The default id is 0.
                            The output device ids can be found with -L.
-P, --port <portnumber>:    Sets the SqueezeCenter port number.
                            The default port is 3483.
-p, --predelay <msec>:      Sets a delay before any playback is started.  This
                            is useful if the DAC used for output is slow to
                            wake-up/lock, causing the first few samples to be
                            dropped.
--retry                     Causes the program to retry connecting to
                            SqueezeCenter until it succeeds or is stopped using
                            SIGTERM or keyboard entry (see -s/--signal).
                            If the connection to SqueezeCenter is lost, the
                            program will poll it until it restarts.  --retry
                            enables retry with a 5 second delay between
                            attempts.
-r <sec>                    For a different retry interval use -r and the
                            desired interval in seconds. (ie. -r10)
                            A value is required for this option.
-s, --signal:               Ignored. Always uses SIGTERM to exit.
-V, --version:              Prints the squeezeslave version.
-v, --volume <sw|off>:      Enables/disables volume changes done by
                            SqueezeCenter during its operation, such as when
                            changing the volume through the web interface or
                            when applying replay gain.  Defaults to sw.
                                  sw:  volume changes performed in software.
                                  off: volume changes ignored.
-Y, --debuglog <logfile>:   Redirect debug output from stderr to <logfile>.
-d, --debug <trace_name>:   Turns on debug tracing for the specified level.
                            The option can be used multiple times to enable
                            multiple levels.
                            Available levels:
                                  all
                                  slimproto
                                  slimaudio
                                  slimaudio_buffer
                                  slimaudio_buffer_v
                                  slimaudio_decoder
                                  slimaudio_decoder_r
                                  slimaudio_decoder_v
                                  slimaudio_http
                                  slimaudio_http_v
                                  slimaudio_output
                                  slimaudio_output_v

Troubleshooting

If you use a USB audio card and squeezeslave gives you an error, try the following

First of all make sure you are running the latest version.

Edit your /etc/asound.conf and add the following

pcm.usb_analog {
        type asym
        playback.pcm "plug:dmix:1"
        capture.pcm "plughw:1"
}

After this restart alsa

 /etc/init.d/alsa-utils restart

check your alsamixer to make sure pcm is unmuted and on a good level

Try squeezeslave again

Information from other places

The slimdevices forum has a nice post on how to setup multiple Squeezeslave zones with a single soundcard.

In case the above link does not work anymore, there is a PDF output of said forum entry available.