Open, future-proof, multi-room audio
Table of contents
You want high-quality connected speakers for your home without depending on shitty apps that stop working in a year? You want to stream from your own hardware and control everything with Free Software? Then this article is for you!
Problem
I have the privilege of living in a spacious Altbau flat in Berlin, and I often find myself working in the home office room, listening to music, and then walking into the kitchen at the other end of the flat to brew new tea 🫖 or prepare a snack 🥐 Of course, I’d like to keep listening to the music. Maybe I’d even like the music to be playing in both rooms for some time, e.g. when walking back and forth, or when cleaning… Ideally, the music then would also by in-sync, so that it’s not annoying when you are in between rooms, or sound spills over from one room into the other.
This is called multi-room audio, and there are a bunch of solutions for it. Most expensive speaker brands have their own solution, and then Google has GoogleCast (previously known as ChromeCast) and Apple has AirPlay. Most of these require specific (proprietary) apps, and most assume that the device controlling the speakers is also the one sending the audio, typically your phone. But I already have a home server that stores all my music and is on 24/7. I really want to be able to have this computer stream to the speakers—and only use apps on phone/desktop/web to select what to stream (and to which speakers).
Since there are many similar-but-different setups, and the terms “client” and “server” can be confusing in this context, here’s how I define the important terms:
- Server: One computer that stores all the high-quality music and sends it to the speakers when instructed to.
- Speakers: Receive audio from the server via WiFi. May have play/pause/next/volume buttons that should work as expected.
- Controllers: An app on another device in the same network that controls playback (but isn’t required to be running for music to keep on playing).
- Protocols: Language used between Server↔Speakers and Controllers↔Server.
There is one server, multiple (pairs of) speakers and one or more controllers. The controllers instruct the server to push music to the speakers.1
Additional requirements
- Real speakers: I want decent quality speakers that sound well and don’t look like space ships. Ideally, they also support ad-hoc connections via Bluetooth, e.g. when there are guests.
- Open Source: I want the software running on the server and the controllers to be Free and Open Source software. Of course, it would be nice to have on the speakers, too, but I am willing to compromise here. After initial setup, I don’t want to have to use a proprietary speaker app ever again.
- Medium: WiFi or Ethernet are required as medium, since Bluetooth may not span the entire flat. Bluetooth also always forces lossy re-encoding which is not desirable.
- Easy-of-use: It doesn’t need to be easy to setup, but afterwards, it needs to just work. Sticking a RasPi on every speaker in every room, and having to manually turn that on/off or wait for it to boot, is not an option for me.
Solution
Skip to the summary if you are in a rush!
Server
“A media server that lets you play audio sources […] to AirPlay 1 and 2 receivers, Chromecast receivers[…].”
This is obviously the heart of the setup. After a lot of searching, I found OwnTone, an incredible piece of software that does exactly what I want:
- Supports both Apple Airplay 2 and GoogleCast to communicate with speakers (although not equally well, see below).
- Exposes a Music-Player-Deamon compatible interface.
- Runs its own web-server that you can use as a controller.
- Has other features irrelevant to me but that might be useful to you (e.g. can integrate Spotify and Last.fm).
Speakers
“For more than four decades, Audio Pro has been crafting award-winning speakers, and during the last few decades also taking part in shaping the world of wireless audio with our innovative technology and globally recognized sound quality.”
Since OwnTone supports AirPlay2 and GoogleCast, the only requirement for the speakers is that they support either of these. It isn’t required that they are from the same brand, but might make sense for easier maintenance and setup. You should decide between AirPlay and GoogleCast, though (see below).
I did some researching and ended up getting all my speakers from AudioPro. I got a C10 MkII W Classic Dune and the A28 W first, to evaluate whether everything works. And about a year later, I also got a A48 W and a second C10 MkII W (this time in grey).
What can I say? I really love these speakers! I am not being paid for this article, so I won’t spend too much time praising this company, but I will still mention what I think makes them stand out:
- Excellent quality of the hardware, a multitude of available form-factors and designs (both “classic” and more modern).
- Amazing sound! I am not an audiophile, and don’t know how to measure this. But I can say that many guests are surprised by the sound, especially from the C10s, which look so small.
- All speakers are active speakers (for pairs, one of them is active and one passive).
- In WiFi standby they consume less than 1W (I measured this), which is low enough for me to always leave them in standby without a guilty conscience.
- Great connectivity. Beside the mentioned AirPlay2 and GoogleCast, they have analogue and digital ins (optical and HDMI), and of course Bluetooth. The HDMI port does eARC which works plug’n’play with my TV (they turn on/off with the TV and the TV’s remote controls the volume on them).
- They have configurable hardware buttons, that I don’t use much, though.
An important reason I went for AudioPro is that they have been doing multi-room audio and streaming for some time now. The features are consistent throughout their current product range and also over time. On the other hand, e.g. Teufel switched between their own multi-room audio protocol and Apple’s/Google’s multiple times, and now it’s just confusing which device supports what (and what they might do a year from now).

I have also had a positive experience with the AudioPro support:
- With one of the speakers I had a physical problem where a low-volume high-pitched sound would be audible when the speaker was on but not playing anything. I returned it, and they actually fixed it (instead of just replacing it). I think that’s great, both, for the planet, but also because it increases the chance that speakers can be fixed when they get older.
- I also reported one bug with the firmware which they fixed it an upgrade.
Price-wise AudioPro is positioned in the higher end consumer space, so they are probably not in everyone’s budget. However, you can typically get better prices with smaller stores than on their official site.
Protocol (Server ↔ Speakers)
“AirPlay is a proprietary wireless communication protocol stack/suite developed by Apple Inc. that allows the streaming of multimedia and device screens, together with related metadata, between compatible devices.”
GoogleCast may seem superior to AirPlay, because it natively supports FLAC and Vorbis, which AirPlay does not. However, OwnTone’s support for AirPlay is much more mature, and they strongly recommend using it whenever possible. The highly accurate synchronisation between the speakers is only supported with AirPlay at the moment.
Another reason to avoid GoogleCast is that it needs to be explicitly enabled on AudioPro speakers, prompting you with some EULA and a privacy policy. I couldn’t reliably find out what this means, but it was upsetting enough that I decided not to enable it and just use Airplay (hoping it doesn’t do any telemetry). Will do some wiresharking at some point to figure out if anything happens beyond firmware-upgrade-checks 🦈
One implication is that MP3s are streamed as-is, but FLAC files are converted on-the-fly to ALAC (Apple Lossless Audio Codec) when streaming to the speakers. For typical FLAC resolution (16bit, 44.1 Khz) this conversion is lossless, but higher resolution is lost. This is not perfect, but I only have very few higher resolution FLACs, and I am not sure I could hear the difference for those. Plus I imagine this might be fixed in software in the future. CPU-load on the server is extremely low during live-conversion (<5% on one core).
AirPlay also handles the back-direction of communication, e.g. when someone presses pause on the speaker, the music pauses server-side (and also stops playing on all other speakers).
Controllers and control protocol
“Music Player Daemon (MPD) is a flexible, powerful, server-side application for playing music. Through plugins and libraries it can play a variety of sound files while being controlled by its network protocol.”
MPD is a well-established open source music player software. It runs as a server and requires a separate client to control it (select songs, play/pause…). Since it has been around a while, there are many such clients. I have been using the following:
The multi-room audio setup described here does not use MPD. But OwnTone provides a compatible interface, so that we can use any of the client software as the controller for the OwnTone server. OwnTone also serves a web-interface that can be directly used as the controller, but I rarely do so (because I find the native MPD clients mentioned above better).
One nice aspect of the MPD protocol that I was previously unaware of is “speaker selection”. For our use-case, this is really important! In the screenshot above, you see the Cantata client playing a song and the opened drop-down menu for output selection (“Ausgaben” in Kraut-speak). Below it lists all the AirPlay and ChromeCast compatible speakers that OwnTone detected in the (W)LAN. You can dynamically enable/disable any of them, and they will wake up from standby and immediately start playing in-sync with the existing ones (or go to sleep when disabled). It’s actually quite magical ✨️
All the MPD clients mentioned above support this, so you can easily flip on the speaker in the kitchen, before leaving the desk. But you can also just take out your phone while in the kitchen and turn on the speaker if you forgot to do so previously.
Summary
Buy speakers that support AirPlay2, like those by AudioPro. Install OwnTone on your server and use its Apple Airplay 2 support to interact with the speakers. Any MPD-client can be used to control the music being played.
The experience is really great. There are no rough edges; things just work.
More tinkering
Everything discussed previously can be done with open source software, i.e. after using the vendor app to make the speaker join your WiFi, you never need the vendor app again.
But there is even more you can do with the help of some other tools…
A small thing is per-speaker EQ support which is currently reserved to the vendor app. A more fancy feature is speaker-to-speaker streaming: you can attach e.g. a record player to one speaker and have this speaker broadcast the music to other speakers. This does not involve your OwnTone server and is unrelated to AirPlay; it’s just a vendor feature.
The good news, and I only found out after buying the AudioPro speakers, is: since the most recent generation, they use specific SoCs by WiiM / Linkplay. That’s what the “W” in the model name is for. This means you can use the generic WiiM app instead of AudioPro’s (which seems to be just a rebrand / downstream version). But, more importantly, these chips have documentation, pretty good support in Home Assistant, and there are several FOSS libraries and tools to interact with them, e.g. PyWiim that allow doing almost everything that the proprietary vendor app does.2 Some people are even working on a fully Free firmware replacement for linkplay devices.
I believe this makes the AudioPro speakers an even better choice for long-term viability in a FOSS environment!
-
In theory, it would also be possible to have the server only share the music passively, and use controller software to instruct the speakers to pull from the server. But I anticipated that this would be more difficult to achieve. ↩︎
-
I’d like to note that the project seems very vibe-coded and I got bitten by a bug that they haven’t resolved for me, yet. ↩︎



Interact
💬, ❤ or ♺ on external platforms: Mastodon Bluesky Twitter/XComments (via git.fsfe.org)
Comments (via GitHub)