This article was written in 2021. It might or it might not be outdated. And it could be that the layout breaks. If that’s the case please let me know.
Making your own Raspberry Pi music streamer
I like to build stuff myself. I made my own speakers, both in the kitchen and in the living room for instance. And to stream music to these speakers I also made my own streaming devices with a DAC using a Raspberry Pi. This gives me the freedom to implement any streaming protocol I need. Right now I need Spotify Connect and Airplay, but if any time in the future I need some other protocol I can implement that as well.
I find the open source implementations of both Spotify Connect and Airplay very stable. We have been using this setup for a few years now, and I can say that it is much more stable than the Pioneer system we used before.
Here is a step by step setup guide.
Get your hardware
I use a Dion Audio Loco as a DAC and amplifier in the kitchen. And I use the horribly named Audiophonics I-Sabre ES9038Q2M connected to an old Mission Cyrus II in the living room. These are hifi DACs, and priced accordingly. But you can use any raspberry pi DAC that you want.
Connect your DAC to your Raspberry Pi. I use a Raspberry Pi 3B+. It is powerful enough, and it has a much better Wifi antenna than the 3B (without the + sign). So you don’t need a Raspberry Pi 4.
That’s the easy part. Now we need the software.
The simplest, but least flexible way
There are a few ways to do this. There is for instance Moode Audio, which is pretty easy to setup. It is much easier to get things going for the first time, but since it is a system that someone else makes, it is less flexible. I tried it a few times, it works really well, but every time I switch back to my own bare bones version. Which I explain here.
Install Raspbian Lite
You don’t need a desktop version of the operating system on your Raspberry Pi. We will setup the whole thing using the command line, which gives us extra nerd points.
First install Raspberry Pi Imager on your computer. This makes it easy to burn the Raspbian Lite operating system onto your micro SD card. Instert the card into your own computer, click on Choose OS > Raspberry Pi OS (other) > Raspberry Pi OS Lite (32 bit)
, and burn it onto your card.
When the burning is done, insert your SD card into your computer again. You need a add a few files to it before you startup the Raspberry Pi:
- Add an empty file with the name
ssh
to the/boot
folder. - Add a file with the name
wpa_supplicant.conf
to the boot folder as well. In this file you specify your Wifi network. If you use ethernet you don’t need this. You should change the country to the country you live in:
country=NL
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="The name of your Wifi network"
scan_ssid=1
psk="Y0ur 5up3r 53cr3t p4ssw0rd"
}
With these files in place you can now insert the card into your Pi and start it up.
SSH into your Pi.
My router has a nice overview of all the devices connected to it, with their IP addresses. But there are other ways to find the IP address of this new Raspberry Pi. Find it, then connect to your Pi
ssh pi@192.168.13.37
The default password is raspberry
It works, hurray!
Before we install anything, we need to do some housekeeping. When I setup a new Raspberry Pi, these are the stept I take.
Read the details about how to setup a Raspberry Pi
First change the password and network name:
echo "pi:yoursecretpassword" | sudo chpasswd
If you want to you can change the name of your device.
sudo sed -i "s/raspberrypi/nerdymusicplayer/" /etc/hostname
sudo sed -i "s/raspberrypi/nerdymusicplayer/" /etc/hosts
Expand the filesystem to use the complete disk
sudo raspi-config
Use your arrow keys to select Advanced Options > Expand Filesystem
Select OK, and restart the Pi. Now ssh into the Pi again (use your new password).
sudo apt update
sudo apt dist-upgrade
This can take a while. After the upgrade is complete, reboot again, just to be sure.
Setup the audio device
You will need to tell your device to use your DAC. This is usually done by editing the file /boot/config.txt
. I use Nano as a text editor. Which is a bit weird when you use it for the first time, but you will get used to it.
sudo nano /boot/config.txt
Find the part where it says # Enable audio (loads snd_bcm2835)
Below that, for the Dion Audio Loco, it should look like this:
# Enable audio (loads snd_bcm2835)
dtparam=audio=off
dtoverlay=dionaudio-loco
For the Audiophonics I-Sabre ES9038Q2M it should look like this:
# Enable audio (loads snd_bcm2835)
dtparam=audio=off
dtoverlay=i-sabre-Q2M
Read the manual of your DAC to find out how it should be done exactly.
In Nano you have to type control + o (write oot) and control + x to save and exit.
Now type alsamixer
into the terminal and you should now see all the options that your DAC offers. Quite a few when you use the Audiophonics, and only volume when you use the Loco. I always set the volume here to maximum since all volume is controlled using software.
Install Airplay
There is a brilliant, very stable and well maintained open source implementation of the Airplay Protocol called Shairport-Sync. Have been using it for years now and it never failed me.
Installation is pretty straightforward. You should probably read the simple installation guide. Here’s a functional summary of that guide.
First we need to install all the things that Shairport Sync needs in order to run. For the basic configuration, this should work:
sudo apt install build-essential git xmltoman autoconf automake libtool \
libpopt-dev libconfig-dev libasound2-dev avahi-daemon libavahi-client-dev libssl-dev libsoxr-dev
Now install Shairport Sync
git clone https://github.com/mikebrady/shairport-sync.git
cd shairport-sync
autoreconf -fi
./configure --sysconfdir=/etc --with-alsa --with-soxr --with-avahi --with-ssl=openssl --with-systemd
make
sudo make install
Some steps might take a while.
Now we need to change some settings in the config file:
sudo nano /etc/shairport-sync.conf
Read through it. Indeed, there are quite some settings! Most of the can probably be ignored, but there a a few that you could change. Make sure you remove the //
at the beginning if each line you want to use. These are some of the settings I use
interpolation = "soxr";
output_backend = "alsa";
allow_session_interruption = "yes"; // Gives us the power to switch music when we don’t like what others are playing.
output_rate = 88200; // Higher numbers don’t seem to work on my Raspberry Pi
output_format = "S32"; // These numbers are not supported by all DACs
We want to make sure that Shairport Sync starts whenever we restart the Pi:
sudo systemctl enable shairport-sync
And now we want to start it to test it
sudo systemctl restart shairport-sync
Now open your Apple device, and your nerdymusicplayer
should appear in the list of Airplay devices.
Install Spotify Connect
If you have a Spotify Premium account you can play your music via your Raspberry Pi. For this I use Raspotify. Installation is super easy, as you can read on their site:
curl -sL https://dtcooper.github.io/raspotify/install.sh | sh
Now edit the config file:
sudo nano /etc/default/raspotify
There is not much to change here. I always set the bitrate to the highest quality:
BITRATE="320"
You might want to change the initial volume to something else that 100, especially when you control the volume from within Spotify, and not with some sort of a physical volume knob on your stereo. For instance:
VOLUME_ARGS="--initial-volume=20"
This works fine in the Blasterchef in our kitchen.
After changing the settings you should restart Raspotify:
sudo systemctl restart raspotify
The Pi should now appear as one of the devices in your Spotify app.
If the Pi doesn’t appear in Spotify after a restart you might need to type this:
sudo systemctl enable raspotify
Done.
There are other protocols to stream music to your Raspberry Pi. Since I never used them, I cannot explain them to you. But if you managed to complete this super nerdy setup, you should be able to figure it out by using the correct terms in Duckduckgo.
Final steps
You should SSH into your Pi every now and then in order to check for updates:
sudo apt update
sudo apt dist-upgrade
Power saving
There are quite a few ways to save power. Some save lots, other are marginal.
Read all the power saving options
First you might want to add a power button to your Pi in order to shut it down when you don’t need it. This is an excellent tutorial.
Disable stuff you don’t need
If you don’t need ethernet of USB you should disable the ethernet and the USB block:
sudo crontab -e
Now add this line to the bottom of that file:
@reboot echo '1-1' |sudo tee /sys/bus/usb/drivers/usb/unbind
This saves lots.
If you do use ethernet but don’t need wifi, you should disable wifi:
sudo nano /boot/config.txt
Add this line to the bottom of that file:
# Disable Wifi
dtoverlay=disable-wifi
If you don’t use bluetooth, you should disable it:
sudo nano /boot/config.txt
Add this line to the bottom of that file:
# Disable Bluetooth
dtoverlay=disable-bt
And you should disable the related services, because you don’t need them:
sudo systemctl disable hciuart.service
sudo systemctl disable bluealsa.service
sudo systemctl disable bluetooth.service
You can disable the LEDs in /boot/config.txt
as well. Add these lines:
# Disable the ACT LED.
dtparam=act_led_trigger=none
dtparam=act_led_activelow=off
# Disable the PWR LED.
dtparam=pwr_led_trigger=none
dtparam=pwr_led_activelow=off
Read-only file system
If everything works, and you are happy with your setup, you can choose to switch to a read only file system. This way you cannot break things by accident. Type sudo raspi-config
. Now use your arrow keys to go to Performance Options > Overlay File System
. Select Yes to enable the overlay file system, and select Yes to make the boot partition read only. When you’re done, use your right arrow key to Finish, and reboot.
Just remember, from now on before you want to change something, make sure to disable the overlay file system, and if necessary, make the boot partition writable again.