Playing records on Symfonisk
4 Jun 2025
Joshua Moerman
At home, we have a IKEA Symfonisk bookshelf speaker. We are really happy with it. It has great sound, looks great and is easy in use. However, it has one big ommission: it has no physical inputs. It can only work with WiFi or Bluetooth. This sucks, because it means I cannot connect my records player to it.
Of course, this is by design. The IKEA Symfonisk is a really cheap way to get a Sonos system at home. And for Sonos, it is obviously a way to get people to buy their more expensive units. They have a unit with all kinds of inputs which can connect to the system. However, this unit is way too big for my taste (and too expensive).
So can I DIY this problem? Yes of course!
Overview
Here is my current set-up:
- The record player goes in a pre-amp (as usual).
- The pre-amp is connected to a Raspberry Pi.
- The Raspberry Pi creates a radio stream (on the local network).
- The Sonos system can stream this radio stream to the speakers.
Open-source software
The Raspberry Pi is flashed with a very standard debian os. I have no screen and keyboard attached, everything is set up remotely via ssh.
For the radio stream I am using icecast. I have used this before when streaming live DJ-sets to friends. The icecast provides a server to which clients can stream music, and then broadcasts it to whoever wants to listen. It is a bit overkill for the set-up at home, but it’s a tool I already knew how to use.
As the client which streams music to the icecast server, I am using darkice. This was new for me. In the past, I used GUI applications for this. But that won’t fit the bill here, since I want to only use the record player and the Sonos system. I don’t want to bother starting some app on a computer. As I will explain below, we want a new version of darkice.
Add
deb https://deb.debian.org/debian experimental main
to the file
/etc/apt/sources.list
Then install the tools we need:
sudo apt install icecast2
sudo apt -t experimental install darkice
Configuration
The two files which are important here are:
/etc/icecast2/icecast.xml
/etc/darkice.cfg
These configuration files are well documented, and you can figure this out yourself.
For darkice, you have to tell it where the sound is coming from (in this case a USB-port).
[input]
device = plughw:CARD=Device,DEV=0
sampleRate = 48000
bitsPerSample = 16
channel = 2
[icecast2-0]
bitrateMode = abr
format = mp3
bitrate = 320
server = localhost
port = 8000 # or whatever configured for icecast
# etc ...
When running icecast and darkice, it should now work. It is a bit of a struggle to listen to a radio stream url on the Sonos app. It’s easier on the desktop app, as there is a menu option to add a radio stream. Even easier is to use the SoCo in python, but that is for another time.
Running everything at boot
Next, we have to make sure everything starts a boot. This is important, because I also want other to be able to start the system and play records. The radio stream will always be active, and you can connect to it via the Sonos app whenever you want.
Starting icecast at boot is no problem, it enables itself when installing (if I remember correctly). Darkice was a bit more effort.
The old version of darkice (which is in debian stable), has init.d scripts which do not work at all (trust me, I tried). The newer version of darkice acknowledged this and removed them completely. So how should we do it instead?
The new way to do this is with systemd. This was new to me, but it is actually quite easy. Create the file:
/etc/systemd/system/darkice.service
with content:
[Unit]
Description=Darkice
Requires=icecast2.service
After=icecast2.service
[Service]
ExecStart=/usr/bin/darkice
[Install]
WantedBy=multi-user.target
The enable it:
sudo systemctl daemon-reload
sudo systemctl enable darkice
Further thoughts
This set-up works well for me now. Here are some more thoughts / alternative solutions:
-
“Psu” describes a way to use AirPlay to stream records to Sonos on his blog. This could also be a good solution here. However, the point of initiation is different, the AirPlay sender (here: the raspberry pi) must start the stream. This means you will have to interact with the raspberry pi each time you play a records. I wanted a solution which I could start from the Sonos app.
-
I have tried to find AirPlay senders, as standalone devices. These do not seem to exist, only AirPlay receivers. If someone finds it, I would be interested!
-
You can find people who hack their Symfonisk devices (like adding better speakers). I have also seen someone who added physical inputs to it. However, from what I understood, it bypasses some things like stand-by mode. This didn’t seem efficient, and I didn’t want to risk breaking the Symfonisk.
-
I recently heard the Sonos-IKEA collaboration stopped. I can really recommend the speakers, so if you can still buy them, do it!
-
The Sonos app does not make it very easy to listen to a radio stream url. To ease this, I made a simple web app in python, using SoCo, which will tell the Sonos system immediately connect to the radio stream. (There is even a QR code on the record player!)
-
You can also put your music library on the same Raspberry Pi. To do this, you’ll need to install samba.
-
You can comment on this post on mastodon.