So, Lazyweb, I come to you for assistance. This is one of those posts where I describe what I want, I describe all the ways I’ve thought of of doing it and what’s wrong with them, you my glorious readers come up with a bunch of new ways, and then I reveal all the other conditions that I forgot to mention initially which invalidate your ideas too.
I have my fingers crossed that it’ll work better than that, though. You lot are pretty clever.
So, I have in my house a laptop running Ubuntu, a mobile phone running Meego, and a TV computer running Ubuntu and XBMC. There’s also my daughter’s mobile, running Android. We listen to music and watch TV from those devices. I would like to solve the following problems:
- My laptop speakers are a bit crap for listening to good music; I would like to play music from my laptop through some external speakers
- When I’m in the kitchen making tea, I can’t hear music being played by my phone over the noise of the kettle boiling
- I can’t hear music being played from my phone or sound from the TV computer when I’m in the shower either
- My daughter likes playing her music in the living room
- If I start playing music or an audiobook on my laptop and then go upstairs for ten minutes I’d like the music to keep playing but from speakers upstairs rather than the ones in my office
- I hate plugging cables in and out of things
- I don’t want sound to come from all speakers at once always
That’s the problem. Here are solutions I have thought of, along with why I don’t think they’re quite right.
Buy Sonos or Squeezebox gear or something similar
OK. This’d work, but I don’t want to do it. Partially my reasoning for this is that I end up locked in to whoever I go for — it means that I have to continue buying their gear forever if I want new speakers and so on — and partially because my distinct inclination here is to have the speakers be stupid. I don’t want clever speakers; the Sonos or whatever stuff tend to make the speakers be clever devices which know how to connect to Spotify themselves, and then you use the magic protocol to tell a speaker what to do. That’s a bad model; I think that the cleverness should be in the thing that streams the music (my laptop, my phone, Niamh’s phone, whatever) and the speaker is just a dumb speaker which receives audio somehow and plays it and that’s it. I don’t want to configure each speaker to talk to my music repository — a clever speaker has to itself know how to play all the music I want. It won’t very easily do, for example, error sounds from my laptop. I don’t have a Sonos client for my Nokia N9. Etc. Stupid speakers: clever devices. That’s my plan. I don’t want to have to use, for example, a special music player on my phone because that’s the music player which knows how to control a Squeezebox.
Raspberry Pi, pulseaudio, DLNA, and USB wireless audio
The idea here is that you have one computer — in my case it’d be a Raspberry Pi, because I’ve got one already — connected to the network. All the other devices — phones, laptops, whatever — stream their sound output to the RasPi, either using pulseaudio’s network stuff or by DLNA. The RasPi then has something like an Audioengine W3 USB wireless audio device plugged into it — the W3 is a USB transmitter and separate receiver, where the transmitter is a little USB dongle and the receiver is a powered box with a 3.5mm audio jack output on it. In essence, this is a USB-audio-to-headphone-jack adapter, it’s just wireless. So phones and laptops stream audio to the RasPi; the RasPi then plays audio over USB, and the W3 takes care of wirelessly sending that audio to speakers. This is a nice idea; it means that I can buy any speakers I like and as long as I plug a W3 receiver into them, they’ll work fine for this plan, and it means that any device in the house can play through the speakers as long as it can do either pulseaudio or DLNA, and I think anything I care about can. The flaw with this plan is that although a W3 can transmit to up to three speakers at once, I don’t believe that it can be paired with three speakers but only transmit to two of them. So this would play sound through all the speakers at once. I could avoid that by buying one W3 transmitter/receiver pair for each speaker (and then running a little web app on the RasPi which allows you to select which USB audio thing to output through, but that’s bloody expensive, and W3 transmitters are meant to be six inches apart which they wouldn’t be if plugged into a RasPi, even with a USB hub.
You have one RasPi, as above, which everyone streams music to. Then you have one more RasPi per speaker; the central-RasPi then pulseaudio-streams music to a chosen speaker-RasPi over wifi. This would work fine, except that the RasPi isn’t great in this sort of environment for wifi. I’m fine with the one central RasPi being wired ethernet — I can just stick it next to the router — but the speaker RasPis would need to be wireless, and that means a wireless USB dongle. Wireless dongles draw more power than the RasPis USB port can provide, which means that each speaker would need a powered hub as well, meaning that each speaker now needs its own power cable, the RasPi’s power cable, and the powered hub’s power cable. That’s a lot of messy cables. I’m sure it’d be possible to do something clever to avoid this by taking power from multiple places or doing soldering or a bunch of USB Y-cables or something, but that sounds pretty hard.
I could buy Apple AirPlay-compatible speakers. Pulseaudio can stream to them, and that’d work. I’m not very keen on this idea; open source support for Apple stuff has a habit of stopping working when Apple invent a new protocol version deliberately to break third-party support for it, it’s not at all clear how I’d stream from, say, my phone’s audiobook player to them (see above about “I don’t want to have to use a special music client”), and it means that I’m locked in to buying AirPlay stuff for ever.
So, as you can see, I’m not totally happy with any of these. If there were a wifi-capable RasPi then I’d probably go the “many RasPis” route. Failing that, I’m not really sure, so I’m coming to the Lazyweb for ideas. Tell me how you think I should do it, and I’ll happily listen!
PS. Wouldn’t it be cool if you could just buy a little box that you plug into the speaker with a 3.5mm jack cable, and if you have five of these little boxes they coordinate amongst themselves and offer one web UI to select which speakers are powered on, and one of them becomes the “leader” and appears on the network as a DLNA and pulseaudio destination and takes care of streaming to the others? That would even be doable, and they’d be sweet — it’s basically “many RasPis”, above, as a commercial product. Sounds like a thing that might go down well on Kickstarter…